mirror of
https://github.com/KhronosGroup/glslang
synced 2024-11-08 11:30:06 +00:00
Atomic memory function can only be used for shader storage block member or shared variable.
Signed-off-by: ZhiqianXia <xzq0528@outlook.com>
This commit is contained in:
parent
4b7b86d568
commit
cf52f73a0c
19
Test/atomicAdd.comp
Normal file
19
Test/atomicAdd.comp
Normal file
@ -0,0 +1,19 @@
|
||||
#version 320 es
|
||||
layout(local_size_x = 1) in;
|
||||
|
||||
struct structType{
|
||||
int y[3];
|
||||
};
|
||||
|
||||
layout(std430) buffer t2 {
|
||||
structType f;
|
||||
} t;
|
||||
|
||||
buffer coherent Buffer { int x; };
|
||||
int z;
|
||||
|
||||
void main() {
|
||||
atomicAdd(x, 1);
|
||||
atomicAdd(t.f.y[1], 1);
|
||||
atomicAdd(z, 1);
|
||||
}
|
87
Test/baseResults/atomicAdd.comp.out
Normal file
87
Test/baseResults/atomicAdd.comp.out
Normal file
@ -0,0 +1,87 @@
|
||||
atomicAdd.comp
|
||||
ERROR: 0:18: 'atomicAdd' : Atomic memory function can only be used for shader storage block member or shared variable.
|
||||
ERROR: 1 compilation errors. No code generated.
|
||||
|
||||
|
||||
Shader version: 320
|
||||
local_size = (1, 1, 1)
|
||||
ERROR: node is still EOpNull!
|
||||
0:15 Function Definition: main( ( global void)
|
||||
0:15 Function Parameters:
|
||||
0:16 Sequence
|
||||
0:16 AtomicAdd ( global highp int)
|
||||
0:16 x: direct index for structure (layout( column_major shared) coherent buffer highp int)
|
||||
0:16 'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
|
||||
0:16 Constant:
|
||||
0:16 0 (const uint)
|
||||
0:16 Constant:
|
||||
0:16 1 (const int)
|
||||
0:17 AtomicAdd ( global highp int)
|
||||
0:17 direct index (layout( std430) temp highp int)
|
||||
0:17 y: direct index for structure (layout( std430) global 3-element array of highp int)
|
||||
0:17 f: direct index for structure (layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y})
|
||||
0:17 't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
|
||||
0:17 Constant:
|
||||
0:17 0 (const int)
|
||||
0:17 Constant:
|
||||
0:17 0 (const int)
|
||||
0:17 Constant:
|
||||
0:17 1 (const int)
|
||||
0:17 Constant:
|
||||
0:17 1 (const int)
|
||||
0:18 AtomicAdd ( global highp int)
|
||||
0:18 'z' ( global highp int)
|
||||
0:18 Constant:
|
||||
0:18 1 (const int)
|
||||
0:? Linker Objects
|
||||
0:? 'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
|
||||
0:? 1 (const uint)
|
||||
0:? 1 (const uint)
|
||||
0:? 1 (const uint)
|
||||
0:? 't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
|
||||
0:? 'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
|
||||
0:? 'z' ( global highp int)
|
||||
|
||||
|
||||
Linked compute stage:
|
||||
|
||||
|
||||
Shader version: 320
|
||||
local_size = (1, 1, 1)
|
||||
ERROR: node is still EOpNull!
|
||||
0:15 Function Definition: main( ( global void)
|
||||
0:15 Function Parameters:
|
||||
0:16 Sequence
|
||||
0:16 AtomicAdd ( global highp int)
|
||||
0:16 x: direct index for structure (layout( column_major shared) coherent buffer highp int)
|
||||
0:16 'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
|
||||
0:16 Constant:
|
||||
0:16 0 (const uint)
|
||||
0:16 Constant:
|
||||
0:16 1 (const int)
|
||||
0:17 AtomicAdd ( global highp int)
|
||||
0:17 direct index (layout( std430) temp highp int)
|
||||
0:17 y: direct index for structure (layout( std430) global 3-element array of highp int)
|
||||
0:17 f: direct index for structure (layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y})
|
||||
0:17 't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
|
||||
0:17 Constant:
|
||||
0:17 0 (const int)
|
||||
0:17 Constant:
|
||||
0:17 0 (const int)
|
||||
0:17 Constant:
|
||||
0:17 1 (const int)
|
||||
0:17 Constant:
|
||||
0:17 1 (const int)
|
||||
0:18 AtomicAdd ( global highp int)
|
||||
0:18 'z' ( global highp int)
|
||||
0:18 Constant:
|
||||
0:18 1 (const int)
|
||||
0:? Linker Objects
|
||||
0:? 'gl_WorkGroupSize' ( const highp 3-component vector of uint WorkGroupSize)
|
||||
0:? 1 (const uint)
|
||||
0:? 1 (const uint)
|
||||
0:? 1 (const uint)
|
||||
0:? 't' (layout( column_major std430) buffer block{layout( column_major std430 offset=0) buffer structure{layout( std430) global 3-element array of highp int y} f})
|
||||
0:? 'anon@0' (layout( column_major shared) coherent buffer block{layout( column_major shared) coherent buffer highp int x})
|
||||
0:? 'z' ( global highp int)
|
||||
|
304
Test/baseResults/spv.atomicAdd.bufferReference.comp.out
Normal file
304
Test/baseResults/spv.atomicAdd.bufferReference.comp.out
Normal file
@ -0,0 +1,304 @@
|
||||
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
|
50
Test/spv.atomicAdd.bufferReference.comp
Normal file
50
Test/spv.atomicAdd.bufferReference.comp
Normal file
@ -0,0 +1,50 @@
|
||||
#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; }
|
||||
}
|
@ -2676,7 +2676,11 @@ TIntermTyped* TIntermediate::addSwizzle(TSwizzleSelectors<selectorType>& selecto
|
||||
// 'swizzleOkay' says whether or not it is okay to consider a swizzle
|
||||
// a valid part of the dereference chain.
|
||||
//
|
||||
const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool swizzleOkay)
|
||||
// 'BufferReferenceOk' says if type is buffer_reference, the routine stop to find the most left node.
|
||||
//
|
||||
//
|
||||
|
||||
const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool swizzleOkay , bool bufferReferenceOk)
|
||||
{
|
||||
do {
|
||||
const TIntermBinary* binary = node->getAsBinaryNode();
|
||||
@ -2694,6 +2698,8 @@ const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool
|
||||
return nullptr;
|
||||
}
|
||||
node = node->getAsBinaryNode()->getLeft();
|
||||
if (bufferReferenceOk && node->isReference())
|
||||
return node;
|
||||
} while (true);
|
||||
}
|
||||
|
||||
|
@ -2409,6 +2409,14 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
|
||||
arg0->getType().isFloatingDomain()) {
|
||||
requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str());
|
||||
}
|
||||
|
||||
const TIntermTyped* base = TIntermediate::findLValueBase(arg0, true , true);
|
||||
const TType* refType = (base->getType().isReference()) ? base->getType().getReferentType() : nullptr;
|
||||
const TQualifier& qualifier = (refType != nullptr) ? refType->getQualifier() : base->getType().getQualifier();
|
||||
if (qualifier.storage != EvqShared && qualifier.storage != EvqBuffer)
|
||||
error(loc,"Atomic memory function can only be used for shader storage block member or shared variable.",
|
||||
fnCandidate.getName().c_str(), "");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -538,7 +538,7 @@ public:
|
||||
TIntermTyped* foldSwizzle(TIntermTyped* node, TSwizzleSelectors<TVectorSelector>& fields, const TSourceLoc&);
|
||||
|
||||
// Tree ops
|
||||
static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay);
|
||||
static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay , bool BufferReferenceOk = false);
|
||||
|
||||
// Linkage related
|
||||
void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
|
||||
|
@ -282,6 +282,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||
"terminate.vert",
|
||||
"negativeWorkGroupSize.comp",
|
||||
"textureoffset_sampler2darrayshadow.vert",
|
||||
"atomicAdd.comp",
|
||||
})),
|
||||
FileNameAsCustomTestSuffix
|
||||
);
|
||||
|
@ -465,6 +465,7 @@ INSTANTIATE_TEST_SUITE_P(
|
||||
"spv.smBuiltins.frag",
|
||||
"spv.builtin.PrimitiveShadingRateEXT.vert",
|
||||
"spv.builtin.ShadingRateEXT.frag",
|
||||
"spv.atomicAdd.bufferReference.comp"
|
||||
})),
|
||||
FileNameAsCustomTestSuffix
|
||||
);
|
||||
|
Loading…
Reference in New Issue
Block a user