Skip to content

Commit 7d478ab

Browse files
committed
GLSL_EXT_split_barrier / SPV_EXT_split_barrier
1 parent 8292684 commit 7d478ab

29 files changed

Lines changed: 655 additions & 1 deletion

SPIRV/GLSL.ext.EXT.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ static const char* const E_SPV_EXT_shader_64bit_indexing = "SPV_EXT_shader_64bit
4646
static const char* const E_SPV_EXT_shader_invocation_reorder = "SPV_EXT_shader_invocation_reorder";
4747
static const char* const E_SPV_EXT_long_vector = "SPV_EXT_long_vector";
4848
static const char* const E_SPV_EXT_ocp_microscaling_types = "SPV_EXT_ocp_microscaling_types";
49+
static const char* const E_SPV_EXT_split_barrier = "SPV_EXT_split_barrier";
4950

5051
#endif // #ifndef GLSLextEXT_H

SPIRV/GlslangToSpv.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3877,6 +3877,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
38773877
case glslang::EOpEmitVertex:
38783878
case glslang::EOpEndPrimitive:
38793879
case glslang::EOpBarrier:
3880+
case glslang::EOpControlBarrierArriveEXT:
3881+
case glslang::EOpControlBarrierWaitEXT:
38803882
case glslang::EOpMemoryBarrier:
38813883
case glslang::EOpMemoryBarrierAtomicCounter:
38823884
case glslang::EOpMemoryBarrierBuffer:
@@ -10892,6 +10894,26 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
1089210894
return 0;
1089310895
}
1089410896
break;
10897+
case glslang::EOpControlBarrierArriveEXT:
10898+
case glslang::EOpControlBarrierWaitEXT:
10899+
{
10900+
builder.addExtension(spv::E_SPV_EXT_split_barrier);
10901+
builder.addCapability(spv::Capability::SplitBarrierEXT);
10902+
// This is for the extended controlBarrierArrive/Wait functions, with four operands.
10903+
// The unextended controlBarrierArrive/controlBarrierWait() go through createNoArgOperation.
10904+
assert(operands.size() == 4);
10905+
auto const executionScope = (spv::Scope)builder.getConstantScalar(operands[0]);
10906+
auto const memoryScope = (spv::Scope)builder.getConstantScalar(operands[1]);
10907+
auto const semantics = (spv::MemorySemanticsMask)(builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]));
10908+
builder.createSplitControlBarrier((op == glslang::EOpControlBarrierArriveEXT ? spv::Op::OpControlBarrierArriveEXT
10909+
: spv::Op::OpControlBarrierWaitEXT),
10910+
executionScope, memoryScope, semantics);
10911+
if (anySet(semantics, spv::MemorySemanticsMask::OutputMemoryKHR)) {
10912+
builder.addCapability(spv::Capability::VulkanMemoryModelKHR);
10913+
}
10914+
return 0;
10915+
}
10916+
break;
1089510917
case glslang::EOpMemoryBarrier:
1089610918
{
1089710919
// This is for the extended memoryBarrier function, with three operands.
@@ -11710,6 +11732,26 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv:
1171011732
spv::MemorySemanticsMask::AcquireRelease);
1171111733
}
1171211734
return 0;
11735+
case glslang::EOpControlBarrierArriveEXT:
11736+
builder.addExtension(spv::E_SPV_EXT_split_barrier);
11737+
builder.addCapability(spv::Capability::SplitBarrierEXT);
11738+
if (glslangIntermediate->usingVulkanMemoryModel()) {
11739+
builder.addCapability(spv::Capability::VulkanMemoryModelKHR);
11740+
}
11741+
builder.createSplitControlBarrier(spv::Op::OpControlBarrierArriveEXT, spv::Scope::Workgroup, spv::Scope::Workgroup,
11742+
spv::MemorySemanticsMask::WorkgroupMemory |
11743+
spv::MemorySemanticsMask::Release);
11744+
return 0;
11745+
case glslang::EOpControlBarrierWaitEXT:
11746+
builder.addExtension(spv::E_SPV_EXT_split_barrier);
11747+
builder.addCapability(spv::Capability::SplitBarrierEXT);
11748+
if (glslangIntermediate->usingVulkanMemoryModel()) {
11749+
builder.addCapability(spv::Capability::VulkanMemoryModelKHR);
11750+
}
11751+
builder.createSplitControlBarrier(spv::Op::OpControlBarrierWaitEXT, spv::Scope::Workgroup, spv::Scope::Workgroup,
11752+
spv::MemorySemanticsMask::WorkgroupMemory |
11753+
spv::MemorySemanticsMask::Acquire);
11754+
return 0;
1171311755
case glslang::EOpMemoryBarrier:
1171411756
builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAllMemory |
1171511757
spv::MemorySemanticsMask::AcquireRelease);

SPIRV/SpvBuilder.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3577,6 +3577,16 @@ void Builder::createControlBarrier(Scope execution, Scope memory, MemorySemantic
35773577
addInstruction(std::unique_ptr<Instruction>(op));
35783578
}
35793579

3580+
void Builder::createSplitControlBarrier(Op opcode, Scope execution, Scope memory, MemorySemanticsMask semantics)
3581+
{
3582+
Instruction* op = new Instruction(opcode);
3583+
op->reserveOperands(3);
3584+
op->addIdOperand(makeUintConstant(execution));
3585+
op->addIdOperand(makeUintConstant(memory));
3586+
op->addIdOperand(makeUintConstant(semantics));
3587+
addInstruction(std::unique_ptr<Instruction>(op));
3588+
}
3589+
35803590
void Builder::createMemoryBarrier(Scope executionScope, MemorySemanticsMask memorySemantics)
35813591
{
35823592
Instruction* op = new Instruction(Op::OpMemoryBarrier);

SPIRV/SpvBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,7 @@ class Builder {
608608
void createNoResultOp(Op, const std::vector<Id>& operands);
609609
void createNoResultOp(Op, const std::vector<IdImmediate>& operands);
610610
void createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask);
611+
void createSplitControlBarrier(Op op, Scope execution, Scope memory, MemorySemanticsMask memorySem);
611612
void createMemoryBarrier(Scope executionScope, MemorySemanticsMask memorySemantics);
612613
Id createUnaryOp(Op, Id typeId, Id operand);
613614
Id createBinOp(Op, Id typeId, Id operand1, Id operand2);

SPIRV/doc.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,7 @@ const char* CapabilityString(int info)
11701170

11711171
case (int)Capability::Shader64BitIndexingEXT: return "CapabilityShader64BitIndexingEXT";
11721172
case (int)Capability::LongVectorEXT: return "LongVectorEXT";
1173+
case (int)Capability::SplitBarrierEXT: return "SplitBarrierEXT";
11731174

11741175
case (int)Capability::Float4EXT: return "Float4EXT";
11751176
case (int)Capability::Float6EXT: return "Float6EXT";
@@ -1811,6 +1812,8 @@ const char* OpcodeString(int op)
18111812
case (int)Op::OpHitObjectGetIntersectionTriangleVertexPositionsEXT: return "OpHitObjectGetIntersectionTriangleVertexPositionsEXT";
18121813

18131814
case (int)Op::OpBitcastExtractEXT: return "OpBitcastExtractEXT";
1815+
case (int)Op::OpControlBarrierArriveEXT: return "OpControlBarrierArriveEXT";
1816+
case (int)Op::OpControlBarrierWaitEXT: return "OpControlBarrierWaitEXT";
18141817

18151818
default:
18161819
return "Bad";
@@ -1900,6 +1903,8 @@ void Parameterize()
19001903
InstructionDesc[enumCast(Op::OpEmitStreamVertex)].setResultAndType(false, false);
19011904
InstructionDesc[enumCast(Op::OpEndStreamPrimitive)].setResultAndType(false, false);
19021905
InstructionDesc[enumCast(Op::OpControlBarrier)].setResultAndType(false, false);
1906+
InstructionDesc[enumCast(Op::OpControlBarrierArriveEXT)].setResultAndType(false, false);
1907+
InstructionDesc[enumCast(Op::OpControlBarrierWaitEXT)].setResultAndType(false, false);
19031908
InstructionDesc[enumCast(Op::OpMemoryBarrier)].setResultAndType(false, false);
19041909
InstructionDesc[enumCast(Op::OpAtomicStore)].setResultAndType(false, false);
19051910
InstructionDesc[enumCast(Op::OpLoopMerge)].setResultAndType(false, false);
@@ -4176,6 +4181,14 @@ void Parameterize()
41764181

41774182
InstructionDesc[enumCast(Op::OpBitcastExtractEXT)].operands.push(OperandId, "'Base'");
41784183
InstructionDesc[enumCast(Op::OpBitcastExtractEXT)].operands.push(OperandId, "'Offset'");
4184+
4185+
InstructionDesc[enumCast(Op::OpControlBarrierArriveEXT)].operands.push(OperandScope, "'Execution'");
4186+
InstructionDesc[enumCast(Op::OpControlBarrierArriveEXT)].operands.push(OperandScope, "'Memory'");
4187+
InstructionDesc[enumCast(Op::OpControlBarrierArriveEXT)].operands.push(OperandMemorySemantics, "'Semantics'");
4188+
4189+
InstructionDesc[enumCast(Op::OpControlBarrierWaitEXT)].operands.push(OperandScope, "'Execution'");
4190+
InstructionDesc[enumCast(Op::OpControlBarrierWaitEXT)].operands.push(OperandScope, "'Memory'");
4191+
InstructionDesc[enumCast(Op::OpControlBarrierWaitEXT)].operands.push(OperandMemorySemantics, "'Semantics'");
41794192
});
41804193
}
41814194

0 commit comments

Comments
 (0)