Skip to content

Commit 15b860e

Browse files
Merge pull request #1230 from KhronosGroup/cleanup-workgroup-barrier
Don't emit memoryBarrierShared() in workgroup control barriers.
2 parents faa3463 + 00d5c78 commit 15b860e

6 files changed

Lines changed: 10 additions & 24 deletions

File tree

reference/opt/shaders/comp/barriers.comp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,15 @@ void main()
88
memoryBarrierImage();
99
memoryBarrierBuffer();
1010
groupMemoryBarrier();
11-
memoryBarrierShared();
1211
barrier();
1312
memoryBarrier();
14-
memoryBarrierShared();
1513
barrier();
1614
memoryBarrierImage();
17-
memoryBarrierShared();
1815
barrier();
1916
memoryBarrierBuffer();
20-
memoryBarrierShared();
2117
barrier();
2218
groupMemoryBarrier();
23-
memoryBarrierShared();
2419
barrier();
25-
memoryBarrierShared();
2620
barrier();
2721
}
2822

reference/opt/shaders/comp/shared.comp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ shared float sShared[4];
1616
void main()
1717
{
1818
sShared[gl_LocalInvocationIndex] = _22.in_data[gl_GlobalInvocationID.x];
19-
memoryBarrierShared();
2019
barrier();
2120
_44.out_data[gl_GlobalInvocationID.x] = sShared[3u - gl_LocalInvocationIndex];
2221
}

reference/shaders/comp/barriers.comp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,41 +28,35 @@ void group_barrier()
2828

2929
void barrier_shared_exec()
3030
{
31-
memoryBarrierShared();
3231
barrier();
3332
}
3433

3534
void full_barrier_exec()
3635
{
3736
memoryBarrier();
38-
memoryBarrierShared();
3937
barrier();
4038
}
4139

4240
void image_barrier_exec()
4341
{
4442
memoryBarrierImage();
45-
memoryBarrierShared();
4643
barrier();
4744
}
4845

4946
void buffer_barrier_exec()
5047
{
5148
memoryBarrierBuffer();
52-
memoryBarrierShared();
5349
barrier();
5450
}
5551

5652
void group_barrier_exec()
5753
{
5854
groupMemoryBarrier();
59-
memoryBarrierShared();
6055
barrier();
6156
}
6257

6358
void exec_barrier()
6459
{
65-
memoryBarrierShared();
6660
barrier();
6761
}
6862

reference/shaders/comp/shared.comp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ void main()
1818
uint ident = gl_GlobalInvocationID.x;
1919
float idata = _22.in_data[ident];
2020
sShared[gl_LocalInvocationIndex] = idata;
21-
memoryBarrierShared();
2221
barrier();
2322
_44.out_data[ident] = sShared[(4u - gl_LocalInvocationIndex) - 1u];
2423
}

spirv_glsl.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9892,7 +9892,12 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
98929892
if (memory == ScopeWorkgroup) // Only need to consider memory within a group
98939893
{
98949894
if (semantics == MemorySemanticsWorkgroupMemoryMask)
9895-
statement("memoryBarrierShared();");
9895+
{
9896+
// OpControlBarrier implies a memory barrier for shared memory as well.
9897+
bool implies_shared_barrier = opcode == OpControlBarrier && execution_scope == ScopeWorkgroup;
9898+
if (!implies_shared_barrier)
9899+
statement("memoryBarrierShared();");
9900+
}
98969901
else if (semantics != 0)
98979902
statement("groupMemoryBarrier();");
98989903
}
@@ -9926,7 +9931,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
99269931
else
99279932
{
99289933
const uint32_t all_barriers = MemorySemanticsWorkgroupMemoryMask | MemorySemanticsUniformMemoryMask |
9929-
MemorySemanticsImageMemoryMask | MemorySemanticsAtomicCounterMemoryMask;
9934+
MemorySemanticsImageMemoryMask;
99309935

99319936
if (semantics & (MemorySemanticsCrossWorkgroupMemoryMask | MemorySemanticsSubgroupMemoryMask))
99329937
{
@@ -9948,8 +9953,6 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
99489953
statement("memoryBarrierBuffer();");
99499954
if (semantics & MemorySemanticsImageMemoryMask)
99509955
statement("memoryBarrierImage();");
9951-
if (semantics & MemorySemanticsAtomicCounterMemoryMask)
9952-
statement("memoryBarrierAtomicCounter();");
99539956
}
99549957
}
99559958

spirv_msl.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6513,8 +6513,7 @@ void CompilerMSL::emit_barrier(uint32_t id_exe_scope, uint32_t id_mem_scope, uin
65136513

65146514
// Fix tessellation patch function processing
65156515
if (get_execution_model() == ExecutionModelTessellationControl ||
6516-
(mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask |
6517-
MemorySemanticsAtomicCounterMemoryMask)))
6516+
(mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask)))
65186517
{
65196518
if (!mem_flags.empty())
65206519
mem_flags += " | ";
@@ -6535,13 +6534,11 @@ void CompilerMSL::emit_barrier(uint32_t id_exe_scope, uint32_t id_mem_scope, uin
65356534
else
65366535
{
65376536
if ((mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask)) &&
6538-
(mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask |
6539-
MemorySemanticsAtomicCounterMemoryMask)))
6537+
(mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask)))
65406538
bar_stmt += "mem_flags::mem_device_and_threadgroup";
65416539
else if (mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask))
65426540
bar_stmt += "mem_flags::mem_device";
6543-
else if (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask |
6544-
MemorySemanticsAtomicCounterMemoryMask))
6541+
else if (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask))
65456542
bar_stmt += "mem_flags::mem_threadgroup";
65466543
else if (mem_sem & MemorySemanticsImageMemoryMask)
65476544
bar_stmt += "mem_flags::mem_texture";

0 commit comments

Comments
 (0)