diff --git a/src/lightmap/gpuraytracer.cpp b/src/lightmap/gpuraytracer.cpp index 3da56e4..d0a53b2 100644 --- a/src/lightmap/gpuraytracer.cpp +++ b/src/lightmap/gpuraytracer.cpp @@ -117,11 +117,13 @@ void GPURaytracer::RenderAtlasImage(size_t pageIndex) { LightmapImage& img = atlasImages[pageIndex]; - const auto beginPass = [&]() { + // Begin with clear + { RenderPassBegin() - .RenderPass(raytrace.renderPass.get()) + .RenderPass(raytrace.renderPassBegin.get()) .RenderArea(0, 0, atlasImageSize, atlasImageSize) .Framebuffer(img.raytrace.Framebuffer.get()) + .AddClearColor(0.0f, 0.0f, 0.0f, 0.0f) .Execute(cmdbuffer.get()); VkDeviceSize offset = 0; @@ -129,8 +131,7 @@ void GPURaytracer::RenderAtlasImage(size_t pageIndex) cmdbuffer->bindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipeline.get()); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 0, raytrace.descriptorSet0.get()); cmdbuffer->bindDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, raytrace.pipelineLayout.get(), 1, raytrace.descriptorSet1.get()); - }; - beginPass(); + } for (size_t i = 0; i < mesh->surfaces.size(); i++) { @@ -169,7 +170,13 @@ void GPURaytracer::RenderAtlasImage(size_t pageIndex) firstLight = 0; firstVertex = 0; BeginCommands(); - beginPass(); + + // Begin without clear + RenderPassBegin() + .RenderPass(raytrace.renderPassContinue.get()) + .RenderArea(0, 0, atlasImageSize, atlasImageSize) + .Framebuffer(img.raytrace.Framebuffer.get()) + .Execute(cmdbuffer.get()); printf("."); @@ -745,11 +752,11 @@ void GPURaytracer::CreateRaytracePipeline() .DebugName("raytrace.pipelineLayout") .Create(device.get()); - raytrace.renderPass = RenderPassBuilder() + raytrace.renderPassBegin = RenderPassBuilder() .AddAttachment( VK_FORMAT_R16G16B16A16_SFLOAT, VK_SAMPLE_COUNT_4_BIT, - VK_ATTACHMENT_LOAD_OP_DONT_CARE, + VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) @@ -760,12 +767,30 @@ void GPURaytracer::CreateRaytracePipeline() VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) - .DebugName("raytrace.renderpass") + .DebugName("raytrace.renderPassBegin") + .Create(device.get()); + + raytrace.renderPassContinue = RenderPassBuilder() + .AddAttachment( + VK_FORMAT_R16G16B16A16_SFLOAT, + VK_SAMPLE_COUNT_4_BIT, + VK_ATTACHMENT_LOAD_OP_LOAD, + VK_ATTACHMENT_STORE_OP_STORE, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) + .AddSubpass() + .AddSubpassColorAttachmentRef(0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) + .AddExternalSubpassDependency( + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT) + .DebugName("raytrace.renderPassContinue") .Create(device.get()); raytrace.pipeline = GraphicsPipelineBuilder() .Layout(raytrace.pipelineLayout.get()) - .RenderPass(raytrace.renderPass.get()) + .RenderPass(raytrace.renderPassBegin.get()) .AddVertexShader(vertShader.get()) .AddFragmentShader(fragShader.get()) .AddVertexBufferBinding(0, sizeof(SceneVertex)) @@ -906,7 +931,7 @@ LightmapImage GPURaytracer::CreateImage(int width, int height) .Create(device.get()); img.raytrace.Framebuffer = FramebufferBuilder() - .RenderPass(raytrace.renderPass.get()) + .RenderPass(raytrace.renderPassBegin.get()) .Size(width, height) .AddAttachment(img.raytrace.View.get()) .DebugName("LightmapImage.raytrace.Framebuffer") diff --git a/src/lightmap/gpuraytracer.h b/src/lightmap/gpuraytracer.h index d749e5a..88522af 100644 --- a/src/lightmap/gpuraytracer.h +++ b/src/lightmap/gpuraytracer.h @@ -197,7 +197,8 @@ private: std::unique_ptr descriptorSetLayout1; std::unique_ptr pipelineLayout; std::unique_ptr pipeline; - std::unique_ptr renderPass; + std::unique_ptr renderPassBegin; + std::unique_ptr renderPassContinue; std::unique_ptr descriptorPool0; std::unique_ptr descriptorPool1; std::unique_ptr descriptorSet0;