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}