From 00e200559aa72dfd43b6a5d9a85e830fd6083800 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 29 May 2025 04:22:14 +0200 Subject: [PATCH] Fix crash for uneven core count and clock the draw times --- src/rendering/hwrenderer/scene/hw_drawinfo.cpp | 10 ++++++---- src/rendering/hwrenderer/scene/hw_visibleset.cpp | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 0c3d31b16..8f3fdb1b8 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -453,15 +453,13 @@ void HWDrawInfo::RenderPVS(bool drawpsprites, FRenderState& state) multithread = false; uselevelmesh = true; - ClipWall.Clock(); + Bsp.Clock(); + ClipWall.Clock(); static HWVisibleSetThreads threads; threads.FindPVS(this); - ClipWall.Unclock(); - Bsp.Clock(); - if (!gl_levelmesh) // Update sector heights for the non-levelmesh rendering of sectors { for (int sectorIndex : SeenSectors.Get()) @@ -830,14 +828,18 @@ void HWDrawInfo::RenderScene(FRenderState &state) void HWDrawInfo::DrawSeenSides(FRenderState& state, LevelMeshDrawType drawType, bool noFragmentShader) { + RenderWall.Clock(); for (int sideIndex : SeenSides.Get()) level.levelMesh->DrawSide(state, sideIndex, drawType, noFragmentShader); + RenderWall.Unclock(); } void HWDrawInfo::DrawSeenFlats(FRenderState& state, LevelMeshDrawType drawType, bool noFragmentShader) { + RenderFlat.Clock(); for (int sectorIndex : SeenSectors.Get()) level.levelMesh->DrawSector(state, sectorIndex, drawType, noFragmentShader); + RenderFlat.Unclock(); } //----------------------------------------------------------------------------- diff --git a/src/rendering/hwrenderer/scene/hw_visibleset.cpp b/src/rendering/hwrenderer/scene/hw_visibleset.cpp index 6e09fe17d..ef45da4f9 100644 --- a/src/rendering/hwrenderer/scene/hw_visibleset.cpp +++ b/src/rendering/hwrenderer/scene/hw_visibleset.cpp @@ -611,7 +611,7 @@ void HWVisibleSetThreads::WorkerMain(int sliceIndex) bool isLeft = sliceIndex % 2 == 0; int left = isLeft ? sliceIndex : sliceIndex - 1; int right = isLeft ? sliceIndex + 1 : sliceIndex; - if ((isLeft && !WorkFlags[right]) || (!isLeft && !WorkFlags[left])) + if (right < SliceCount && ((isLeft && !WorkFlags[right]) || (!isLeft && !WorkFlags[left]))) { // Other side is also done. Merge results. lock.unlock();