diff --git a/include/vk.h b/include/vk.h index e09ae03..5eddab3 100644 --- a/include/vk.h +++ b/include/vk.h @@ -22,6 +22,7 @@ class Vulkan VkSwapchainKHR swapChain; // Список показа std::vector swapChainImages; // Изображения из списка показа std::vector swapChainImageViews; // Информация об изображениях из списка показа + VkRenderPass renderPass; // Проходы рендера // Структура для хранения флагов struct @@ -36,6 +37,7 @@ class Vulkan void createLogicalDevice(std::vector &deviceExtensions); // Создание логического устройства void createWindowSurface(GLFWwindow* window); // Создание поверхности окна void createSwapchain(GLFWwindow* window); // Создание цепочки показа + void createRenderpass(); // Создание проходов рендера }; #endif // VK_H \ No newline at end of file diff --git a/src/vk.cpp b/src/vk.cpp index e939c8c..8a4ed9a 100644 --- a/src/vk.cpp +++ b/src/vk.cpp @@ -16,11 +16,14 @@ void Vulkan::init(GLFWwindow* window) selectPhysicalDevice(deviceExtensions); // Выбор физического устройства createLogicalDevice(deviceExtensions); // Создание физического устройства createSwapchain(window); // Создание списка показа + createRenderpass(); // Создание проходов рендера } // завершение работы void Vulkan::destroy() { + vkDestroyRenderPass(logicalDevice, renderPass, nullptr); + // Уничтожение информации о изображениях списка показа for (auto & imageView : swapChainImageViews) { @@ -460,3 +463,54 @@ void Vulkan::createSwapchain(GLFWwindow* window) } } } + +// Создание проходов рендера +void Vulkan::createRenderpass() +{ + // Информация о прикреплении + VkAttachmentDescription colorAttachment{}; + colorAttachment.format = surface.selectedFormat.format; + colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT; + colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + + // Информация о выходном прикреплении + VkAttachmentReference colorAttachmentRef{}; + colorAttachmentRef.attachment = 0; + colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + // Информация о подпроходе + VkSubpassDescription subpass{}; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.colorAttachmentCount = 1; + subpass.pColorAttachments = &colorAttachmentRef; + + // Зависимости подпрохода + VkSubpassDependency dependency{}; + dependency.srcSubpass = VK_SUBPASS_EXTERNAL; + dependency.dstSubpass = 0; + dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.srcAccessMask = 0; + dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + + // Информация о создаваемом проходе рендера + VkRenderPassCreateInfo renderPassInfo{}; + renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + renderPassInfo.attachmentCount = 1; + renderPassInfo.pAttachments = &colorAttachment; + renderPassInfo.subpassCount = 1; + renderPassInfo.pSubpasses = &subpass; + renderPassInfo.dependencyCount = 1; + renderPassInfo.pDependencies = &dependency; + + // Создание проходов рендера + if (vkCreateRenderPass(logicalDevice, &renderPassInfo, nullptr, &renderPass) != VK_SUCCESS) + { + throw std::runtime_error("Unable to create render pass"); + } +}