From 6e28ff1ca8bfa61e72e4b9534dcc0e62783232e3 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Tue, 16 Sep 2025 10:41:31 +0100 Subject: [PATCH] Convert Spirv Debugger to run Thread steps via the JobSystem Enabled by default : config option "Vulkan_Debug_EnableShaderDebugMT" --- renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp | 9 ++++++++- renderdoc/driver/vulkan/vk_shaderdebug.cpp | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index 0960bdc55..d0018b9d5 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -37,6 +37,9 @@ RDOC_DEBUG_CONFIG( bool, Vulkan_Hack_EnableGroupCaps, false, "Work in progress allow shaders to be debugged with subgroup/workgroup requirements."); +RDOC_CONFIG(bool, Vulkan_Debug_EnableShaderDebugMT, true, + "Use multiple threads to run the shader debugger simulation."); + using namespace rdcshaders; // this could be cleaner if ShaderVariable wasn't a very public struct, but it's not worth it so @@ -4827,7 +4830,11 @@ void Debugger::QueueJob(uint32_t lane, rdcarray *ret) CHECK_DEBUGGER_THREAD(); ThreadState &thread = workgroup[lane]; thread.SetStepQueued(); - StepThread(lane, StepThreadMode::RUN_SINGLE_STEP, ret); + if(Vulkan_Debug_EnableShaderDebugMT()) + Threading::JobSystem::AddJob( + [this, lane, ret]() { StepThread(lane, StepThreadMode::RUN_MULTIPLE_STEPS, ret); }); + else + StepThread(lane, StepThreadMode::RUN_SINGLE_STEP, ret); } // Must be called from the replay manager thread (the debugger thread) diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 7e5e6986e..72448fdc4 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -6655,6 +6655,7 @@ rdcarray VulkanReplay::ContinueDebug(ShaderDebugger *debugger) } rdcarray ret = spvDebugger->ContinueDebug(); + Threading::JobSystem::SyncAllJobs(); VulkanAPIWrapper *api = (VulkanAPIWrapper *)spvDebugger->GetAPIWrapper(); api->ResetReplay();