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
This commit is contained in:
baldurk
2020-04-27 16:19:38 +01:00
parent 67c3f4fe25
commit 19bb332207
3 changed files with 23 additions and 5 deletions
@@ -835,13 +835,15 @@ void ThreadState::StepNext(ShaderDebugState *state, const rdcarray<ThreadState>
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);
@@ -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 += ", ";
@@ -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;