Skip to content

Commit

Permalink
Fix not clearing texture in the raytrace render pass
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Sep 5, 2023
1 parent 280063a commit bbd246b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 11 deletions.
51 changes: 41 additions & 10 deletions src/lightmap/gpuraytracer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,20 +117,21 @@ 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;
cmdbuffer->bindVertexBuffers(0, 1, &sceneVertexBuffer->buffer, &offset);
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++)
{
Expand Down Expand Up @@ -169,7 +170,19 @@ void GPURaytracer::RenderAtlasImage(size_t pageIndex)
firstLight = 0;
firstVertex = 0;
BeginCommands();
beginPass();

// Begin without clear
RenderPassBegin()
.RenderPass(raytrace.renderPassBegin.get())
.RenderArea(0, 0, atlasImageSize, atlasImageSize)
.Framebuffer(img.raytrace.Framebuffer.get())
.Execute(cmdbuffer.get());

VkDeviceSize offset = 0;
cmdbuffer->bindVertexBuffers(0, 1, &sceneVertexBuffer->buffer, &offset);
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());

printf(".");

Expand Down Expand Up @@ -745,11 +758,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)
Expand All @@ -760,12 +773,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))
Expand Down Expand Up @@ -906,7 +937,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")
Expand Down
3 changes: 2 additions & 1 deletion src/lightmap/gpuraytracer.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,8 @@ class GPURaytracer
std::unique_ptr<VulkanDescriptorSetLayout> descriptorSetLayout1;
std::unique_ptr<VulkanPipelineLayout> pipelineLayout;
std::unique_ptr<VulkanPipeline> pipeline;
std::unique_ptr<VulkanRenderPass> renderPass;
std::unique_ptr<VulkanRenderPass> renderPassBegin;
std::unique_ptr<VulkanRenderPass> renderPassContinue;
std::unique_ptr<VulkanDescriptorPool> descriptorPool0;
std::unique_ptr<VulkanDescriptorPool> descriptorPool1;
std::unique_ptr<VulkanDescriptorSet> descriptorSet0;
Expand Down

0 comments on commit bbd246b

Please sign in to comment.