--- /dev/null
+spv.atomicAdd.bufferReference.comp
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 188
+
+ Capability Shader
+ Capability VulkanMemoryModelKHR
+ Capability VulkanMemoryModelDeviceScopeKHR
+ Capability PhysicalStorageBufferAddressesEXT
+ Extension "SPV_KHR_physical_storage_buffer"
+ Extension "SPV_KHR_storage_buffer_storage_class"
+ Extension "SPV_KHR_vulkan_memory_model"
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel PhysicalStorageBuffer64EXT VulkanKHR
+ EntryPoint GLCompute 4 "main" 37 81 133
+ ExecutionMode 4 LocalSize 1 1 1
+ Source GLSL 450
+ SourceExtension "GL_ARB_gpu_shader_int64"
+ SourceExtension "GL_EXT_buffer_reference"
+ SourceExtension "GL_KHR_memory_scope_semantics"
+ SourceExtension "GL_KHR_shader_subgroup_ballot"
+ SourceExtension "GL_KHR_shader_subgroup_basic"
+ SourceExtension "GL_KHR_shader_subgroup_shuffle"
+ Name 4 "main"
+ Name 8 "pass"
+ Name 10 "skip"
+ Name 13 "sharedSkip"
+ Name 18 "PayloadRef"
+ MemberName 18(PayloadRef) 0 "x"
+ Name 20 "payload"
+ Name 22 "PC"
+ MemberName 22(PC) 0 "payloadref"
+ MemberName 22(PC) 1 "guard"
+ Name 24 "GuardRef"
+ MemberName 24(GuardRef) 0 "x"
+ Name 26 ""
+ Name 34 "globalId"
+ Name 37 "gl_GlobalInvocationID"
+ Name 42 "partnerGlobalId"
+ Name 43 "DIM"
+ Name 44 "NUM_WORKGROUP_EACH_DIM"
+ Name 54 "bufferCoord"
+ Name 66 "partnerBufferCoord"
+ Name 75 "imageCoord"
+ Name 77 "partnerImageCoord"
+ Name 79 "globalId00"
+ Name 81 "gl_WorkGroupID"
+ Name 86 "partnerGlobalId00"
+ Name 95 "bufferCoord00"
+ Name 104 "partnerBufferCoord00"
+ Name 113 "imageCoord00"
+ Name 115 "partnerImageCoord00"
+ Name 133 "gl_LocalInvocationID"
+ Name 163 "r"
+ Name 179 "Fail"
+ MemberName 179(Fail) 0 "x"
+ Name 181 "fail"
+ Decorate 17 ArrayStride 4
+ MemberDecorate 18(PayloadRef) 0 Offset 0
+ Decorate 18(PayloadRef) Block
+ Decorate 20(payload) DecorationAliasedPointerEXT
+ MemberDecorate 22(PC) 0 Offset 0
+ MemberDecorate 22(PC) 1 Offset 8
+ Decorate 22(PC) Block
+ Decorate 23 ArrayStride 4
+ MemberDecorate 24(GuardRef) 0 Offset 0
+ Decorate 24(GuardRef) Block
+ Decorate 37(gl_GlobalInvocationID) BuiltIn GlobalInvocationId
+ Decorate 43(DIM) SpecId 0
+ Decorate 44(NUM_WORKGROUP_EACH_DIM) SpecId 1
+ Decorate 81(gl_WorkGroupID) BuiltIn WorkgroupId
+ Decorate 133(gl_LocalInvocationID) BuiltIn LocalInvocationId
+ Decorate 178 ArrayStride 4
+ MemberDecorate 179(Fail) 0 Offset 0
+ Decorate 179(Fail) Block
+ Decorate 181(fail) DescriptorSet 0
+ Decorate 181(fail) Binding 2
+ Decorate 185 SpecId 0
+ Decorate 186 SpecId 0
+ Decorate 187 BuiltIn WorkgroupSize
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeBool
+ 7: TypePointer Function 6(bool)
+ 9: 6(bool) ConstantTrue
+ 11: 6(bool) ConstantFalse
+ 12: TypePointer Workgroup 6(bool)
+ 13(sharedSkip): 12(ptr) Variable Workgroup
+ 14: TypeInt 32 0
+ 15: 14(int) Constant 2
+ TypeForwardPointer 16 PhysicalStorageBufferEXT
+ 17: TypeRuntimeArray 14(int)
+ 18(PayloadRef): TypeStruct 17
+ 16: TypePointer PhysicalStorageBufferEXT 18(PayloadRef)
+ 19: TypePointer Function 16(ptr)
+ TypeForwardPointer 21 PhysicalStorageBufferEXT
+ 22(PC): TypeStruct 16(ptr) 21
+ 23: TypeRuntimeArray 14(int)
+ 24(GuardRef): TypeStruct 23
+ 21: TypePointer PhysicalStorageBufferEXT 24(GuardRef)
+ 25: TypePointer PushConstant 22(PC)
+ 26: 25(ptr) Variable PushConstant
+ 27: TypeInt 32 1
+ 28: 27(int) Constant 0
+ 29: TypePointer PushConstant 16(ptr)
+ 32: TypeVector 27(int) 2
+ 33: TypePointer Function 32(ivec2)
+ 35: TypeVector 14(int) 3
+ 36: TypePointer Input 35(ivec3)
+37(gl_GlobalInvocationID): 36(ptr) Variable Input
+ 38: TypeVector 14(int) 2
+ 43(DIM): 27(int) SpecConstant 1
+44(NUM_WORKGROUP_EACH_DIM): 27(int) SpecConstant 1
+ 45: 27(int) SpecConstantOp 132 43(DIM) 44(NUM_WORKGROUP_EACH_DIM)
+ 46: 27(int) Constant 1
+ 47: 27(int) SpecConstantOp 130 45 46
+ 48: 32(ivec2) SpecConstantComposite 47 47
+ 53: TypePointer Function 14(int)
+ 55: 14(int) Constant 1
+ 56: TypePointer Function 27(int)
+ 61: 14(int) Constant 0
+ 80: 32(ivec2) SpecConstantComposite 43(DIM) 43(DIM)
+81(gl_WorkGroupID): 36(ptr) Variable Input
+ 87: 32(ivec2) SpecConstantComposite 43(DIM) 43(DIM)
+ 88: 27(int) SpecConstantOp 130 44(NUM_WORKGROUP_EACH_DIM) 46
+ 89: 32(ivec2) SpecConstantComposite 88 88
+ 122: TypePointer PhysicalStorageBufferEXT 14(int)
+ 125: 27(int) Constant 31
+ 129: 27(int) Constant 2
+ 130: 27(int) Constant 320
+ 131: 27(int) Constant 8200
+ 132: 14(int) Constant 8520
+133(gl_LocalInvocationID): 36(ptr) Variable Input
+ 136: 38(ivec2) ConstantComposite 61 61
+ 137: TypeVector 6(bool) 2
+ 142: TypePointer PushConstant 21(ptr)
+ 147: 27(int) Constant 64
+ 148: 27(int) Constant 8196
+ 149: 14(int) Constant 5
+ 150: 14(int) Constant 8260
+ 155: 27(int) Constant 16386
+ 156: 14(int) Constant 16450
+ 160: 27(int) Constant 16392
+ 161: 14(int) Constant 16712
+ 178: TypeRuntimeArray 14(int)
+ 179(Fail): TypeStruct 178
+ 180: TypePointer StorageBuffer 179(Fail)
+ 181(fail): 180(ptr) Variable StorageBuffer
+ 183: TypePointer StorageBuffer 14(int)
+ 185: 14(int) SpecConstant 1
+ 186: 14(int) SpecConstant 1
+ 187: 35(ivec3) SpecConstantComposite 185 186 55
+ 4(main): 2 Function None 3
+ 5: Label
+ 8(pass): 7(ptr) Variable Function
+ 10(skip): 7(ptr) Variable Function
+ 20(payload): 19(ptr) Variable Function
+ 34(globalId): 33(ptr) Variable Function
+42(partnerGlobalId): 33(ptr) Variable Function
+ 54(bufferCoord): 53(ptr) Variable Function
+66(partnerBufferCoord): 53(ptr) Variable Function
+ 75(imageCoord): 33(ptr) Variable Function
+77(partnerImageCoord): 33(ptr) Variable Function
+ 79(globalId00): 33(ptr) Variable Function
+86(partnerGlobalId00): 33(ptr) Variable Function
+95(bufferCoord00): 53(ptr) Variable Function
+104(partnerBufferCoord00): 53(ptr) Variable Function
+113(imageCoord00): 33(ptr) Variable Function
+115(partnerImageCoord00): 33(ptr) Variable Function
+ 163(r): 53(ptr) Variable Function
+ Store 8(pass) 9
+ Store 10(skip) 11
+ Store 13(sharedSkip) 11 MakePointerAvailableKHR NonPrivatePointerKHR 15
+ 30: 29(ptr) AccessChain 26 28
+ 31: 16(ptr) Load 30
+ Store 20(payload) 31
+ 39: 35(ivec3) Load 37(gl_GlobalInvocationID)
+ 40: 38(ivec2) VectorShuffle 39 39 0 1
+ 41: 32(ivec2) Bitcast 40
+ Store 34(globalId) 41
+ 49: 35(ivec3) Load 37(gl_GlobalInvocationID)
+ 50: 38(ivec2) VectorShuffle 49 49 0 1
+ 51: 32(ivec2) Bitcast 50
+ 52: 32(ivec2) ISub 48 51
+ Store 42(partnerGlobalId) 52
+ 57: 56(ptr) AccessChain 34(globalId) 55
+ 58: 27(int) Load 57
+ 59: 27(int) IMul 58 43(DIM)
+ 60: 27(int) IMul 59 44(NUM_WORKGROUP_EACH_DIM)
+ 62: 56(ptr) AccessChain 34(globalId) 61
+ 63: 27(int) Load 62
+ 64: 27(int) IAdd 60 63
+ 65: 14(int) Bitcast 64
+ Store 54(bufferCoord) 65
+ 67: 56(ptr) AccessChain 42(partnerGlobalId) 55
+ 68: 27(int) Load 67
+ 69: 27(int) IMul 68 43(DIM)
+ 70: 27(int) IMul 69 44(NUM_WORKGROUP_EACH_DIM)
+ 71: 56(ptr) AccessChain 42(partnerGlobalId) 61
+ 72: 27(int) Load 71
+ 73: 27(int) IAdd 70 72
+ 74: 14(int) Bitcast 73
+ Store 66(partnerBufferCoord) 74
+ 76: 32(ivec2) Load 34(globalId)
+ Store 75(imageCoord) 76
+ 78: 32(ivec2) Load 42(partnerGlobalId)
+ Store 77(partnerImageCoord) 78
+ 82: 35(ivec3) Load 81(gl_WorkGroupID)
+ 83: 38(ivec2) VectorShuffle 82 82 0 1
+ 84: 32(ivec2) Bitcast 83
+ 85: 32(ivec2) IMul 80 84
+ Store 79(globalId00) 85
+ 90: 35(ivec3) Load 81(gl_WorkGroupID)
+ 91: 38(ivec2) VectorShuffle 90 90 0 1
+ 92: 32(ivec2) Bitcast 91
+ 93: 32(ivec2) ISub 89 92
+ 94: 32(ivec2) IMul 87 93
+ Store 86(partnerGlobalId00) 94
+ 96: 56(ptr) AccessChain 79(globalId00) 55
+ 97: 27(int) Load 96
+ 98: 27(int) IMul 97 43(DIM)
+ 99: 27(int) IMul 98 44(NUM_WORKGROUP_EACH_DIM)
+ 100: 56(ptr) AccessChain 79(globalId00) 61
+ 101: 27(int) Load 100
+ 102: 27(int) IAdd 99 101
+ 103: 14(int) Bitcast 102
+ Store 95(bufferCoord00) 103
+ 105: 56(ptr) AccessChain 86(partnerGlobalId00) 55
+ 106: 27(int) Load 105
+ 107: 27(int) IMul 106 43(DIM)
+ 108: 27(int) IMul 107 44(NUM_WORKGROUP_EACH_DIM)
+ 109: 56(ptr) AccessChain 86(partnerGlobalId00) 61
+ 110: 27(int) Load 109
+ 111: 27(int) IAdd 108 110
+ 112: 14(int) Bitcast 111
+ Store 104(partnerBufferCoord00) 112
+ 114: 32(ivec2) Load 79(globalId00)
+ Store 113(imageCoord00) 114
+ 116: 32(ivec2) Load 86(partnerGlobalId00)
+ Store 115(partnerImageCoord00) 116
+ 117: 16(ptr) Load 20(payload)
+ 118: 14(int) Load 54(bufferCoord)
+ 119: 14(int) Load 54(bufferCoord)
+ 120: 16(ptr) Load 20(payload)
+ 121: 14(int) Load 66(partnerBufferCoord)
+ 123: 122(ptr) AccessChain 120 28 121
+ 124: 14(int) Load 123 Aligned NonPrivatePointerKHR 4
+ 126: 14(int) ShiftRightLogical 124 125
+ 127: 14(int) IAdd 119 126
+ 128: 122(ptr) AccessChain 117 28 118
+ Store 128 127 Aligned NonPrivatePointerKHR 4
+ ControlBarrier 15 15 132
+ 134: 35(ivec3) Load 133(gl_LocalInvocationID)
+ 135: 38(ivec2) VectorShuffle 134 134 0 1
+ 138: 137(bvec2) IEqual 135 136
+ 139: 6(bool) All 138
+ SelectionMerge 141 None
+ BranchConditional 139 140 141
+ 140: Label
+ 143: 142(ptr) AccessChain 26 46
+ 144: 21(ptr) Load 143
+ 145: 14(int) Load 54(bufferCoord)
+ 146: 122(ptr) AccessChain 144 28 145
+ AtomicStore 146 46 150 55
+ 151: 142(ptr) AccessChain 26 46
+ 152: 21(ptr) Load 151
+ 153: 14(int) Load 104(partnerBufferCoord00)
+ 154: 122(ptr) AccessChain 152 28 153
+ 157: 14(int) AtomicLoad 154 46 156
+ 158: 6(bool) IEqual 157 61
+ Store 10(skip) 158
+ 159: 6(bool) Load 10(skip)
+ Store 13(sharedSkip) 159 MakePointerAvailableKHR NonPrivatePointerKHR 15
+ Branch 141
+ 141: Label
+ ControlBarrier 15 15 161
+ 162: 6(bool) Load 13(sharedSkip) MakePointerVisibleKHR NonPrivatePointerKHR 15
+ Store 10(skip) 162
+ 164: 16(ptr) Load 20(payload)
+ 165: 14(int) Load 66(partnerBufferCoord)
+ 166: 122(ptr) AccessChain 164 28 165
+ 167: 14(int) Load 166 Aligned NonPrivatePointerKHR 4
+ Store 163(r) 167
+ 168: 6(bool) Load 10(skip)
+ 169: 6(bool) LogicalNot 168
+ SelectionMerge 171 None
+ BranchConditional 169 170 171
+ 170: Label
+ 172: 14(int) Load 163(r)
+ 173: 14(int) Load 66(partnerBufferCoord)
+ 174: 6(bool) INotEqual 172 173
+ Branch 171
+ 171: Label
+ 175: 6(bool) Phi 169 141 174 170
+ SelectionMerge 177 None
+ BranchConditional 175 176 177
+ 176: Label
+ 182: 14(int) Load 54(bufferCoord)
+ 184: 183(ptr) AccessChain 181(fail) 28 182
+ Store 184 55
+ Branch 177
+ 177: Label
+ Return
+ FunctionEnd
--- /dev/null
+#version 450 core
+#pragma use_vulkan_memory_model
+#extension GL_KHR_shader_subgroup_basic : enable
+#extension GL_KHR_shader_subgroup_shuffle : enable
+#extension GL_KHR_shader_subgroup_ballot : enable
+#extension GL_KHR_memory_scope_semantics : enable
+#extension GL_ARB_gpu_shader_int64 : enable
+#extension GL_EXT_buffer_reference : enable
+// DIM/NUM_WORKGROUP_EACH_DIM overriden by spec constants
+layout(constant_id = 0) const int DIM = 1;
+layout(constant_id = 1) const int NUM_WORKGROUP_EACH_DIM = 1;
+shared bool sharedSkip;
+layout(local_size_x_id = 0, local_size_y_id = 0, local_size_z = 1) in;
+layout(buffer_reference) buffer PayloadRef { uint x[]; };
+layout(buffer_reference) buffer GuardRef { uint x[]; };
+layout(set=0, binding=2) buffer Fail { uint x[]; } fail;
+layout (push_constant, std430) uniform PC {
+ layout(offset = 0) PayloadRef payloadref;
+layout(offset = 8) GuardRef guard;
+};
+void main()
+{
+ bool pass = true;
+ bool skip = false;
+ sharedSkip = false;
+ nonprivate PayloadRef payload = payloadref;
+ ivec2 globalId = ivec2(gl_GlobalInvocationID.xy);
+ ivec2 partnerGlobalId = ivec2(DIM*NUM_WORKGROUP_EACH_DIM-1) - ivec2(gl_GlobalInvocationID.xy);
+ uint bufferCoord = globalId.y * DIM*NUM_WORKGROUP_EACH_DIM + globalId.x;
+ uint partnerBufferCoord = partnerGlobalId.y * DIM*NUM_WORKGROUP_EACH_DIM + partnerGlobalId.x;
+ ivec2 imageCoord = globalId;
+ ivec2 partnerImageCoord = partnerGlobalId;
+ ivec2 globalId00 = ivec2(DIM) * ivec2(gl_WorkGroupID.xy);
+ ivec2 partnerGlobalId00 = ivec2(DIM) * (ivec2(NUM_WORKGROUP_EACH_DIM-1) - ivec2(gl_WorkGroupID.xy));
+ uint bufferCoord00 = globalId00.y * DIM*NUM_WORKGROUP_EACH_DIM + globalId00.x;
+ uint partnerBufferCoord00 = partnerGlobalId00.y * DIM*NUM_WORKGROUP_EACH_DIM + partnerGlobalId00.x;
+ ivec2 imageCoord00 = globalId00;
+ ivec2 partnerImageCoord00 = partnerGlobalId00;
+ payload.x[bufferCoord] = bufferCoord + (payload.x[partnerBufferCoord]>>31);
+ controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease | gl_SemanticsMakeAvailable);
+ if (all(equal(gl_LocalInvocationID.xy, ivec2(0,0)))) {
+ atomicStore(guard.x[bufferCoord], uint(1u), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease | gl_SemanticsMakeAvailable);
+ skip = atomicLoad(guard.x[partnerBufferCoord00], gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire | gl_SemanticsMakeVisible) == 0;
+ sharedSkip = skip;
+ }
+ controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquireRelease | gl_SemanticsMakeVisible);
+ skip = sharedSkip;
+ uint r = payload.x[partnerBufferCoord];
+ if (!skip && r != uint(partnerBufferCoord)) { fail.x[bufferCoord] = 1; }
+}
\ No newline at end of file