@@ -2292,7 +2292,8 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
2292
2292
2293
2293
// The result of operation is always stored, but conditionally the
2294
2294
// consumed result. The consumed result is always an r-value.
2295
- builder.accessChainStore (result);
2295
+ builder.accessChainStore (result,
2296
+ TranslateNonUniformDecoration (node->getOperand ()->getType ().getQualifier ()));
2296
2297
builder.clearAccessChain ();
2297
2298
if (node->getOp () == glslang::EOpPreIncrement ||
2298
2299
node->getOp () == glslang::EOpPreDecrement)
@@ -2368,6 +2369,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
2368
2369
spv::Id invertedType = spv::NoType; // to use to override the natural type of the node
2369
2370
std::vector<spv::Builder::AccessChain> complexLvalues; // for holding swizzling l-values too complex for
2370
2371
// SPIR-V, for an out parameter
2372
+ std::vector<glslang::TQualifier> complexLValueQualifiers;
2371
2373
std::vector<spv::Id> temporaryLvalues; // temporaries to pass, as proxies for complexLValues
2372
2374
2373
2375
auto resultType = [&invertedType, &node, this ](){ return invertedType != spv::NoType ?
@@ -2985,6 +2987,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
2985
2987
// receive the result, and must later swizzle that into the original
2986
2988
// l-value.
2987
2989
complexLvalues.push_back (builder.getAccessChain ());
2990
+ complexLValueQualifiers.push_back (glslangOperands[arg]->getAsTyped ()->getType ().getQualifier ());
2988
2991
temporaryLvalues.push_back (builder.createVariable (
2989
2992
spv::NoPrecision, spv::StorageClassFunction,
2990
2993
builder.accessChainGetInferredType (), " swizzleTemp" ));
@@ -3089,7 +3092,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
3089
3092
3090
3093
for (unsigned int i = 0 ; i < temporaryLvalues.size (); ++i) {
3091
3094
builder.setAccessChain (complexLvalues[i]);
3092
- builder.accessChainStore (builder.createLoad (temporaryLvalues[i], spv::NoPrecision));
3095
+ builder.accessChainStore (builder.createLoad (temporaryLvalues[i], spv::NoPrecision), TranslateNonUniformDecoration (complexLValueQualifiers[i]) );
3093
3096
}
3094
3097
}
3095
3098
@@ -4154,7 +4157,7 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I
4154
4157
unsigned int alignment = builder.getAccessChain ().alignment ;
4155
4158
alignment |= type.getBufferReferenceAlignment ();
4156
4159
4157
- builder.accessChainStore (rvalue,
4160
+ builder.accessChainStore (rvalue, TranslateNonUniformDecoration (type. getQualifier ()),
4158
4161
spv::MemoryAccessMask (TranslateMemoryAccess (coherentFlags) &
4159
4162
~spv::MemoryAccessMakePointerVisibleKHRMask),
4160
4163
TranslateMemoryScope (coherentFlags), alignment);
@@ -5239,7 +5242,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
5239
5242
5240
5243
builder.accessChainPush (builder.makeIntConstant (i), flags, 0 );
5241
5244
builder.accessChainStore (builder.createCompositeExtract (res, builder.getContainedTypeId (resType, i+1 ),
5242
- i+1 ));
5245
+ i+1 ), TranslateNonUniformDecoration (imageType. getQualifier ()) );
5243
5246
}
5244
5247
return builder.createCompositeExtract (res, resultType (), 0 );
5245
5248
}
0 commit comments