Объекты синхронизации

This commit is contained in:
parent 158f8c76df
commit fd4061639d
2 changed files with 39 additions and 0 deletions

View File

@ -31,6 +31,9 @@ class Vulkan
VkDeviceMemory vertexBufferMemory; // Память буфера вершин
VkBuffer indexBuffer; // Буфер индексов
VkDeviceMemory indexBufferMemory; // Память буфера индексов
std::vector<VkSemaphore> imageAvailableSemaphores; // семафор доступности изображения
std::vector<VkSemaphore> renderFinishedSemaphores; // семафор окончания рендера
std::vector<VkFence> inWorkFences; // барьер кадра в работе
// Структура для хранения флагов
struct
@ -53,6 +56,7 @@ class Vulkan
void copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size); // Копирование между буферами данных
void createVertexBuffer(); // Создание буфера вершин
void createIndexBuffer(); // Создание буфера индексов
void createSyncObjects(); // Создание объектов синхронизации
};
#endif // VK_H

View File

@ -22,6 +22,7 @@ void Vulkan::init(GLFWwindow* window)
createCommandPool(); // Создание пула команд
createVertexBuffer(); // Создание буфера вершин
createIndexBuffer(); // Создание буфера индексов
createSyncObjects(); // Создание объектов синхронизации
}
// завершение работы
@ -33,6 +34,14 @@ void Vulkan::destroy()
vkDestroyBuffer(logicalDevice, vertexBuffer, nullptr); // Уничтожение буфера вершин
vkFreeMemory(logicalDevice, vertexBufferMemory, nullptr); // Освобождение памяти буфера вершин
// Уничтожение объектов синхронизации
for (int i = 0; i < surface.imageCount; i++)
{
vkDestroySemaphore(logicalDevice, renderFinishedSemaphores[i], nullptr);
vkDestroySemaphore(logicalDevice, imageAvailableSemaphores[i], nullptr);
vkDestroyFence(logicalDevice, inWorkFences[i], nullptr);
}
vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула
vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера
@ -920,3 +929,29 @@ void Vulkan::createIndexBuffer()
vkDestroyBuffer(logicalDevice, stagingBuffer, nullptr);
vkFreeMemory(logicalDevice, stagingBufferMemory, nullptr);
}
// Создание объектов синхронизации
void Vulkan::createSyncObjects()
{
imageAvailableSemaphores.resize(surface.imageCount);
renderFinishedSemaphores.resize(surface.imageCount);
inWorkFences.resize(surface.imageCount);
VkSemaphoreCreateInfo semaphoreInfo{};
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
VkFenceCreateInfo fenceInfo{};
fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
for (int i = 0; i < surface.imageCount; i++)
{
if (vkCreateSemaphore(logicalDevice, &semaphoreInfo, nullptr, &imageAvailableSemaphores[i]) != VK_SUCCESS
|| vkCreateSemaphore(logicalDevice, &semaphoreInfo, nullptr, &renderFinishedSemaphores[i]) != VK_SUCCESS
|| vkCreateFence(logicalDevice, &fenceInfo, nullptr, &inWorkFences[i]) != VK_SUCCESS)
{
throw std::runtime_error("Unable to create synchronization objects for frame");
}
}
}