From 522d8d89e6c5521c7c1e32c236a7821c476d09e9 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 30 Jul 2025 19:09:21 +0200 Subject: [PATCH] Fix Global SDF to properly lock static chunks access --- Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp index e0d227b6b..c8c997180 100644 --- a/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp +++ b/Source/Engine/Renderer/GlobalSignDistanceFieldPass.cpp @@ -237,6 +237,7 @@ public: OnSDFTextureDeleted(texture); // Clear static chunks cache + ConcurrentSystemLocker::WriteScope lock(Locker, true); for (auto& cascade : Cascades) cascade.StaticChunks.Clear(); } @@ -581,6 +582,7 @@ void GlobalSignDistanceFieldCustomBuffer::DrawCascadeJob(int32 cascadeIndex) if (!cascade.Dirty) return; PROFILE_CPU(); + ConcurrentSystemLocker::ReadScope lock(Locker); CurrentCascade.Set(&cascade); DrawCascadeActors(cascade); UpdateCascadeChunks(cascade); @@ -720,7 +722,6 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex } sdfData.LastFrameUsed = currentFrame; PROFILE_GPU_CPU("Global SDF"); - ConcurrentSystemLocker::WriteScope lock(sdfData.Locker); // Setup options int32 resolution, cascadesCount, resolutionMip; @@ -796,6 +797,7 @@ bool GlobalSignDistanceFieldPass::Render(RenderContext& renderContext, GPUContex Current = &sdfData; sdfData.StartDrawing(renderContext, false, reset); // (ignored if not started earlier this frame) sdfData.WaitForDrawing(); + ConcurrentSystemLocker::WriteScope lock(sdfData.Locker); // Rasterize world geometry into Global SDF bool anyDraw = false;