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
|
// 'swizzleOkay' says whether or not it is okay to consider a swizzle
|
||||||
// a valid part of the dereference chain.
|
// 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 {
|
do {
|
||||||
const TIntermBinary* binary = node->getAsBinaryNode();
|
const TIntermBinary* binary = node->getAsBinaryNode();
|
||||||
@ -2694,6 +2698,8 @@ const TIntermTyped* TIntermediate::findLValueBase(const TIntermTyped* node, bool
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
node = node->getAsBinaryNode()->getLeft();
|
node = node->getAsBinaryNode()->getLeft();
|
||||||
|
if (bufferReferenceOk && node->isReference())
|
||||||
|
return node;
|
||||||
} while (true);
|
} while (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2409,6 +2409,14 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
|
|||||||
arg0->getType().isFloatingDomain()) {
|
arg0->getType().isFloatingDomain()) {
|
||||||
requireExtensions(loc, 1, &E_GL_EXT_shader_atomic_float2, fnCandidate.getName().c_str());
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -538,7 +538,7 @@ public:
|
|||||||
TIntermTyped* foldSwizzle(TIntermTyped* node, TSwizzleSelectors<TVectorSelector>& fields, const TSourceLoc&);
|
TIntermTyped* foldSwizzle(TIntermTyped* node, TSwizzleSelectors<TVectorSelector>& fields, const TSourceLoc&);
|
||||||
|
|
||||||
// Tree ops
|
// Tree ops
|
||||||
static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay);
|
static const TIntermTyped* findLValueBase(const TIntermTyped*, bool swizzleOkay , bool BufferReferenceOk = false);
|
||||||
|
|
||||||
// Linkage related
|
// Linkage related
|
||||||
void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
|
void addSymbolLinkageNodes(TIntermAggregate*& linkage, EShLanguage, TSymbolTable&);
|
||||||
|
@ -282,6 +282,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"terminate.vert",
|
"terminate.vert",
|
||||||
"negativeWorkGroupSize.comp",
|
"negativeWorkGroupSize.comp",
|
||||||
"textureoffset_sampler2darrayshadow.vert",
|
"textureoffset_sampler2darrayshadow.vert",
|
||||||
|
"atomicAdd.comp",
|
||||||
})),
|
})),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
@ -465,6 +465,7 @@ INSTANTIATE_TEST_SUITE_P(
|
|||||||
"spv.smBuiltins.frag",
|
"spv.smBuiltins.frag",
|
||||||
"spv.builtin.PrimitiveShadingRateEXT.vert",
|
"spv.builtin.PrimitiveShadingRateEXT.vert",
|
||||||
"spv.builtin.ShadingRateEXT.frag",
|
"spv.builtin.ShadingRateEXT.frag",
|
||||||
|
"spv.atomicAdd.bufferReference.comp"
|
||||||
})),
|
})),
|
||||||
FileNameAsCustomTestSuffix
|
FileNameAsCustomTestSuffix
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user