From 19bb332207b9460bc9c411bd9c57d8538aeafa24 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 27 Apr 2020 16:19:38 +0100 Subject: [PATCH] Fix bug in disassembly and debugging of vectorshuffle * Not all vectors are four components, the indices are relative to the number of components each vector has, not always 0-3 and 5-7 --- renderdoc/driver/shaders/spirv/spirv_debug.cpp | 6 ++++-- .../driver/shaders/spirv/spirv_disassemble.cpp | 8 +++++--- util/test/demos/vk/vk_shader_debug_zoo.cpp | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index c64c1075d..35c1c2a15 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -835,13 +835,15 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray ShaderVariable src1 = GetSrc(shuffle.vector1); ShaderVariable src2 = GetSrc(shuffle.vector2); + uint32_t vec1Cols = src1.columns; + for(size_t i = 0; i < shuffle.components.size(); i++) { uint32_t c = shuffle.components[i]; - if(c <= 3) + if(c < vec1Cols) var.value.uv[i] = src1.value.uv[c]; else - var.value.uv[i] = src2.value.uv[c - 4]; + var.value.uv[i] = src2.value.uv[c - vec1Cols]; } SetDst(shuffle.result, var); diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 9df32f569..94c9f0bbe 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -1444,8 +1444,10 @@ rdcstr Reflector::Disassemble(const rdcstr &entryPoint, // it's common to only swizzle from the first vector, detect that case bool allFirst = true; + uint32_t vec1Cols = dataTypes[idTypes[decoded.vector1]].vector().count; + for(uint32_t c : decoded.components) - if(c >= 4) + if(c >= vec1Cols) allFirst = false; const char comps[] = "xyzw"; @@ -1464,8 +1466,8 @@ rdcstr Reflector::Disassemble(const rdcstr &entryPoint, { uint32_t c = decoded.components[i]; - ret += idName(c < 4 ? decoded.vector1 : decoded.vector2) + "."; - ret.push_back(comps[c % 4]); + ret += idName(c < vec1Cols ? decoded.vector1 : decoded.vector2) + "."; + ret.push_back(comps[c % vec1Cols]); if(i + 1 < decoded.components.size()) ret += ", "; diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index 4293bf9da..0791cfc7b 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -1959,6 +1959,8 @@ void main() "%_out_float4 = OpVectorShuffle %float4 %float4_0000 %float4_dyn_1234 7 6 0 1", "%_out_float4 = OpVectorShuffle %float4 %float4_dyn_0000 %float4_1234 7 6 0 1", "%_out_float4 = OpVectorShuffle %float4 %float4_dyn_0000 %float4_dyn_1234 7 6 0 1", + "%_out_float3 = OpVectorShuffle %float3 %float3_000 %float3_123 3 4 5", + "%_out_float2 = OpVectorShuffle %float2 %float2_00 %float2_12 2 3", }); // test OpVectorExtractDynamic @@ -2612,6 +2614,12 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource %float4_0000 = OpConstantComposite %float4 %float_0_0 %float_0_0 %float_0_0 %float_0_0 %float4_1234 = OpConstantComposite %float4 %float_1_0 %float_2_0 %float_3_0 %float_4_0 + %float3_000 = OpConstantComposite %float3 %float_0_0 %float_0_0 %float_0_0 + %float3_123 = OpConstantComposite %float3 %float_1_0 %float_2_0 %float_3_0 + + %float2_00 = OpConstantComposite %float2 %float_0_0 %float_0_0 + %float2_12 = OpConstantComposite %float2 %float_1_0 %float_2_0 + )EOSHADER"; std::string ret = capabilities + @@ -2698,6 +2706,12 @@ OpMemberDecorate %cbuffer_struct 17 Offset 216 ; double doublePackSource %float4_dyn_0000 = OpCompositeConstruct %float4 %float_dyn_0_0 %float_dyn_0_0 %float_dyn_0_0 %float_dyn_0_0 %float4_dyn_1234 = OpCompositeConstruct %float4 %float_dyn_1_0 %float_dyn_2_0 %float_dyn_3_0 %float_dyn_4_0 + %float3_dyn_000 = OpCompositeConstruct %float3 %float_dyn_0_0 %float_dyn_0_0 %float_dyn_0_0 + %float3_dyn_123 = OpCompositeConstruct %float3 %float_dyn_1_0 %float_dyn_2_0 %float_dyn_3_0 + + %float2_dyn_00 = OpCompositeConstruct %float2 %float_dyn_0_0 %float_dyn_0_0 + %float2_dyn_12 = OpCompositeConstruct %float2 %float_dyn_1_0 %float_dyn_2_0 + )EOSHADER"; ret += switch_str;