summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-emit-spirv.cpp
diff options
context:
space:
mode:
authoramidescent <221220072+amidescent@users.noreply.github.com>2025-08-09 12:30:30 -0300
committerGitHub <noreply@github.com>2025-08-09 15:30:30 +0000
commitfc6aea37483446372425aca8471f0e8bf7c3a910 (patch)
treee9ef039193f0ca54b372a8ebadadf558d3c5c521 /source/slang/slang-emit-spirv.cpp
parent6d54b66ca633e1890fd4db4c6d90dfe90b9aa4fb (diff)
[SPIR-V] Emit control flags for `branch/flatten` decorations (#8134)
Co-authored-by: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Co-authored-by: slangbot <186143334+slangbot@users.noreply.github.com>
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
-rw-r--r--source/slang/slang-emit-spirv.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 0449c6b88..aa4c3bec8 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -3962,6 +3962,17 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
}
}
+ SpvSelectionControlMask getSpvBranchSelectionControl(IRInst* inst)
+ {
+ if (inst->findDecorationImpl(kIROp_BranchDecoration))
+ return SpvSelectionControlDontFlattenMask;
+
+ if (inst->findDecorationImpl(kIROp_FlattenDecoration))
+ return SpvSelectionControlFlattenMask;
+
+ return SpvSelectionControlMaskNone;
+ }
+
// The instructions that appear inside the basic blocks of
// functions are what we will call "local" instructions.
//
@@ -4269,7 +4280,11 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
{
auto ifelseInst = as<IRIfElse>(inst);
auto afterBlockID = getIRInstSpvID(ifelseInst->getAfterBlock());
- emitOpSelectionMerge(parent, nullptr, afterBlockID, SpvSelectionControlMaskNone);
+ emitOpSelectionMerge(
+ parent,
+ nullptr,
+ afterBlockID,
+ getSpvBranchSelectionControl(ifelseInst));
auto falseLabel = ifelseInst->getFalseBlock();
result = emitOpBranchConditional(
parent,
@@ -4284,7 +4299,11 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
{
auto switchInst = as<IRSwitch>(inst);
auto mergeBlockID = getIRInstSpvID(switchInst->getBreakLabel());
- emitOpSelectionMerge(parent, nullptr, mergeBlockID, SpvSelectionControlMaskNone);
+ emitOpSelectionMerge(
+ parent,
+ nullptr,
+ mergeBlockID,
+ getSpvBranchSelectionControl(switchInst));
result = emitInstCustomOperandFunc(
parent,
inst,