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"); + } + } +}