mirror of
https://github.com/italicsjenga/vello.git
synced 2025-01-10 12:41:30 +11:00
10a624ee75
This is our version of the standard message passing litmus test for atomics. It does a bunch in parallel and permutes the reads and writes extensively, so it's been more sensitive than existing tests.
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);
|
|
}
|
|
}
|