@@ -3873,6 +3873,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
38733873 case glslang::EOpEmitVertex:
38743874 case glslang::EOpEndPrimitive:
38753875 case glslang::EOpBarrier:
3876+ case glslang::EOpControlBarrierArriveEXT:
3877+ case glslang::EOpControlBarrierWaitEXT:
38763878 case glslang::EOpMemoryBarrier:
38773879 case glslang::EOpMemoryBarrierAtomicCounter:
38783880 case glslang::EOpMemoryBarrierBuffer:
@@ -10888,6 +10890,26 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
1088810890 return 0;
1088910891 }
1089010892 break;
10893+ case glslang::EOpControlBarrierArriveEXT:
10894+ case glslang::EOpControlBarrierWaitEXT:
10895+ {
10896+ builder.addExtension(spv::E_SPV_EXT_split_barrier);
10897+ builder.addCapability(spv::Capability::SplitBarrierEXT);
10898+ // This is for the extended controlBarrierArrive/Wait functions, with four operands.
10899+ // The unextended controlBarrierArrive/controlBarrierWait() go through createNoArgOperation.
10900+ assert(operands.size() == 4);
10901+ auto const executionScope = (spv::Scope)builder.getConstantScalar(operands[0]);
10902+ auto const memoryScope = (spv::Scope)builder.getConstantScalar(operands[1]);
10903+ auto const semantics = (spv::MemorySemanticsMask)(builder.getConstantScalar(operands[2]) | builder.getConstantScalar(operands[3]));
10904+ builder.createSplitControlBarrier((op == glslang::EOpControlBarrierArriveEXT ? spv::Op::OpControlBarrierArriveEXT
10905+ : spv::Op::OpControlBarrierWaitEXT),
10906+ executionScope, memoryScope, semantics);
10907+ if (anySet(semantics, spv::MemorySemanticsMask::OutputMemoryKHR)) {
10908+ builder.addCapability(spv::Capability::VulkanMemoryModelKHR);
10909+ }
10910+ return 0;
10911+ }
10912+ break;
1089110913 case glslang::EOpMemoryBarrier:
1089210914 {
1089310915 // This is for the extended memoryBarrier function, with three operands.
@@ -11706,6 +11728,26 @@ spv::Id TGlslangToSpvTraverser::createNoArgOperation(glslang::TOperator op, spv:
1170611728 spv::MemorySemanticsMask::AcquireRelease);
1170711729 }
1170811730 return 0;
11731+ case glslang::EOpControlBarrierArriveEXT:
11732+ builder.addExtension(spv::E_SPV_EXT_split_barrier);
11733+ builder.addCapability(spv::Capability::SplitBarrierEXT);
11734+ if (glslangIntermediate->usingVulkanMemoryModel()) {
11735+ builder.addCapability(spv::Capability::VulkanMemoryModelKHR);
11736+ }
11737+ builder.createSplitControlBarrier(spv::Op::OpControlBarrierArriveEXT, spv::Scope::Workgroup, spv::Scope::Workgroup,
11738+ spv::MemorySemanticsMask::WorkgroupMemory |
11739+ spv::MemorySemanticsMask::Release);
11740+ return 0;
11741+ case glslang::EOpControlBarrierWaitEXT:
11742+ builder.addExtension(spv::E_SPV_EXT_split_barrier);
11743+ builder.addCapability(spv::Capability::SplitBarrierEXT);
11744+ if (glslangIntermediate->usingVulkanMemoryModel()) {
11745+ builder.addCapability(spv::Capability::VulkanMemoryModelKHR);
11746+ }
11747+ builder.createSplitControlBarrier(spv::Op::OpControlBarrierWaitEXT, spv::Scope::Workgroup, spv::Scope::Workgroup,
11748+ spv::MemorySemanticsMask::WorkgroupMemory |
11749+ spv::MemorySemanticsMask::Acquire);
11750+ return 0;
1170911751 case glslang::EOpMemoryBarrier:
1171011752 builder.createMemoryBarrier(memoryBarrierScope, spv::MemorySemanticsAllMemory |
1171111753 spv::MemorySemanticsMask::AcquireRelease);
0 commit comments