diff --git a/include/vk.h b/include/vk.h index 1119179..bfad521 100644 --- a/include/vk.h +++ b/include/vk.h @@ -31,6 +31,9 @@ class Vulkan VkDeviceMemory vertexBufferMemory; // Память буфера вершин VkBuffer indexBuffer; // Буфер индексов VkDeviceMemory indexBufferMemory; // Память буфера индексов + std::vector imageAvailableSemaphores; // семафор доступности изображения + std::vector renderFinishedSemaphores; // семафор окончания рендера + std::vector 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 \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index e766e15..31b457d 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -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"); + } + } +} +