From 7310ab61591a3405f31c786aa1d2a2b46be1a72a Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Mon, 14 Mar 2022 18:23:08 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B1=D1=83=D1=84=D0=B5=D1=80=D0=BE=D0=B2=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=B4=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/vk.h | 2 ++ src/vk.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/include/vk.h b/include/vk.h index bfad521..dcfefef 100644 --- a/include/vk.h +++ b/include/vk.h @@ -22,6 +22,7 @@ class Vulkan VkSwapchainKHR swapChain; // Список показа std::vector swapChainImages; // Изображения из списка показа std::vector swapChainImageViews; // Информация об изображениях из списка показа + std::vector swapChainFramebuffers; // Буферы кадра из списка показа VkRenderPass renderPass; // Проходы рендера VkPipelineLayout pipelineLayout; // Раскладка конвейера VkPipeline graphicsPipeline; // Графический конвейер @@ -57,6 +58,7 @@ class Vulkan void createVertexBuffer(); // Создание буфера вершин void createIndexBuffer(); // Создание буфера индексов void createSyncObjects(); // Создание объектов синхронизации + void createFramebuffers(); // Создание буферов кадра }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index b095eac..391ed1a 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -18,6 +18,7 @@ void Vulkan::init(GLFWwindow* window) createLogicalDevice(deviceExtensions); // Создание физического устройства createSwapchain(window); // Создание списка показа createRenderpass(); // Создание проходов рендера + createFramebuffers(); // Создание буферов кадра createGraphicPipeline(); // Создание графического конвейера createCommandPool(); // Создание пула команд createVertexBuffer(); // Создание буфера вершин @@ -46,6 +47,12 @@ void Vulkan::destroy() vkDestroyCommandPool(logicalDevice, commandPool, nullptr); // Уничтожение командного пула + // Уничтожение буферов кадра + for (auto framebuffer : swapChainFramebuffers) + { + vkDestroyFramebuffer(logicalDevice, framebuffer, nullptr); + } + vkDestroyPipeline(logicalDevice, graphicsPipeline, nullptr); // Уничтожение графического конвейера vkDestroyPipelineLayout(logicalDevice, pipelineLayout, nullptr); // Уничтожение раскладки графического конвейера vkDestroyRenderPass(logicalDevice, renderPass, nullptr); // Уничтожение проходов рендера @@ -957,3 +964,30 @@ void Vulkan::createSyncObjects() } } +// Создание буферов кадра +void Vulkan::createFramebuffers() +{ + // Зададим размер массива в соответствии с количеством изображений + swapChainFramebuffers.resize(swapChainImageViews.size()); + // Для каждого изображения из списка показа + for (int i = 0; i < swapChainImageViews.size(); i++) + { + // Изображения используемые в буфере кадра + VkImageView attachments[] = { swapChainImageViews[i] }; + // Заполним данные о создаваемом буфере кадра + VkFramebufferCreateInfo framebufferInfo{}; + framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + framebufferInfo.renderPass = renderPass; + framebufferInfo.attachmentCount = 1; + framebufferInfo.pAttachments = attachments; + framebufferInfo.width = surface.selectedExtent.width; + framebufferInfo.height = surface.selectedExtent.height; + framebufferInfo.layers = 1; + + // Создание буфера кадра + if (vkCreateFramebuffer(logicalDevice, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) + { + throw std::runtime_error("Unable to create framebuffer"); + } + } +}