Merge pull request #1230 from KhronosGroup/cleanup-workgroup-barrier

Don't emit memoryBarrierShared() in workgroup control barriers.
This commit is contained in:
Hans-Kristian Arntzen 2019-12-04 16:41:34 +01:00 committed by GitHub
commit 15b860eb1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 10 additions and 24 deletions

View File

@ -8,21 +8,15 @@ void main()
memoryBarrierImage(); memoryBarrierImage();
memoryBarrierBuffer(); memoryBarrierBuffer();
groupMemoryBarrier(); groupMemoryBarrier();
memoryBarrierShared();
barrier(); barrier();
memoryBarrier(); memoryBarrier();
memoryBarrierShared();
barrier(); barrier();
memoryBarrierImage(); memoryBarrierImage();
memoryBarrierShared();
barrier(); barrier();
memoryBarrierBuffer(); memoryBarrierBuffer();
memoryBarrierShared();
barrier(); barrier();
groupMemoryBarrier(); groupMemoryBarrier();
memoryBarrierShared();
barrier(); barrier();
memoryBarrierShared();
barrier(); barrier();
} }

View File

@ -16,7 +16,6 @@ shared float sShared[4];
void main() void main()
{ {
sShared[gl_LocalInvocationIndex] = _22.in_data[gl_GlobalInvocationID.x]; sShared[gl_LocalInvocationIndex] = _22.in_data[gl_GlobalInvocationID.x];
memoryBarrierShared();
barrier(); barrier();
_44.out_data[gl_GlobalInvocationID.x] = sShared[3u - gl_LocalInvocationIndex]; _44.out_data[gl_GlobalInvocationID.x] = sShared[3u - gl_LocalInvocationIndex];
} }

View File

@ -28,41 +28,35 @@ void group_barrier()
void barrier_shared_exec() void barrier_shared_exec()
{ {
memoryBarrierShared();
barrier(); barrier();
} }
void full_barrier_exec() void full_barrier_exec()
{ {
memoryBarrier(); memoryBarrier();
memoryBarrierShared();
barrier(); barrier();
} }
void image_barrier_exec() void image_barrier_exec()
{ {
memoryBarrierImage(); memoryBarrierImage();
memoryBarrierShared();
barrier(); barrier();
} }
void buffer_barrier_exec() void buffer_barrier_exec()
{ {
memoryBarrierBuffer(); memoryBarrierBuffer();
memoryBarrierShared();
barrier(); barrier();
} }
void group_barrier_exec() void group_barrier_exec()
{ {
groupMemoryBarrier(); groupMemoryBarrier();
memoryBarrierShared();
barrier(); barrier();
} }
void exec_barrier() void exec_barrier()
{ {
memoryBarrierShared();
barrier(); barrier();
} }

View File

@ -18,7 +18,6 @@ void main()
uint ident = gl_GlobalInvocationID.x; uint ident = gl_GlobalInvocationID.x;
float idata = _22.in_data[ident]; float idata = _22.in_data[ident];
sShared[gl_LocalInvocationIndex] = idata; sShared[gl_LocalInvocationIndex] = idata;
memoryBarrierShared();
barrier(); barrier();
_44.out_data[ident] = sShared[(4u - gl_LocalInvocationIndex) - 1u]; _44.out_data[ident] = sShared[(4u - gl_LocalInvocationIndex) - 1u];
} }

View File

@ -9892,7 +9892,12 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
if (memory == ScopeWorkgroup) // Only need to consider memory within a group if (memory == ScopeWorkgroup) // Only need to consider memory within a group
{ {
if (semantics == MemorySemanticsWorkgroupMemoryMask) if (semantics == MemorySemanticsWorkgroupMemoryMask)
statement("memoryBarrierShared();"); {
// OpControlBarrier implies a memory barrier for shared memory as well.
bool implies_shared_barrier = opcode == OpControlBarrier && execution_scope == ScopeWorkgroup;
if (!implies_shared_barrier)
statement("memoryBarrierShared();");
}
else if (semantics != 0) else if (semantics != 0)
statement("groupMemoryBarrier();"); statement("groupMemoryBarrier();");
} }
@ -9926,7 +9931,7 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
else else
{ {
const uint32_t all_barriers = MemorySemanticsWorkgroupMemoryMask | MemorySemanticsUniformMemoryMask | const uint32_t all_barriers = MemorySemanticsWorkgroupMemoryMask | MemorySemanticsUniformMemoryMask |
MemorySemanticsImageMemoryMask | MemorySemanticsAtomicCounterMemoryMask; MemorySemanticsImageMemoryMask;
if (semantics & (MemorySemanticsCrossWorkgroupMemoryMask | MemorySemanticsSubgroupMemoryMask)) if (semantics & (MemorySemanticsCrossWorkgroupMemoryMask | MemorySemanticsSubgroupMemoryMask))
{ {
@ -9948,8 +9953,6 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
statement("memoryBarrierBuffer();"); statement("memoryBarrierBuffer();");
if (semantics & MemorySemanticsImageMemoryMask) if (semantics & MemorySemanticsImageMemoryMask)
statement("memoryBarrierImage();"); statement("memoryBarrierImage();");
if (semantics & MemorySemanticsAtomicCounterMemoryMask)
statement("memoryBarrierAtomicCounter();");
} }
} }

View File

@ -6513,8 +6513,7 @@ void CompilerMSL::emit_barrier(uint32_t id_exe_scope, uint32_t id_mem_scope, uin
// Fix tessellation patch function processing // Fix tessellation patch function processing
if (get_execution_model() == ExecutionModelTessellationControl || if (get_execution_model() == ExecutionModelTessellationControl ||
(mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask | (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask)))
MemorySemanticsAtomicCounterMemoryMask)))
{ {
if (!mem_flags.empty()) if (!mem_flags.empty())
mem_flags += " | "; mem_flags += " | ";
@ -6535,13 +6534,11 @@ void CompilerMSL::emit_barrier(uint32_t id_exe_scope, uint32_t id_mem_scope, uin
else else
{ {
if ((mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask)) && if ((mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask)) &&
(mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask | (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask)))
MemorySemanticsAtomicCounterMemoryMask)))
bar_stmt += "mem_flags::mem_device_and_threadgroup"; bar_stmt += "mem_flags::mem_device_and_threadgroup";
else if (mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask)) else if (mem_sem & (MemorySemanticsUniformMemoryMask | MemorySemanticsCrossWorkgroupMemoryMask))
bar_stmt += "mem_flags::mem_device"; bar_stmt += "mem_flags::mem_device";
else if (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask | else if (mem_sem & (MemorySemanticsSubgroupMemoryMask | MemorySemanticsWorkgroupMemoryMask))
MemorySemanticsAtomicCounterMemoryMask))
bar_stmt += "mem_flags::mem_threadgroup"; bar_stmt += "mem_flags::mem_threadgroup";
else if (mem_sem & MemorySemanticsImageMemoryMask) else if (mem_sem & MemorySemanticsImageMemoryMask)
bar_stmt += "mem_flags::mem_texture"; bar_stmt += "mem_flags::mem_texture";