From 2cb9a75dc7118486c33d387871ca98bb30c26678 Mon Sep 17 00:00:00 2001 From: gramanas Date: Tue, 21 May 2024 21:17:06 +0300 Subject: Dynamic rendering --- src/game.c | 188 +++++++++++++++++++++++++++---------------------------------- 1 file changed, 84 insertions(+), 104 deletions(-) (limited to 'src/game.c') diff --git a/src/game.c b/src/game.c index 4b0ea22..c566f85 100644 --- a/src/game.c +++ b/src/game.c @@ -891,11 +891,17 @@ vulkan_create_graphics_pipeline() vk_log(VK_ERROR, "failed to create pipeline layout!\n"); } + VkPipelineRenderingCreateInfo pipeline_rendering_create_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR, + .colorAttachmentCount = 1, + .pColorAttachmentFormats = &s.vk_swap_chain_image_format, + }; VkGraphicsPipelineCreateInfo pipelineInfo = {0}; pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; pipelineInfo.stageCount = 2; pipelineInfo.pStages = shaderStages; + pipelineInfo.pNext = &pipeline_rendering_create_info, pipelineInfo.pVertexInputState = &vertexInputInfo; pipelineInfo.pInputAssemblyState = &inputAssembly; pipelineInfo.pViewportState = &viewportState; @@ -905,7 +911,7 @@ vulkan_create_graphics_pipeline() pipelineInfo.pColorBlendState = &colorBlending; pipelineInfo.pDynamicState = &dynamicState; pipelineInfo.layout = s.vk_pipeline_layout; - pipelineInfo.renderPass = s.vk_render_pass; + pipelineInfo.renderPass = VK_NULL_HANDLE; pipelineInfo.subpass = 0; pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional pipelineInfo.basePipelineIndex = -1; // Optional @@ -925,72 +931,6 @@ vulkan_create_graphics_pipeline() vkDestroyShaderModule(s.vk_device, vertShaderModule, NULL); } -void -vulkan_create_render_pass() -{ - VkAttachmentDescription colorAttachment = {0}; - colorAttachment.format = s.vk_swap_chain_image_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 = {0}; - colorAttachmentRef.attachment = 0; - colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkSubpassDescription subpass = {0}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &colorAttachmentRef; - - VkSubpassDependency dependency = {0}; - 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 = {0}; - 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(s.vk_device, &renderPassInfo, NULL, &s.vk_render_pass) != VK_SUCCESS) { - vk_log(VK_ERROR, "failed to create render pass!\n"); - } -} - -void -vulkan_create_framebuffers() -{ - s.vk_swap_chain_framebuffers_count = s.vk_swap_chain_image_count; - for (size_t i = 0; i < s.vk_swap_chain_image_count; i++) { - VkImageView attachments[] = { - s.vk_swap_chain_image_views[i] - }; - - VkFramebufferCreateInfo framebufferInfo = {0}; - framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - framebufferInfo.renderPass = s.vk_render_pass; - framebufferInfo.attachmentCount = 1; - framebufferInfo.pAttachments = attachments; - framebufferInfo.width = s.vk_swap_chain_extent.width; - framebufferInfo.height = s.vk_swap_chain_extent.height; - framebufferInfo.layers = 1; - - VK_CHECK(vkCreateFramebuffer(s.vk_device, &framebufferInfo, NULL, &s.vk_swap_chain_framebuffers[i])); - } -} - void vulkan_create_command_pool() { @@ -1029,38 +969,53 @@ recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) VK_CHECK(vkBeginCommandBuffer(commandBuffer, &beginInfo)); - VkRenderPassBeginInfo renderPassInfo = {0}; - renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - renderPassInfo.renderPass = s.vk_render_pass; - renderPassInfo.framebuffer = s.vk_swap_chain_framebuffers[imageIndex]; - renderPassInfo.renderArea.offset = (VkOffset2D){0, 0}; - renderPassInfo.renderArea.extent = s.vk_swap_chain_extent; + VkImageMemoryBarrier image_memory_barrier = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, + .newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .image = s.vk_swap_chain_images[imageIndex], + .subresourceRange = (VkImageSubresourceRange){ + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + } + }; + + vkCmdPipelineBarrier( + commandBuffer, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, // srcStageMask + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // dstStageMask + 0, + 0, + NULL, + 0, + NULL, + 1, // imageMemoryBarrierCount + &image_memory_barrier // pImageMemoryBarriers + ); VkClearValue clearColor = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; - renderPassInfo.clearValueCount = 1; - renderPassInfo.pClearValues = &clearColor; // TODO DYNAMIC RENDERING - /* VkRenderingAttachmentInfo colorAttachment = {}; */ - /* colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; */ - /* colorAttachment.imageView = s.vk_swap_chain_image_views[imageIndex]; */ - /* colorAttachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; */ - /* colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; */ - /* colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; */ - /* //colorAttachment.clearValue.color = clearColor; */ - - /* VkRenderingInfo renderingInfo = {}; */ - /* renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; */ - /* renderingInfo.renderArea = (VkRect2D){ {0, 0}, {(float)(s.vk_swap_chain_extent.width), (float)(s.vk_swap_chain_extent.height)} }; */ - /* renderingInfo.layerCount = 1; */ - /* renderingInfo.colorAttachmentCount = 1; */ - /* renderingInfo.pColorAttachments = &colorAttachment; */ - - /* vkCmdBeginRendering(commandBuffer, &renderingInfo); */ - /* .... */ - /* vkCmdEndRendering(commandBuffer); */ - - vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); + VkRenderingAttachmentInfo colorAttachment = {}; + colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; + colorAttachment.imageView = s.vk_swap_chain_image_views[imageIndex]; + colorAttachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + //colorAttachment.clearValue.color = clearColor; + + VkRenderingInfo renderingInfo = {}; + renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; + renderingInfo.renderArea = (VkRect2D){ {0, 0}, {(float)(s.vk_swap_chain_extent.width), (float)(s.vk_swap_chain_extent.height)} }; + renderingInfo.layerCount = 1; + renderingInfo.colorAttachmentCount = 1; + renderingInfo.pColorAttachments = &colorAttachment; + + vkCmdBeginRendering(commandBuffer, &renderingInfo); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, s.vk_graphics_pipeline); @@ -1085,8 +1040,40 @@ recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, s.vk_pipeline_layout, 0, 1, &s.frames[currentFrame].vk_descriptor_set, 0, NULL); vkCmdDrawIndexed(commandBuffer, INDICES_SIZE, 1, 0, 0, 0); - - vkCmdEndRenderPass(commandBuffer); + vkCmdEndRendering(commandBuffer); + + /* vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); */ + + + /* vkCmdEndRenderPass(commandBuffer); */ + + VkImageMemoryBarrier image_memory_barrier2 = { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, + .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + .oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + .image = s.vk_swap_chain_images[imageIndex], + .subresourceRange = (VkImageSubresourceRange){ + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + } + }; + + vkCmdPipelineBarrier( + commandBuffer, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // srcStageMask + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // dstStageMask + 0, + 0, + NULL, + 0, + NULL, + 1, // imageMemoryBarrierCount + &image_memory_barrier2 // pImageMemoryBarriers + ); VK_CHECK(vkEndCommandBuffer(commandBuffer)); } @@ -1339,9 +1326,6 @@ vulkan_create_descriptor_sets() void cleanupSwapChain() { - for (size_t i = 0; i < s.vk_swap_chain_image_count; i++) { - vkDestroyFramebuffer(s.vk_device, s.vk_swap_chain_framebuffers[i], NULL); - } for (uint32_t i = 0; i < s.vk_swap_chain_image_count; i++) { vkDestroyImageView(s.vk_device, s.vk_swap_chain_image_views[i], NULL); } @@ -1357,7 +1341,6 @@ recreateSwapChain() vulkan_create_swap_chain(); vulkan_create_image_views(); - vulkan_create_framebuffers(); } void @@ -1447,10 +1430,8 @@ init_vulkan() vulkan_create_logical_device(); vulkan_create_swap_chain(); vulkan_create_image_views(); - vulkan_create_render_pass(); vulkan_create_descriptor_set_layout(); vulkan_create_graphics_pipeline(); - vulkan_create_framebuffers(); vulkan_create_command_pool(); vulkan_create_vertex_buffer(); vulkan_create_index_buffer(); @@ -1490,7 +1471,6 @@ close_vulkan() vkFreeMemory(s.vk_device, s.vk_index_buffer_memory, NULL); vkDestroyPipeline(s.vk_device, s.vk_graphics_pipeline, NULL); - vkDestroyRenderPass(s.vk_device, s.vk_render_pass, NULL); vkDestroyPipelineLayout(s.vk_device, s.vk_pipeline_layout, NULL); vkDestroyDevice(s.vk_device, NULL); vkDestroySurfaceKHR(s.vk_instance, s.vk_surface, NULL); -- cgit v1.2.3