From beae9a3dc7ebeea0bce6a967ccedc7e5f2b33706 Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Sat, 4 Feb 2017 20:32:06 +0100 Subject: [PATCH] Stop using validcount for sprites --- src/swrenderer/scene/r_opaque_pass.cpp | 14 ++++++++++---- src/swrenderer/scene/r_opaque_pass.h | 3 +++ src/swrenderer/scene/r_scene.cpp | 16 ++++++++++++---- src/swrenderer/things/r_visiblesprite.cpp | 4 ++++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 1ee21449a..cf4155c4f 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -773,6 +773,9 @@ namespace swrenderer void RenderOpaquePass::RenderScene() { + SeenSpriteSectors.clear(); + SeenActors.clear(); + InSubsector = nullptr; RenderBSPNode(nodes + numnodes - 1); // The head node is the last node output. } @@ -824,11 +827,12 @@ namespace swrenderer // A sector might have been split into several // subsectors during BSP building. // Thus we check whether it was already added. - if (sec->touching_renderthings == nullptr || sec->validcount == validcount) + if (sec->touching_renderthings == nullptr || SeenSpriteSectors.find(sec) != SeenSpriteSectors.end()/*|| sec->validcount == validcount*/) return; // Well, now it will be done. - sec->validcount = validcount; + //sec->validcount = validcount; + SeenSpriteSectors.insert(sec); int spriteshade = LIGHT2SHADE(lightlevel + R_ActualExtraLight(foggy)); @@ -836,8 +840,10 @@ namespace swrenderer for (auto p = sec->touching_renderthings; p != nullptr; p = p->m_snext) { auto thing = p->m_thing; - if (thing->validcount == validcount) continue; - thing->validcount = validcount; + if (SeenActors.find(thing) != SeenActors.end()) continue; + SeenActors.insert(thing); + //if (thing->validcount == validcount) continue; + //thing->validcount = validcount; FIntCVar *cvar = thing->GetClass()->distancecheck; if (cvar != nullptr && *cvar >= 0) diff --git a/src/swrenderer/scene/r_opaque_pass.h b/src/swrenderer/scene/r_opaque_pass.h index fcb6a5859..6f0f06581 100644 --- a/src/swrenderer/scene/r_opaque_pass.h +++ b/src/swrenderer/scene/r_opaque_pass.h @@ -18,6 +18,7 @@ #include "r_defs.h" #include "swrenderer/line/r_line.h" #include "swrenderer/scene/r_3dfloors.h" +#include struct FVoxelDef; @@ -84,5 +85,7 @@ namespace swrenderer bool r_fakingunderwater = false; SWRenderLine renderline; + std::set SeenSpriteSectors; + std::set SeenActors; }; } diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index eeab47a7d..cdfcc8d82 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -106,9 +106,8 @@ namespace swrenderer if (CameraLight::Instance()->ShaderColormap() && viewport->RenderTarget->IsBgra() && !(r_shadercolormaps && screen->Accel2D)) { MainThread()->DrawQueue->Push(CameraLight::Instance()->ShaderColormap(), screen); + RenderDrawQueues(); } - - RenderDrawQueues(); } void RenderScene::RenderDrawQueues() @@ -120,6 +119,9 @@ namespace swrenderer queues.push_back((*it)->DrawQueue); } DrawerThreads::Execute(queues); + + //using namespace std::chrono_literals; + //std::this_thread::sleep_for(0.5s); } void RenderScene::RenderActorView(AActor *actor, bool dontmaplines) @@ -151,6 +153,7 @@ namespace swrenderer } RenderThreadSlices(); + RenderDrawQueues(); camera->renderflags = savedflags; interpolator.RestoreInterpolations(); @@ -165,7 +168,13 @@ namespace swrenderer void RenderScene::RenderThreadSlices() { - int numThreads = r_scene_multithreaded ? 8 : 1; + int numThreads = std::thread::hardware_concurrency(); + if (numThreads == 0) + numThreads = 4; + + if (!r_scene_multithreaded) + numThreads = 1; + if (numThreads != Threads.size()) { StopThreads(); @@ -327,7 +336,6 @@ namespace swrenderer viewport->SetViewport(width, height, WidescreenRatio); RenderActorView(actor, dontmaplines); - RenderDrawQueues(); viewport->RenderTarget = screen; diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index 17996b5e9..1d9111e74 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -77,6 +77,10 @@ namespace swrenderer if (x1 >= x2) return; + // Reject sprites outside the slice rendered by the thread + if (x2 < thread->X1 || x1 > thread->X2) + return; + // [RH] Sprites split behind a one-sided line can also be discarded. if (spr->sector == nullptr) return;