From fd4061639d17d2249decb84ae351b279cf717c74 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Mon, 14 Mar 2022 18:14:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 4 ++++ src/vk.cpp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) 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"); + } + } +} +