summaryrefslogtreecommitdiff
path: root/source/slang
diff options
context:
space:
mode:
authorPankaj Mistry <63069047+pmistryNV@users.noreply.github.com>2024-04-07 14:32:19 -0700
committerGitHub <noreply@github.com>2024-04-07 14:32:19 -0700
commit4a23ba5293916795741479c55c5d0ecc597f8986 (patch)
tree364a871d76690b11255259d7463986ea47c10f76 /source/slang
parent1b3887f462d01b83690200b9cbcb0dd902b2c0e9 (diff)
Add decoration PerPrimitiveEXT for all OutputPrimitives members for mesh (#3900)
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-emit-spirv.cpp27
1 files changed, 14 insertions, 13 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 9f116a1e2..2b85be8c7 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -2094,6 +2094,18 @@ struct SPIRVEmitContext
return false;
}
}
+ void emitSystemVarDecoration(IRInst* var, SpvInst* varInst)
+ {
+ for (auto decor : var->getDecorations())
+ {
+ switch (decor->getOp())
+ {
+ case kIROp_GLSLPrimitivesRateDecoration:
+ emitOpDecorate(getSection(SpvLogicalSectionID::Annotations), decor, varInst, SpvDecorationPerPrimitiveEXT);
+ break;
+ }
+ }
+ }
void emitVarLayout(IRInst* var, SpvInst* varInst, IRVarLayout* layout)
{
@@ -2256,6 +2268,7 @@ struct SPIRVEmitContext
}
if (auto systemValInst = maybeEmitSystemVal(param))
{
+ emitSystemVarDecoration(param, systemValInst);
registerInst(param, systemValInst);
return systemValInst;
}
@@ -3827,7 +3840,6 @@ struct SPIRVEmitContext
// non-tessellation shader stages, and if so include a declaration of
// Geometry capability.
bool needGeometryCapability = true;
- bool needPerPrimitiveEXTDecoration = false;
if (entryPoints)
{
for (auto entryPoint : *entryPoints)
@@ -3837,10 +3849,6 @@ struct SPIRVEmitContext
switch (entryPointDecor->getProfile().getStage())
{
case Stage::Mesh:
- // For outputs decorated with PrimitiveID it must be decorated
- // with PerPrimitiveEXT to comply with Vulkan validation rules
- if (m_capabilities.contains(SpvCapabilityMeshShadingEXT))
- needPerPrimitiveEXTDecoration = true;
case Stage::Geometry:
case Stage::Intersection:
case Stage::Amplification:
@@ -3856,14 +3864,7 @@ struct SPIRVEmitContext
}
if (needGeometryCapability)
requireSPIRVCapability(SpvCapabilityGeometry);
- auto varInst = getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInPrimitiveId);
- if (needPerPrimitiveEXTDecoration)
- emitOpDecorate(
- getSection(SpvLogicalSectionID::Annotations),
- nullptr,
- varInst,
- SpvDecorationPerPrimitiveEXT);
- return varInst;
+ return getBuiltinGlobalVar(inst->getFullType(), SpvBuiltInPrimitiveId);
}
else if (semanticName == "sv_rendertargetarrayindex")
{