From f279fa69f4c02d34790332bcb84b8f0771bf63e3 Mon Sep 17 00:00:00 2001 From: RaveYard <29225776+MrRaveYard@users.noreply.github.com> Date: Sat, 9 Sep 2023 17:42:57 +0200 Subject: [PATCH] WIP refactoring of surface gathering --- .../hwrenderer/data/hw_renderstate.h | 29 ++++++++++-- src/rendering/hwrenderer/hw_entrypoint.cpp | 46 +++++++++++-------- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_renderstate.h b/src/common/rendering/hwrenderer/data/hw_renderstate.h index 97ffba4b06..5b5fa72fac 100644 --- a/src/common/rendering/hwrenderer/data/hw_renderstate.h +++ b/src/common/rendering/hwrenderer/data/hw_renderstate.h @@ -10,6 +10,8 @@ #include "hw_viewpointuniforms.h" #include "hw_cvars.h" +#include + EXTERN_CVAR(Int, lm_max_updates); struct FColormap; @@ -260,13 +262,17 @@ protected: EPassType mPassType = NORMAL_PASS; - TArray mActiveLightmapSurfaces; + std::atomic mActiveLightmapSurfaceBufferIndex; + TArray mActiveLightmapSurfacesBuffer; public: uint64_t firstFrame = 0; void Reset() { + mActiveLightmapSurfaceBufferIndex = { 0 }; + mActiveLightmapSurfacesBuffer.Resize(lm_max_updates); + mTextureEnabled = true; mBrightmapEnabled = mGradientEnabled = mFogEnabled = mGlowEnabled = false; mFogColor = 0xffffffff; @@ -735,18 +741,31 @@ public: inline void PushVisibleSurface(int surfaceIndex, LevelMeshSurface* surface) { - if(surface->needsUpdate && mActiveLightmapSurfaces.Size() < unsigned(lm_max_updates) && mActiveLightmapSurfaces.Find(surfaceIndex) >= mActiveLightmapSurfaces.Size()) // yikes, how awful - mActiveLightmapSurfaces.Push(surfaceIndex); + if (surface->needsUpdate) // TODO atomic? + { + int index = mActiveLightmapSurfaceBufferIndex.fetch_add(1); + if (index < mActiveLightmapSurfacesBuffer.Size()) + { + mActiveLightmapSurfacesBuffer[index] = surfaceIndex; + surface->needsUpdate = false; + } + } } inline auto& GetVisibleSurfaceList() { - return mActiveLightmapSurfaces; + return mActiveLightmapSurfacesBuffer; + } + + inline unsigned GetVisibleSurfaceListCount() const + { + return mActiveLightmapSurfaceBufferIndex; } inline void ClearVisibleSurfaceList() { - mActiveLightmapSurfaces.Clear(); + mActiveLightmapSurfacesBuffer.Resize(lm_max_updates); + mActiveLightmapSurfaceBufferIndex = 0; } // API-dependent render interface diff --git a/src/rendering/hwrenderer/hw_entrypoint.cpp b/src/rendering/hwrenderer/hw_entrypoint.cpp index 5c9d50e649..9d434ae8ad 100644 --- a/src/rendering/hwrenderer/hw_entrypoint.cpp +++ b/src/rendering/hwrenderer/hw_entrypoint.cpp @@ -97,6 +97,33 @@ void CollectLights(FLevelLocals* Level) } } +void UpdateLightmaps(DFrameBuffer* screen, FRenderState& RenderState) +{ + + // Lightmapping stuff + auto& list = RenderState.GetVisibleSurfaceList(); + auto size = RenderState.GetVisibleSurfaceListCount(); + + list.Resize(min(list.Size(), unsigned(size))); + + if (size < lm_background_updates) + { + int index = 0; + for (auto& e : level.levelMesh->Surfaces) + { + if (e.needsUpdate) + { + list.Push(index); + + if (list.Size() >= lm_background_updates) + break; + } + ++index; + } + } + + screen->UpdateLightmaps(list); +} //----------------------------------------------------------------------------- // @@ -199,24 +226,7 @@ sector_t* RenderViewpoint(FRenderViewpoint& mainvp, AActor* camera, IntRect* bou screen->NextEye(eyeCount); } - auto& list = RenderState.GetVisibleSurfaceList(); - if (list.Size() < lm_background_updates) - { - int index = 0; - for (auto& e : level.levelMesh->Surfaces) - { - if (e.needsUpdate) - { - list.Push(index); - - if(list.Size() >= lm_background_updates) - break; - } - ++index; - } - } - - screen->UpdateLightmaps(list); + UpdateLightmaps(screen, RenderState); return mainvp.sector; }