|
@@ -769,6 +769,16 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
|
|
|
builder.addCapability(spv::CapabilityStencilExportEXT);
|
|
builder.addCapability(spv::CapabilityStencilExportEXT);
|
|
|
return spv::BuiltInFragStencilRefEXT;
|
|
return spv::BuiltInFragStencilRefEXT;
|
|
|
|
|
|
|
|
|
|
+ case glslang::EbvShadingRateKHR:
|
|
|
|
|
+ builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);
|
|
|
|
|
+ builder.addCapability(spv::CapabilityFragmentShadingRateKHR);
|
|
|
|
|
+ return spv::BuiltInShadingRateKHR;
|
|
|
|
|
+
|
|
|
|
|
+ case glslang::EbvPrimitiveShadingRateKHR:
|
|
|
|
|
+ builder.addExtension(spv::E_SPV_KHR_fragment_shading_rate);
|
|
|
|
|
+ builder.addCapability(spv::CapabilityFragmentShadingRateKHR);
|
|
|
|
|
+ return spv::BuiltInPrimitiveShadingRateKHR;
|
|
|
|
|
+
|
|
|
case glslang::EbvInvocationId: return spv::BuiltInInvocationId;
|
|
case glslang::EbvInvocationId: return spv::BuiltInInvocationId;
|
|
|
case glslang::EbvTessLevelInner: return spv::BuiltInTessLevelInner;
|
|
case glslang::EbvTessLevelInner: return spv::BuiltInTessLevelInner;
|
|
|
case glslang::EbvTessLevelOuter: return spv::BuiltInTessLevelOuter;
|
|
case glslang::EbvTessLevelOuter: return spv::BuiltInTessLevelOuter;
|
|
@@ -1710,6 +1720,12 @@ void TGlslangToSpvTraverser::visitSymbol(glslang::TIntermSymbol* symbol)
|
|
|
if (symbol->getType().getQualifier().isSpecConstant())
|
|
if (symbol->getType().getQualifier().isSpecConstant())
|
|
|
spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
|
|
spec_constant_op_mode_setter.turnOnSpecConstantOpMode();
|
|
|
|
|
|
|
|
|
|
+#ifdef ENABLE_HLSL
|
|
|
|
|
+ // Skip symbol handling if it is string-typed
|
|
|
|
|
+ if (symbol->getBasicType() == glslang::EbtString)
|
|
|
|
|
+ return;
|
|
|
|
|
+#endif
|
|
|
|
|
+
|
|
|
// getSymbolId() will set up all the IO decorations on the first call.
|
|
// getSymbolId() will set up all the IO decorations on the first call.
|
|
|
// Formal function parameters were mapped during makeFunctions().
|
|
// Formal function parameters were mapped during makeFunctions().
|
|
|
spv::Id id = getSymbolId(symbol);
|
|
spv::Id id = getSymbolId(symbol);
|
|
@@ -2292,7 +2308,8 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
|
|
|
|
|
|
|
|
// The result of operation is always stored, but conditionally the
|
|
// The result of operation is always stored, but conditionally the
|
|
|
// consumed result. The consumed result is always an r-value.
|
|
// consumed result. The consumed result is always an r-value.
|
|
|
- builder.accessChainStore(result);
|
|
|
|
|
|
|
+ builder.accessChainStore(result,
|
|
|
|
|
+ TranslateNonUniformDecoration(node->getOperand()->getType().getQualifier()));
|
|
|
builder.clearAccessChain();
|
|
builder.clearAccessChain();
|
|
|
if (node->getOp() == glslang::EOpPreIncrement ||
|
|
if (node->getOp() == glslang::EOpPreIncrement ||
|
|
|
node->getOp() == glslang::EOpPreDecrement)
|
|
node->getOp() == glslang::EOpPreDecrement)
|
|
@@ -2368,6 +2385,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|
|
spv::Id invertedType = spv::NoType; // to use to override the natural type of the node
|
|
spv::Id invertedType = spv::NoType; // to use to override the natural type of the node
|
|
|
std::vector<spv::Builder::AccessChain> complexLvalues; // for holding swizzling l-values too complex for
|
|
std::vector<spv::Builder::AccessChain> complexLvalues; // for holding swizzling l-values too complex for
|
|
|
// SPIR-V, for an out parameter
|
|
// SPIR-V, for an out parameter
|
|
|
|
|
+ std::vector<glslang::TQualifier> complexLValueQualifiers;
|
|
|
std::vector<spv::Id> temporaryLvalues; // temporaries to pass, as proxies for complexLValues
|
|
std::vector<spv::Id> temporaryLvalues; // temporaries to pass, as proxies for complexLValues
|
|
|
|
|
|
|
|
auto resultType = [&invertedType, &node, this](){ return invertedType != spv::NoType ?
|
|
auto resultType = [&invertedType, &node, this](){ return invertedType != spv::NoType ?
|
|
@@ -2611,6 +2629,10 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|
|
else
|
|
else
|
|
|
constructed = builder.createConstructor(precision, arguments, resultType());
|
|
constructed = builder.createConstructor(precision, arguments, resultType());
|
|
|
|
|
|
|
|
|
|
+ if (node->getType().getQualifier().isNonUniform()) {
|
|
|
|
|
+ builder.addDecoration(constructed, spv::DecorationNonUniformEXT);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
builder.clearAccessChain();
|
|
builder.clearAccessChain();
|
|
|
builder.setAccessChainRValue(constructed);
|
|
builder.setAccessChainRValue(constructed);
|
|
|
|
|
|
|
@@ -2985,6 +3007,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|
|
// receive the result, and must later swizzle that into the original
|
|
// receive the result, and must later swizzle that into the original
|
|
|
// l-value.
|
|
// l-value.
|
|
|
complexLvalues.push_back(builder.getAccessChain());
|
|
complexLvalues.push_back(builder.getAccessChain());
|
|
|
|
|
+ complexLValueQualifiers.push_back(glslangOperands[arg]->getAsTyped()->getType().getQualifier());
|
|
|
temporaryLvalues.push_back(builder.createVariable(
|
|
temporaryLvalues.push_back(builder.createVariable(
|
|
|
spv::NoPrecision, spv::StorageClassFunction,
|
|
spv::NoPrecision, spv::StorageClassFunction,
|
|
|
builder.accessChainGetInferredType(), "swizzleTemp"));
|
|
builder.accessChainGetInferredType(), "swizzleTemp"));
|
|
@@ -3089,7 +3112,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
|
|
|
|
|
|
|
|
for (unsigned int i = 0; i < temporaryLvalues.size(); ++i) {
|
|
for (unsigned int i = 0; i < temporaryLvalues.size(); ++i) {
|
|
|
builder.setAccessChain(complexLvalues[i]);
|
|
builder.setAccessChain(complexLvalues[i]);
|
|
|
- builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision));
|
|
|
|
|
|
|
+ builder.accessChainStore(builder.createLoad(temporaryLvalues[i], spv::NoPrecision), TranslateNonUniformDecoration(complexLValueQualifiers[i]));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -4154,7 +4177,7 @@ void TGlslangToSpvTraverser::accessChainStore(const glslang::TType& type, spv::I
|
|
|
unsigned int alignment = builder.getAccessChain().alignment;
|
|
unsigned int alignment = builder.getAccessChain().alignment;
|
|
|
alignment |= type.getBufferReferenceAlignment();
|
|
alignment |= type.getBufferReferenceAlignment();
|
|
|
|
|
|
|
|
- builder.accessChainStore(rvalue,
|
|
|
|
|
|
|
+ builder.accessChainStore(rvalue, TranslateNonUniformDecoration(type.getQualifier()),
|
|
|
spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) &
|
|
spv::MemoryAccessMask(TranslateMemoryAccess(coherentFlags) &
|
|
|
~spv::MemoryAccessMakePointerVisibleKHRMask),
|
|
~spv::MemoryAccessMakePointerVisibleKHRMask),
|
|
|
TranslateMemoryScope(coherentFlags), alignment);
|
|
TranslateMemoryScope(coherentFlags), alignment);
|
|
@@ -4750,12 +4773,15 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|
|
|
|
|
|
|
const bool isUnsignedResult = node->getType().getBasicType() == glslang::EbtUint;
|
|
const bool isUnsignedResult = node->getType().getBasicType() == glslang::EbtUint;
|
|
|
|
|
|
|
|
|
|
+ if (builder.isSampledImage(params.sampler) &&
|
|
|
|
|
+ ((cracked.query && node->getOp() != glslang::EOpTextureQueryLod) || cracked.fragMask || cracked.fetch)) {
|
|
|
|
|
+ params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
|
|
|
|
|
+ if (imageType.getQualifier().isNonUniform()) {
|
|
|
|
|
+ builder.addDecoration(params.sampler, spv::DecorationNonUniformEXT);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
// Check for queries
|
|
// Check for queries
|
|
|
if (cracked.query) {
|
|
if (cracked.query) {
|
|
|
- // OpImageQueryLod works on a sampled image, for other queries the image has to be extracted first
|
|
|
|
|
- if (node->getOp() != glslang::EOpTextureQueryLod && builder.isSampledImage(params.sampler))
|
|
|
|
|
- params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
|
|
|
|
|
-
|
|
|
|
|
switch (node->getOp()) {
|
|
switch (node->getOp()) {
|
|
|
case glslang::EOpImageQuerySize:
|
|
case glslang::EOpImageQuerySize:
|
|
|
case glslang::EOpTextureQuerySize:
|
|
case glslang::EOpTextureQuerySize:
|
|
@@ -5009,10 +5035,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|
|
auto opIt = arguments.begin();
|
|
auto opIt = arguments.begin();
|
|
|
std::vector<spv::Id> operands;
|
|
std::vector<spv::Id> operands;
|
|
|
|
|
|
|
|
- // Extract the image if necessary
|
|
|
|
|
- if (builder.isSampledImage(params.sampler))
|
|
|
|
|
- params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
|
|
|
|
|
-
|
|
|
|
|
operands.push_back(params.sampler);
|
|
operands.push_back(params.sampler);
|
|
|
++opIt;
|
|
++opIt;
|
|
|
|
|
|
|
@@ -5073,13 +5095,6 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|
|
bias = true;
|
|
bias = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // See if the sampler param should really be just the SPV image part
|
|
|
|
|
- if (cracked.fetch) {
|
|
|
|
|
- // a fetch needs to have the image extracted first
|
|
|
|
|
- if (builder.isSampledImage(params.sampler))
|
|
|
|
|
- params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
#ifndef GLSLANG_WEB
|
|
#ifndef GLSLANG_WEB
|
|
|
if (cracked.gather) {
|
|
if (cracked.gather) {
|
|
|
const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
|
|
const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
|
|
@@ -5239,7 +5254,7 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
|
|
|
|
|
|
|
|
builder.accessChainPush(builder.makeIntConstant(i), flags, 0);
|
|
builder.accessChainPush(builder.makeIntConstant(i), flags, 0);
|
|
|
builder.accessChainStore(builder.createCompositeExtract(res, builder.getContainedTypeId(resType, i+1),
|
|
builder.accessChainStore(builder.createCompositeExtract(res, builder.getContainedTypeId(resType, i+1),
|
|
|
- i+1));
|
|
|
|
|
|
|
+ i+1), TranslateNonUniformDecoration(imageType.getQualifier()));
|
|
|
}
|
|
}
|
|
|
return builder.createCompositeExtract(res, resultType(), 0);
|
|
return builder.createCompositeExtract(res, resultType(), 0);
|
|
|
}
|
|
}
|