diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp index dd7401f4f..5dc08b61d 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.cpp @@ -140,6 +140,12 @@ LevelMeshTileStats LevelMesh::GatherTilePixelStats() stats.tiles.dirty++; stats.pixels.dirty += area; } + + if (tile.AlwaysUpdate) + { + stats.tiles.dirtyDynamic++; + stats.pixels.dirtyDynamic += area; + } } stats.tiles.total += Lightmap.Tiles.Size(); return stats; diff --git a/src/common/rendering/hwrenderer/data/hw_levelmesh.h b/src/common/rendering/hwrenderer/data/hw_levelmesh.h index da26fe2a4..4859572e7 100644 --- a/src/common/rendering/hwrenderer/data/hw_levelmesh.h +++ b/src/common/rendering/hwrenderer/data/hw_levelmesh.h @@ -250,7 +250,7 @@ struct LevelMeshTileStats { struct Stats { - uint32_t total = 0, dirty = 0; + uint32_t total = 0, dirty = 0, dirtyDynamic = 0; }; Stats tiles, pixels; diff --git a/src/playsim/a_dynlight.cpp b/src/playsim/a_dynlight.cpp index 79b157575..e882268b6 100644 --- a/src/playsim/a_dynlight.cpp +++ b/src/playsim/a_dynlight.cpp @@ -78,7 +78,11 @@ static void MarkTilesForUpdate(FLevelLocals * Level, const TArrayView &tile { if(i >= 0) { - Level->levelMesh->Lightmap.Tiles[i].NeedsUpdate = true; + auto &tile = Level->levelMesh->Lightmap.Tiles[i]; + if(tile.AlwaysUpdate == 0 && !tile.NeedsUpdate) + { + tile.AlwaysUpdate = 3; + } } } } diff --git a/src/rendering/hwrenderer/doom_levelmesh.cpp b/src/rendering/hwrenderer/doom_levelmesh.cpp index aaa634c4d..200c5996c 100644 --- a/src/rendering/hwrenderer/doom_levelmesh.cpp +++ b/src/rendering/hwrenderer/doom_levelmesh.cpp @@ -75,15 +75,15 @@ ADD_STAT(lightmap) int indexBufferUsed = levelMesh->FreeLists.Index.GetUsedSize(); out.Format( - "Surfaces: %u (awaiting updates: %u)\n" - "Surface pixel area to update: %u\n" + "Surfaces: %u (awaiting updates: %u static, %u dynamic)\n" + "Surface pixel area to update: %u static, %u dynamic\n" "Surface pixel area: %u\nAtlas pixel area: %u\n" "Atlas efficiency: %.4f%%\n" "Dynamic BLAS time: %2.3f ms\n" "Level mesh process time: %2.3f ms\n" "Level mesh index buffer: %d K used (%d%%)", - stats.tiles.total, stats.tiles.dirty, - stats.pixels.dirty, + stats.tiles.total, stats.tiles.dirty, stats.tiles.dirtyDynamic, + stats.pixels.dirty, stats.pixels.dirtyDynamic, stats.pixels.total, atlasPixelCount, float(stats.pixels.total) / float(atlasPixelCount) * 100.0f, diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp index 133789533..b18664850 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp @@ -139,6 +139,7 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni Coronas.Clear(); Fogballs.Clear(); VisibleTiles.Clear(); + visibleDyn = 0; vpIndex = 0; // Fullbright information needs to be propagated from the main view. diff --git a/src/rendering/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h index 4cfcbdd63..964a49cb9 100644 --- a/src/rendering/hwrenderer/scene/hw_drawinfo.h +++ b/src/rendering/hwrenderer/scene/hw_drawinfo.h @@ -158,6 +158,7 @@ struct HWDrawInfo TArray Coronas; TArray Fogballs; TArray VisibleTiles; + unsigned visibleDyn; uint64_t LastFrameTime = 0; TArray MissingUpperTextures; @@ -243,8 +244,15 @@ public: if (lm_always_update || tile->AlwaysUpdate == 2 || (tile->AlwaysUpdate == 1 && lm_dynamic)) { tile->NeedsUpdate = true; + visibleDyn++; } - else if (VisibleTiles.Size() >= unsigned(lm_max_updates)) + else if(tile->AlwaysUpdate == 3 && lm_dynamic) + { + tile->AlwaysUpdate = 0; + tile->NeedsUpdate = true; + visibleDyn++; + } + else if ((VisibleTiles.Size() - visibleDyn) >= unsigned(lm_max_updates)) { return; }