diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.cpp b/renderdoc/driver/shaders/spirv/spirv_debug.cpp index dbb4dce19..60fa9282c 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug.cpp @@ -711,6 +711,44 @@ void ThreadState::StepNext(ShaderDebugState *state, break; } + case Op::VectorExtractDynamic: + { + OpVectorExtractDynamic extract(it); + + ShaderVariable var = GetSrc(extract.vector); + ShaderVariable idx = GetSrc(extract.index); + + uint32_t comp = idx.value.u.x; + + if(VarTypeByteSize(var.type) == 8) + var.value.u64v[0] = var.value.u64v[comp]; + else + var.value.uv[0] = var.value.uv[comp]; + + // result is now scalar + var.columns = 1; + + SetDst(state, extract.result, var); + break; + } + case Op::VectorInsertDynamic: + { + OpVectorInsertDynamic insert(it); + + ShaderVariable var = GetSrc(insert.vector); + ShaderVariable scalar = GetSrc(insert.component); + ShaderVariable idx = GetSrc(insert.index); + + uint32_t comp = idx.value.u.x; + + if(VarTypeByteSize(var.type) == 8) + var.value.u64v[comp] = scalar.value.u64v[0]; + else + var.value.uv[comp] = scalar.value.uv[0]; + + SetDst(state, insert.result, var); + break; + } case Op::Select: { OpSelect select(it); diff --git a/util/test/demos/vk/vk_shader_debug_zoo.cpp b/util/test/demos/vk/vk_shader_debug_zoo.cpp index e7b8925d6..28078ca89 100644 --- a/util/test/demos/vk/vk_shader_debug_zoo.cpp +++ b/util/test/demos/vk/vk_shader_debug_zoo.cpp @@ -563,6 +563,8 @@ void main() 38 %test_38 39 %test_39 40 %test_40 + 41 %test_41 + 42 %test_42 ; test OpVectorShuffle %test_0 = OpLabel @@ -1085,6 +1087,8 @@ void main() %scale_31 = OpFAdd %float %zerof %float_1_234 %Color_31 = OpVectorTimesScalar %float4 %vec_31 %scale_31 +)EOSHADER" + R"EOSHADER( OpStore %Color %Color_31 OpBranch %break @@ -1187,6 +1191,37 @@ void main() OpStore %Color %Color_40 OpBranch %break + %test_41 = OpLabel + %a_41 = OpFAdd %float %zerof %float_15 + %b_41 = OpFAdd %float %zerof %float_4 + %c_41 = OpFAdd %float %zerof %float_neg4 + %d_41 = OpFAdd %float %zerof %float_1_234 + %x_41 = OpFAdd %float %zerof %float_neg15 + + %comp_41 = OpIAdd %uint %zerou %uint_3 + + %vec_41 = OpCompositeConstruct %float4 %a_41 %b_41 %c_41 %d_41 +%extracted_41 = OpVectorExtractDynamic %float %vec_41 %comp_41 + %Color_41 = OpCompositeConstruct %float4 %extracted_41 %extracted_41 %extracted_41 %extracted_41 + + OpStore %Color %Color_41 + OpBranch %break + + %test_42 = OpLabel + %a_42 = OpFAdd %float %zerof %float_15 + %b_42 = OpFAdd %float %zerof %float_4 + %c_42 = OpFAdd %float %zerof %float_neg4 + %d_42 = OpFAdd %float %zerof %float_1_234 + %x_42 = OpFAdd %float %zerof %float_neg15 + + %comp_42 = OpIAdd %uint %zerou %uint_2 + + %vec_42 = OpCompositeConstruct %float4 %a_42 %b_42 %c_42 %d_42 + %Color_42 = OpVectorInsertDynamic %float4 %vec_42 %x_42 %comp_42 + + OpStore %Color %Color_42 + OpBranch %break + %default = OpLabel OpStore %Color %float_0000 OpBranch %break