1617a3babSopenharmony_ci#version 450 core
2617a3babSopenharmony_ci#pragma use_vulkan_memory_model
3617a3babSopenharmony_ci#extension GL_KHR_shader_subgroup_basic : enable
4617a3babSopenharmony_ci#extension GL_KHR_shader_subgroup_shuffle : enable
5617a3babSopenharmony_ci#extension GL_KHR_shader_subgroup_ballot : enable
6617a3babSopenharmony_ci#extension GL_KHR_memory_scope_semantics : enable
7617a3babSopenharmony_ci#extension GL_ARB_gpu_shader_int64 : enable
8617a3babSopenharmony_ci#extension GL_EXT_buffer_reference : enable
9617a3babSopenharmony_ci// DIM/NUM_WORKGROUP_EACH_DIM overriden by spec constants
10617a3babSopenharmony_cilayout(constant_id = 0) const int DIM = 1;
11617a3babSopenharmony_cilayout(constant_id = 1) const int NUM_WORKGROUP_EACH_DIM = 1;
12617a3babSopenharmony_cishared bool sharedSkip;
13617a3babSopenharmony_cilayout(local_size_x_id = 0, local_size_y_id = 0, local_size_z = 1) in;
14617a3babSopenharmony_cilayout(buffer_reference) buffer PayloadRef { uint x[]; };
15617a3babSopenharmony_cilayout(buffer_reference) buffer GuardRef { uint x[]; };
16617a3babSopenharmony_cilayout(set=0, binding=2) buffer Fail { uint x[]; } fail;
17617a3babSopenharmony_cilayout (push_constant, std430) uniform PC {
18617a3babSopenharmony_ci   layout(offset = 0) PayloadRef payloadref;
19617a3babSopenharmony_cilayout(offset = 8) GuardRef guard;
20617a3babSopenharmony_ci};
21617a3babSopenharmony_civoid main()
22617a3babSopenharmony_ci{
23617a3babSopenharmony_ci   bool pass = true;
24617a3babSopenharmony_ci   bool skip = false;
25617a3babSopenharmony_ci   sharedSkip = false;
26617a3babSopenharmony_ci   nonprivate PayloadRef payload = payloadref;
27617a3babSopenharmony_ci   ivec2 globalId          = ivec2(gl_GlobalInvocationID.xy);
28617a3babSopenharmony_ci   ivec2 partnerGlobalId   = ivec2(DIM*NUM_WORKGROUP_EACH_DIM-1) - ivec2(gl_GlobalInvocationID.xy);
29617a3babSopenharmony_ci   uint bufferCoord        = globalId.y * DIM*NUM_WORKGROUP_EACH_DIM + globalId.x;
30617a3babSopenharmony_ci   uint partnerBufferCoord = partnerGlobalId.y * DIM*NUM_WORKGROUP_EACH_DIM + partnerGlobalId.x;
31617a3babSopenharmony_ci   ivec2 imageCoord        = globalId;
32617a3babSopenharmony_ci   ivec2 partnerImageCoord = partnerGlobalId;
33617a3babSopenharmony_ci   ivec2 globalId00          = ivec2(DIM) * ivec2(gl_WorkGroupID.xy);
34617a3babSopenharmony_ci   ivec2 partnerGlobalId00   = ivec2(DIM) * (ivec2(NUM_WORKGROUP_EACH_DIM-1) - ivec2(gl_WorkGroupID.xy));
35617a3babSopenharmony_ci   uint bufferCoord00        = globalId00.y * DIM*NUM_WORKGROUP_EACH_DIM + globalId00.x;
36617a3babSopenharmony_ci   uint partnerBufferCoord00 = partnerGlobalId00.y * DIM*NUM_WORKGROUP_EACH_DIM + partnerGlobalId00.x;
37617a3babSopenharmony_ci   ivec2 imageCoord00        = globalId00;
38617a3babSopenharmony_ci   ivec2 partnerImageCoord00 = partnerGlobalId00;
39617a3babSopenharmony_ci   payload.x[bufferCoord] = bufferCoord + (payload.x[partnerBufferCoord]>>31);
40617a3babSopenharmony_ci   controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable);
41617a3babSopenharmony_ci   if (all(equal(gl_LocalInvocationID.xy, ivec2(0,0)))) {
42617a3babSopenharmony_ci       atomicStore(guard.x[bufferCoord], uint(1u), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease | gl_SemanticsMakeAvailable);
43617a3babSopenharmony_ci       skip = atomicLoad(guard.x[partnerBufferCoord00], gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire | gl_SemanticsMakeVisible) == 0;
44617a3babSopenharmony_ci       sharedSkip = skip;
45617a3babSopenharmony_ci   }
46617a3babSopenharmony_ci   controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease | gl_SemanticsMakeVisible);
47617a3babSopenharmony_ci   skip = sharedSkip;
48617a3babSopenharmony_ci   uint r = payload.x[partnerBufferCoord];
49617a3babSopenharmony_ci   if (!skip && r != uint(partnerBufferCoord)) { fail.x[bufferCoord] = 1; }
50617a3babSopenharmony_ci}