From 14f9c63cd714c9cc06f7be5be34a04862bd63fee Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Tue, 8 May 2018 22:22:15 +0200 Subject: [PATCH] - added r_debug_draw that shows how the software renderer composes its scene (cherry picked from commit 459f748c4e34bfa35f132bfaaa610b74ca9964bb) --- src/swrenderer/drawers/r_thread.cpp | 34 +++++++++++++++++++++++++++-- src/swrenderer/drawers/r_thread.h | 6 +++++ src/swrenderer/scene/r_scene.cpp | 4 +++- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/swrenderer/drawers/r_thread.cpp b/src/swrenderer/drawers/r_thread.cpp index 57d86ab9b..32e73683a 100644 --- a/src/swrenderer/drawers/r_thread.cpp +++ b/src/swrenderer/drawers/r_thread.cpp @@ -40,6 +40,7 @@ void PeekThreadedErrorPane(); #endif CVAR(Bool, r_multithreaded, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); +CVAR(Int, r_debug_draw, 0, 0); ///////////////////////////////////////////////////////////////////////////// @@ -76,6 +77,23 @@ void DrawerThreads::Execute(DrawerCommandQueuePtr commands) queue->start_condition.notify_all(); } +void DrawerThreads::ResetDebugDrawPos() +{ + auto queue = Instance(); + std::unique_lock start_lock(queue->start_mutex); + bool reached_end = false; + for (auto &thread : queue->threads) + { + if (thread.debug_draw_pos + r_debug_draw * 60 * 2 < queue->debug_draw_end) + reached_end = true; + thread.debug_draw_pos = 0; + } + if (!reached_end) + queue->debug_draw_end += r_debug_draw; + else + queue->debug_draw_end = 0; +} + void DrawerThreads::WaitForWorkers() { using namespace std::chrono_literals; @@ -124,9 +142,21 @@ void DrawerThreads::WorkerMain(DrawerThread *thread) start_lock.unlock(); // Do the work: - for (auto& command : list->commands) + if (r_debug_draw) { - command->Execute(thread); + for (auto& command : list->commands) + { + thread->debug_draw_pos++; + if (thread->debug_draw_pos < debug_draw_end) + command->Execute(thread); + } + } + else + { + for (auto& command : list->commands) + { + command->Execute(thread); + } } // Notify main thread that we finished: diff --git a/src/swrenderer/drawers/r_thread.h b/src/swrenderer/drawers/r_thread.h index 53c9bea44..fe6b9a931 100644 --- a/src/swrenderer/drawers/r_thread.h +++ b/src/swrenderer/drawers/r_thread.h @@ -52,6 +52,8 @@ public: std::shared_ptr poly; + size_t debug_draw_pos = 0; + // Checks if a line is rendered by this thread bool line_skipped_by_thread(int line) { @@ -109,6 +111,8 @@ public: // Waits for all commands to finish executing static void WaitForWorkers(); + + static void ResetDebugDrawPos(); private: DrawerThreads(); @@ -132,6 +136,8 @@ private: std::condition_variable end_condition; size_t tasks_left = 0; + size_t debug_draw_end = 0; + DrawerThread single_core_thread; friend class DrawerCommandQueue; diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 8022afa1e..b229367ee 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -65,6 +65,7 @@ void PeekThreadedErrorPane(); EXTERN_CVAR(Bool, r_shadercolormaps) EXTERN_CVAR(Int, r_clearbuffer) +EXTERN_CVAR(Int, r_debug_draw) CVAR(Bool, r_scene_multithreaded, false, 0); CVAR(Bool, r_models, false, 0); @@ -101,7 +102,7 @@ namespace swrenderer if (r_models) PolyTriangleDrawer::ClearBuffers(viewport->RenderTarget); - if (r_clearbuffer != 0) + if (r_clearbuffer != 0 || r_debug_draw != 0) { if (!viewport->RenderTarget->IsBgra()) { @@ -115,6 +116,7 @@ namespace swrenderer for (int i = 0; i < size; i++) dest[i] = bgracolor; } + DrawerThreads::ResetDebugDrawPos(); } RenderActorView(player->mo);