From 167c88ee41383a031ff6319260da03ca8f3f112f Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 17 Apr 2023 10:18:15 +0100 Subject: [PATCH] Handle access chains for input data in vertex shader. Closes #2911 --- renderdoc/driver/vulkan/vk_postvs.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_postvs.cpp b/renderdoc/driver/vulkan/vk_postvs.cpp index f15cd27a4..adb71169d 100644 --- a/renderdoc/driver/vulkan/vk_postvs.cpp +++ b/renderdoc/driver/vulkan/vk_postvs.cpp @@ -1166,16 +1166,35 @@ static void ConvertToMeshOutputCompute(const ShaderReflection &refl, if(valueID) { + rdcspv::Id ptr = ins[i].variable; + + if(!patchData.inputs[i].accessChain.empty()) + { + // for composite types we need to access chain first + rdcarray chain; + + for(uint32_t accessIdx : patchData.inputs[i].accessChain) + { + if(idxs[accessIdx] == 0) + idxs[accessIdx] = editor.AddConstantImmediate(accessIdx); + + chain.push_back(idxs[accessIdx]); + } + + ptr = ops.add(rdcspv::OpAccessChain(ins[i].privatePtrType, editor.MakeId(), + patchData.inputs[i].ID, chain)); + } + if(VarTypeCompType(vType) == compType) { - ops.add(rdcspv::OpStore(ins[i].variable, valueID)); + ops.add(rdcspv::OpStore(ptr, valueID)); } else { // assume we can just bitcast rdcspv::Id castedValue = ops.add(rdcspv::OpBitcast(ins[i].baseType, editor.MakeId(), valueID)); - ops.add(rdcspv::OpStore(ins[i].variable, castedValue)); + ops.add(rdcspv::OpStore(ptr, castedValue)); } } else