From 2178de0c6c440c351248dd7b908eb2ed22d3fb08 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 16 Sep 2023 05:12:31 +0200 Subject: [PATCH] - Fix VkRaytrace::Raytrace not working properly if called multiple times per frame. - Only call VkRaytrace::Raytrace once per scene --- .../rendering/vulkan/accelstructs/vk_lightmap.cpp | 13 +++++++------ .../rendering/vulkan/accelstructs/vk_lightmap.h | 1 + src/common/rendering/vulkan/vk_renderdevice.cpp | 1 + src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp index 6c7c556fa..a8cc0c17e 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.cpp @@ -61,6 +61,12 @@ void VkLightmap::SetLevelMesh(LevelMesh* level) lastSurfaceCount = 0; } +void VkLightmap::BeginFrame() +{ + lights.Pos = 0; + vertices.Pos = 0; +} + void VkLightmap::Raytrace(const TArray& surfaces) { if (surfaces.Size()) @@ -137,9 +143,6 @@ void VkLightmap::RenderBakeImage() 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()); - lights.Pos = 0; - vertices.Pos = 0; - for (int i = 0, count = selectedSurfaces.Size(); i < count; i++) { auto& selectedSurface = selectedSurfaces[i]; @@ -406,7 +409,6 @@ void VkLightmap::BlurBakeImage() void VkLightmap::CopyBakeImageResult() { uint32_t pixels = 0; - uint32_t surfacesRenderer = 0; std::set seenPages; std::vector regions; @@ -433,11 +435,10 @@ void VkLightmap::CopyBakeImageResult() seenPages.insert(surface->atlasPageIndex); pixels += surface->Area(); - surfacesRenderer++; + lastSurfaceCount++; } } - lastSurfaceCount = surfacesRenderer; lastPixelCount = pixels; totalPixelCount += pixels; diff --git a/src/common/rendering/vulkan/accelstructs/vk_lightmap.h b/src/common/rendering/vulkan/accelstructs/vk_lightmap.h index 33262b39e..37220a081 100644 --- a/src/common/rendering/vulkan/accelstructs/vk_lightmap.h +++ b/src/common/rendering/vulkan/accelstructs/vk_lightmap.h @@ -98,6 +98,7 @@ public: VkLightmap(VulkanRenderDevice* fb); ~VkLightmap(); + void BeginFrame(); void Raytrace(const TArray& surfaces); void SetLevelMesh(LevelMesh* level); diff --git a/src/common/rendering/vulkan/vk_renderdevice.cpp b/src/common/rendering/vulkan/vk_renderdevice.cpp index 3e49f7dee..78e70a93e 100644 --- a/src/common/rendering/vulkan/vk_renderdevice.cpp +++ b/src/common/rendering/vulkan/vk_renderdevice.cpp @@ -486,6 +486,7 @@ void VulkanRenderDevice::BeginFrame() for (auto& renderstate : mRenderState) renderstate->BeginFrame(); mDescriptorSetManager->BeginFrame(); + mLightmap->BeginFrame(); } void VulkanRenderDevice::Draw2D() diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 1b0a0e951..2af74f392 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -415,7 +415,7 @@ void HWDrawInfo::CreateScene(bool drawpsprites, FRenderState& state) void HWDrawInfo::UpdateLightmaps() { - if (VisibleSurfaces.Size() < unsigned(lm_background_updates)) + if (!outer && VisibleSurfaces.Size() < unsigned(lm_background_updates)) { for (auto& e : level.levelMesh->Surfaces) {