mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 12:41:30 +11:00
61 lines
1.4 KiB
GLSL
61 lines
1.4 KiB
GLSL
|
// 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);
|
||
|
}
|
||
|
}
|