@@ -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);
0 commit comments