From bdb35e5e8602120a2e98874680b3df85471c6a02 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 11 Feb 2021 08:53:37 +0100 Subject: [PATCH] Fix some r_scene_multithreaded crashes --- src/rendering/swrenderer/plane/r_skyplane.cpp | 9 ++++----- src/rendering/swrenderer/r_renderthread.cpp | 9 +++++++++ src/rendering/swrenderer/r_renderthread.h | 3 +++ src/rendering/swrenderer/scene/r_scene.cpp | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/rendering/swrenderer/plane/r_skyplane.cpp b/src/rendering/swrenderer/plane/r_skyplane.cpp index cb1069913..4027c6401 100644 --- a/src/rendering/swrenderer/plane/r_skyplane.cpp +++ b/src/rendering/swrenderer/plane/r_skyplane.cpp @@ -59,8 +59,6 @@ CVAR(Bool, r_linearsky, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); EXTERN_CVAR(Int, r_skymode) EXTERN_CVAR(Bool, cl_oldfreelooklimit) -std::pair& R_GetSkyCapColor(FGameTexture* tex); - namespace swrenderer { static FSoftwareTexture *GetSWTex(FTextureID texid, bool allownull = true) @@ -255,6 +253,8 @@ namespace swrenderer angle1 = UMulScale16(ang, frontcyl) + frontpos; angle2 = UMulScale16(ang, backcyl) + backpos; + auto skycapcolors = Thread->GetSkyCapColor(frontskytex); + drawerargs.SetFrontTexture(Thread, frontskytex, angle1); drawerargs.SetBackTexture(Thread, backskytex, angle2); drawerargs.SetTextureVStep(uv_step); @@ -262,9 +262,8 @@ namespace swrenderer drawerargs.SetDest(viewport, start_x, y1); drawerargs.SetCount(y2 - y1); drawerargs.SetFadeSky(r_skymode == 2 && !(Level->flags & LEVEL_FORCETILEDSKY)); - auto& col = R_GetSkyCapColor(frontskytex->GetTexture()); - drawerargs.SetSolidTop(col.first); - drawerargs.SetSolidBottom(col.second); + drawerargs.SetSolidTop(skycapcolors.first); + drawerargs.SetSolidBottom(skycapcolors.second); if (!backskytex) drawerargs.DrawSingleSkyColumn(Thread); diff --git a/src/rendering/swrenderer/r_renderthread.cpp b/src/rendering/swrenderer/r_renderthread.cpp index 4226a719a..5dac0c11b 100644 --- a/src/rendering/swrenderer/r_renderthread.cpp +++ b/src/rendering/swrenderer/r_renderthread.cpp @@ -55,6 +55,8 @@ #include "r_memory.h" #include "common/rendering/polyrenderer/drawers/poly_thread.h" +std::pair& R_GetSkyCapColor(FGameTexture* tex); + namespace swrenderer { RenderThread::RenderThread(RenderScene *scene, bool mainThread) @@ -120,6 +122,13 @@ namespace swrenderer } } + std::pair RenderThread::GetSkyCapColor(FSoftwareTexture* tex) + { + std::unique_lock lock(loadmutex); + std::pair colors = R_GetSkyCapColor(tex->GetTexture()); + return colors; + } + static std::mutex polyobjmutex; void RenderThread::PreparePolyObject(subsector_t *sub) { diff --git a/src/rendering/swrenderer/r_renderthread.h b/src/rendering/swrenderer/r_renderthread.h index 94ed851d8..325b8ffa1 100644 --- a/src/rendering/swrenderer/r_renderthread.h +++ b/src/rendering/swrenderer/r_renderthread.h @@ -92,6 +92,9 @@ namespace swrenderer // Setup poly object in a threadsafe manner void PreparePolyObject(subsector_t *sub); + + // Retrieve skycap color in a threadsafe way + std::pair GetSkyCapColor(FSoftwareTexture* tex); private: std::unique_ptr tc_drawers; diff --git a/src/rendering/swrenderer/scene/r_scene.cpp b/src/rendering/swrenderer/scene/r_scene.cpp index 3bbc06cb1..3f1d85898 100644 --- a/src/rendering/swrenderer/scene/r_scene.cpp +++ b/src/rendering/swrenderer/scene/r_scene.cpp @@ -66,7 +66,7 @@ void PeekThreadedErrorPane(); EXTERN_CVAR(Int, r_clearbuffer) EXTERN_CVAR(Int, r_debug_draw) -CVAR(Int, r_scene_multithreaded, 0, 0); +CVAR(Int, r_scene_multithreaded, 1, 0); CVAR(Bool, r_models, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); bool r_modelscene = false;