From a9bafd27237262a7ae1e0cff6729573e917f1c4b Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Wed, 6 May 2026 14:47:16 +0100 Subject: [PATCH] Spirv debugger handle quadScope case when subgroupSize > workgroupSize --- renderdoc/driver/vulkan/vk_shaderdebug.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_shaderdebug.cpp b/renderdoc/driver/vulkan/vk_shaderdebug.cpp index 83745f6da..303d6be0c 100644 --- a/renderdoc/driver/vulkan/vk_shaderdebug.cpp +++ b/renderdoc/driver/vulkan/vk_shaderdebug.cpp @@ -6745,16 +6745,16 @@ ShaderDebugTrace *VulkanReplay::DebugComputeCommon(ShaderStage stage, uint32_t e uint32_t quadZ = compData->threadid[2]; quadId = quadX + (quadY * countQuadX) + (quadZ * countQuadY * countQuadX); quadLaneIndex = (compData->threadid[0] % quadW) + (compData->threadid[1] % quadH) * 2; - - apiWrapper->thread_props[lane][(size_t)rdcspv::ThreadProperty::QuadLane] = quadLaneIndex; - apiWrapper->thread_props[lane][(size_t)rdcspv::ThreadProperty::QuadId] = - quadId + quadIdOffset; } if(hasWorkgroupScope) { if(hasQuadScope) { + // There won't be any data them for inactive lanes + if(subgroupData->isActive == 0) + continue; + // quad scope, derive the lane from the quad layout lane = quadId * 4 + quadLaneIndex; } @@ -6766,6 +6766,13 @@ ShaderDebugTrace *VulkanReplay::DebugComputeCommon(ShaderStage stage, uint32_t e } } + if(hasQuadScope) + { + apiWrapper->thread_props[lane][(size_t)rdcspv::ThreadProperty::QuadLane] = quadLaneIndex; + apiWrapper->thread_props[lane][(size_t)rdcspv::ThreadProperty::QuadId] = + quadId + quadIdOffset; + } + if(rdcfixedarray(compData->threadid) == threadid && subgroupData->isActive) laneIndex = lane;