| // SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense |
| |
| // Our version of the message passing atomic litmus test. |
| |
| #version 450 |
| |
| #extension GL_KHR_memory_scope_semantics : enable |
| |
| #ifdef VKMM |
| #pragma use_vulkan_memory_model |
| #define ACQUIRE gl_StorageSemanticsBuffer, gl_SemanticsAcquire |
| #define RELEASE gl_StorageSemanticsBuffer, gl_SemanticsRelease |
| #else |
| #define ACQUIRE 0, 0 |
| #define RELEASE 0, 0 |
| #endif |
| |
| layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in; |
| |
| struct Element |
| { |
| uint data; |
| uint flag; |
| }; |
| |
| layout(binding = 0) buffer DataBuf |
| { |
| Element data[]; |
| } data_buf; |
| |
| layout(binding = 1) buffer ControlBuf |
| { |
| uint failures; |
| } control_buf; |
| |
| uint permute_flag_ix(uint data_ix) |
| { |
| return (data_ix * 419u) & 65535u; |
| } |
| |
| void main() |
| { |
| atomicStore(data_buf.data[gl_GlobalInvocationID.x].data, 1u, gl_ScopeDevice, 0, 0); |
| #ifndef VKMM |
| memoryBarrierBuffer(); |
| #endif |
| uint write_flag_ix = permute_flag_ix(gl_GlobalInvocationID.x); |
| atomicStore(data_buf.data[write_flag_ix].flag, 1u, gl_ScopeDevice, RELEASE); |
| uint read_ix = (gl_GlobalInvocationID.x * 4099u) & 65535u; |
| uint read_flag_ix = permute_flag_ix(read_ix); |
| uint flag = atomicLoad(data_buf.data[read_flag_ix].flag, gl_ScopeDevice, ACQUIRE); |
| #ifndef VKMM |
| memoryBarrierBuffer(); |
| #endif |
| uint data = atomicLoad(data_buf.data[read_ix].data, gl_ScopeDevice, 0, 0); |
| if (flag > data) |
| { |
| atomicAdd(control_buf.failures, 1u); |
| } |
| } |