#include "VulkanWindow.hpp" #include namespace { VkRenderPass createClearRenderPass(VkDevice device, VkFormat colorFormat) { VkAttachmentDescription colorAttachment{ .format = colorFormat, .samples = VK_SAMPLE_COUNT_1_BIT, .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, .storeOp = VK_ATTACHMENT_STORE_OP_STORE, .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE, .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE, .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED, .finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, }; VkAttachmentReference colorRef{ .attachment = 0, .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, }; VkSubpassDescription subpass{ .pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS, .colorAttachmentCount = 1, .pColorAttachments = &colorRef, }; VkSubpassDependency dependency{ .srcSubpass = VK_SUBPASS_EXTERNAL, .dstSubpass = 0, .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, .srcAccessMask = 0, .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, }; VkRenderPassCreateInfo createInfo{ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .attachmentCount = 1, .pAttachments = &colorAttachment, .subpassCount = 1, .pSubpasses = &subpass, .dependencyCount = 1, .pDependencies = &dependency, }; VkRenderPass renderPass = VK_NULL_HANDLE; if (vkCreateRenderPass(device, &createInfo, nullptr, &renderPass) != VK_SUCCESS) { throw std::runtime_error("failed to create render pass"); } return renderPass; } void recordClearFrame(const VulkanWindow::FrameData& frame, VkRenderPass renderPass) { VkCommandBufferBeginInfo beginInfo{ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, }; vkBeginCommandBuffer(frame.commandBuffer, &beginInfo); VkClearValue clearColor{}; clearColor.color = {{0.12f, 0.12f, 0.14f, 1.0f}}; VkRenderPassBeginInfo renderPassInfo{ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, .renderPass = renderPass, .framebuffer = frame.frameBuffer, .renderArea = {.offset = {0, 0}, .extent = frame.extent2D}, .clearValueCount = 1, .pClearValues = &clearColor, }; vkCmdBeginRenderPass(frame.commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); vkCmdEndRenderPass(frame.commandBuffer); vkEndCommandBuffer(frame.commandBuffer); } } int main() { VulkanWindow window; VkRenderPass renderPass = createClearRenderPass(window.getDevice(), window.getRenderInfo().format); window.setRenderPass(renderPass); while (!glfwWindowShouldClose(window.getWindow())) { window.pollEvents(); const VulkanWindow::FrameData frame = window.startDrawFrame(); recordClearFrame(frame, renderPass); window.endDrawFrame(frame); } window.waitDevice(); vkDestroyRenderPass(window.getDevice(), renderPass, nullptr); return 0; }