Handle access chains for input data in vertex shader. Closes #2911

This commit is contained in:
baldurk
2023-04-17 10:18:27 +01:00
parent afbe26768d
commit 167c88ee41
+21 -2
View File
@@ -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<rdcspv::Id> chain;
for(uint32_t accessIdx : patchData.inputs[i].accessChain)
{
if(idxs[accessIdx] == 0)
idxs[accessIdx] = editor.AddConstantImmediate<uint32_t>(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