1 /*
2 * Copyright © 2020 Valve Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23 #include "helpers.h"
24
TEST_F(spirv_test,opload_vis)25 TEST_F(spirv_test, opload_vis)
26 {
27 /*
28 OpCapability Shader
29 OpCapability VulkanMemoryModel
30 OpCapability VulkanMemoryModelDeviceScope
31 %1 = OpExtInstImport "GLSL.std.450"
32 OpMemoryModel Logical Vulkan
33 OpEntryPoint GLCompute %4 "main" %9
34 OpExecutionMode %4 LocalSize 1 1 1
35 OpMemberDecorate %_struct_7 0 Offset 0
36 OpDecorate %_struct_7 Block
37 OpDecorate %9 DescriptorSet 0
38 OpDecorate %9 Binding 0
39 %void = OpTypeVoid
40 %3 = OpTypeFunction %void
41 %uint = OpTypeInt 32 0
42 %_struct_7 = OpTypeStruct %uint
43 %_ptr_StorageBuffer__struct_7 = OpTypePointer StorageBuffer %_struct_7
44 %9 = OpVariable %_ptr_StorageBuffer__struct_7 StorageBuffer
45 %int = OpTypeInt 32 1
46 %int_0 = OpConstant %int 0
47 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
48 %device = OpConstant %int 1
49 %4 = OpFunction %void None %3
50 %5 = OpLabel
51 %13 = OpAccessChain %_ptr_StorageBuffer_uint %9 %int_0
52 %14 = OpLoad %uint %13 NonPrivatePointer|MakePointerVisible %device
53 OpStore %13 %14
54 OpReturn
55 OpFunctionEnd
56 */
57 static const uint32_t words[] = {
58 0x07230203, 0x00010500, 0x00070000, 0x00000010, 0x00000000, 0x00020011,
59 0x00000001, 0x00020011, 0x000014e1, 0x00020011, 0x000014e2, 0x0006000b,
60 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e,
61 0x00000000, 0x00000003, 0x0006000f, 0x00000005, 0x00000002, 0x6e69616d,
62 0x00000000, 0x00000003, 0x00060010, 0x00000002, 0x00000011, 0x00000001,
63 0x00000001, 0x00000001, 0x00050048, 0x00000004, 0x00000000, 0x00000023,
64 0x00000000, 0x00030047, 0x00000004, 0x00000002, 0x00040047, 0x00000003,
65 0x00000022, 0x00000000, 0x00040047, 0x00000003, 0x00000021, 0x00000000,
66 0x00020013, 0x00000005, 0x00030021, 0x00000006, 0x00000005, 0x00040015,
67 0x00000007, 0x00000020, 0x00000000, 0x0003001e, 0x00000004, 0x00000007,
68 0x00040020, 0x00000008, 0x0000000c, 0x00000004, 0x0004003b, 0x00000008,
69 0x00000003, 0x0000000c, 0x00040015, 0x00000009, 0x00000020, 0x00000001,
70 0x0004002b, 0x00000009, 0x0000000a, 0x00000000, 0x00040020, 0x0000000b,
71 0x0000000c, 0x00000007, 0x0004002b, 0x00000009, 0x0000000c, 0x00000001,
72 0x00050036, 0x00000005, 0x00000002, 0x00000000, 0x00000006, 0x000200f8,
73 0x0000000d, 0x00050041, 0x0000000b, 0x0000000e, 0x00000003, 0x0000000a,
74 0x0006003d, 0x00000007, 0x0000000f, 0x0000000e, 0x00000030, 0x0000000c,
75 0x0003003e, 0x0000000e, 0x0000000f, 0x000100fd, 0x00010038,
76 };
77
78 get_nir(sizeof(words) / sizeof(words[0]), words);
79
80 nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_scoped_barrier, 0);
81 ASSERT_NE(intrinsic, nullptr);
82
83 EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
84 EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
85 EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), NIR_SCOPE_DEVICE);
86 EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), NIR_SCOPE_NONE);
87 }
88
TEST_F(spirv_test,opstore_avail)89 TEST_F(spirv_test, opstore_avail)
90 {
91 /*
92 OpCapability Shader
93 OpCapability VulkanMemoryModel
94 OpCapability VulkanMemoryModelDeviceScope
95 %1 = OpExtInstImport "GLSL.std.450"
96 OpMemoryModel Logical Vulkan
97 OpEntryPoint GLCompute %4 "main" %9
98 OpExecutionMode %4 LocalSize 1 1 1
99 OpMemberDecorate %_struct_7 0 Offset 0
100 OpDecorate %_struct_7 Block
101 OpDecorate %9 DescriptorSet 0
102 OpDecorate %9 Binding 0
103 %void = OpTypeVoid
104 %3 = OpTypeFunction %void
105 %uint = OpTypeInt 32 0
106 %_struct_7 = OpTypeStruct %uint
107 %_ptr_StorageBuffer__struct_7 = OpTypePointer StorageBuffer %_struct_7
108 %9 = OpVariable %_ptr_StorageBuffer__struct_7 StorageBuffer
109 %int = OpTypeInt 32 1
110 %int_0 = OpConstant %int 0
111 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
112 %device = OpConstant %int 1
113 %4 = OpFunction %void None %3
114 %5 = OpLabel
115 %13 = OpAccessChain %_ptr_StorageBuffer_uint %9 %int_0
116 %14 = OpLoad %uint %13
117 OpStore %13 %14 NonPrivatePointer|MakePointerAvailable %device
118 OpReturn
119 OpFunctionEnd
120 */
121 static const uint32_t words[] = {
122 0x07230203, 0x00010500, 0x00070000, 0x00000010, 0x00000000, 0x00020011,
123 0x00000001, 0x00020011, 0x000014e1, 0x00020011, 0x000014e2, 0x0006000b,
124 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e,
125 0x00000000, 0x00000003, 0x0006000f, 0x00000005, 0x00000002, 0x6e69616d,
126 0x00000000, 0x00000003, 0x00060010, 0x00000002, 0x00000011, 0x00000001,
127 0x00000001, 0x00000001, 0x00050048, 0x00000004, 0x00000000, 0x00000023,
128 0x00000000, 0x00030047, 0x00000004, 0x00000002, 0x00040047, 0x00000003,
129 0x00000022, 0x00000000, 0x00040047, 0x00000003, 0x00000021, 0x00000000,
130 0x00020013, 0x00000005, 0x00030021, 0x00000006, 0x00000005, 0x00040015,
131 0x00000007, 0x00000020, 0x00000000, 0x0003001e, 0x00000004, 0x00000007,
132 0x00040020, 0x00000008, 0x0000000c, 0x00000004, 0x0004003b, 0x00000008,
133 0x00000003, 0x0000000c, 0x00040015, 0x00000009, 0x00000020, 0x00000001,
134 0x0004002b, 0x00000009, 0x0000000a, 0x00000000, 0x00040020, 0x0000000b,
135 0x0000000c, 0x00000007, 0x0004002b, 0x00000009, 0x0000000c, 0x00000001,
136 0x00050036, 0x00000005, 0x00000002, 0x00000000, 0x00000006, 0x000200f8,
137 0x0000000d, 0x00050041, 0x0000000b, 0x0000000e, 0x00000003, 0x0000000a,
138 0x0004003d, 0x00000007, 0x0000000f, 0x0000000e, 0x0005003e, 0x0000000e,
139 0x0000000f, 0x00000028, 0x0000000c, 0x000100fd, 0x00010038,
140 };
141
142 get_nir(sizeof(words) / sizeof(words[0]), words);
143
144 nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_scoped_barrier, 0);
145 ASSERT_NE(intrinsic, nullptr);
146
147 EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
148 EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
149 EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), NIR_SCOPE_DEVICE);
150 EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), NIR_SCOPE_NONE);
151 }
152
TEST_F(spirv_test,opcopymemory_visavail_both_combined)153 TEST_F(spirv_test, opcopymemory_visavail_both_combined)
154 {
155 /*
156 OpCapability Shader
157 OpCapability VulkanMemoryModel
158 OpCapability VulkanMemoryModelDeviceScope
159 %1 = OpExtInstImport "GLSL.std.450"
160 OpMemoryModel Logical Vulkan
161 OpEntryPoint GLCompute %4 "main" %9
162 OpExecutionMode %4 LocalSize 1 1 1
163 OpMemberDecorate %_struct_7 0 Offset 0
164 OpDecorate %_struct_7 Block
165 OpDecorate %9 DescriptorSet 0
166 OpDecorate %9 Binding 0
167 %void = OpTypeVoid
168 %3 = OpTypeFunction %void
169 %uint = OpTypeInt 32 0
170 %_struct_7 = OpTypeStruct %uint
171 %_ptr_StorageBuffer__struct_7 = OpTypePointer StorageBuffer %_struct_7
172 %9 = OpVariable %_ptr_StorageBuffer__struct_7 StorageBuffer
173 %int = OpTypeInt 32 1
174 %int_0 = OpConstant %int 0
175 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
176 %device = OpConstant %int 1
177 %workgroup = OpConstant %int 2
178 %4 = OpFunction %void None %3
179 %5 = OpLabel
180 %13 = OpAccessChain %_ptr_StorageBuffer_uint %9 %int_0
181 OpCopyMemory %13 %13 NonPrivatePointer|MakePointerAvailable|MakePointerVisible %device %workgroup
182 OpReturn
183 OpFunctionEnd
184 */
185 static const uint32_t words[] = {
186 0x07230203, 0x00010500, 0x00070000, 0x00000010, 0x00000000, 0x00020011,
187 0x00000001, 0x00020011, 0x000014e1, 0x00020011, 0x000014e2, 0x0006000b,
188 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e,
189 0x00000000, 0x00000003, 0x0006000f, 0x00000005, 0x00000002, 0x6e69616d,
190 0x00000000, 0x00000003, 0x00060010, 0x00000002, 0x00000011, 0x00000001,
191 0x00000001, 0x00000001, 0x00050048, 0x00000004, 0x00000000, 0x00000023,
192 0x00000000, 0x00030047, 0x00000004, 0x00000002, 0x00040047, 0x00000003,
193 0x00000022, 0x00000000, 0x00040047, 0x00000003, 0x00000021, 0x00000000,
194 0x00020013, 0x00000005, 0x00030021, 0x00000006, 0x00000005, 0x00040015,
195 0x00000007, 0x00000020, 0x00000000, 0x0003001e, 0x00000004, 0x00000007,
196 0x00040020, 0x00000008, 0x0000000c, 0x00000004, 0x0004003b, 0x00000008,
197 0x00000003, 0x0000000c, 0x00040015, 0x00000009, 0x00000020, 0x00000001,
198 0x0004002b, 0x00000009, 0x0000000a, 0x00000000, 0x00040020, 0x0000000b,
199 0x0000000c, 0x00000007, 0x0004002b, 0x00000009, 0x0000000c, 0x00000001,
200 0x0004002b, 0x00000009, 0x0000000d, 0x00000002, 0x00050036, 0x00000005,
201 0x00000002, 0x00000000, 0x00000006, 0x000200f8, 0x0000000e, 0x00050041,
202 0x0000000b, 0x0000000f, 0x00000003, 0x0000000a, 0x0006003f, 0x0000000f,
203 0x0000000f, 0x00000038, 0x0000000c, 0x0000000d, 0x000100fd, 0x00010038,
204 };
205
206 get_nir(sizeof(words) / sizeof(words[0]), words);
207
208 nir_intrinsic_instr *first = find_intrinsic(nir_intrinsic_scoped_barrier, 0);
209 nir_intrinsic_instr *second = find_intrinsic(nir_intrinsic_scoped_barrier, 1);
210 ASSERT_NE(first, nullptr);
211 ASSERT_NE(second, nullptr);
212
213 EXPECT_EQ(nir_intrinsic_memory_semantics(first), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
214 EXPECT_NE(nir_intrinsic_memory_modes(first) & nir_var_mem_ssbo, 0);
215 EXPECT_EQ(nir_intrinsic_memory_scope(first), NIR_SCOPE_WORKGROUP);
216 EXPECT_EQ(nir_intrinsic_execution_scope(first), NIR_SCOPE_NONE);
217
218 EXPECT_EQ(nir_intrinsic_memory_semantics(second), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
219 EXPECT_NE(nir_intrinsic_memory_modes(second) & nir_var_mem_ssbo, 0);
220 EXPECT_EQ(nir_intrinsic_memory_scope(second), NIR_SCOPE_DEVICE);
221 EXPECT_EQ(nir_intrinsic_execution_scope(first), NIR_SCOPE_NONE);
222 }
223
TEST_F(spirv_test,opcopymemory_visavail_both_separate)224 TEST_F(spirv_test, opcopymemory_visavail_both_separate)
225 {
226 /*
227 OpCapability Shader
228 OpCapability VulkanMemoryModel
229 OpCapability VulkanMemoryModelDeviceScope
230 %1 = OpExtInstImport "GLSL.std.450"
231 OpMemoryModel Logical Vulkan
232 OpEntryPoint GLCompute %4 "main" %9
233 OpExecutionMode %4 LocalSize 1 1 1
234 OpMemberDecorate %_struct_7 0 Offset 0
235 OpDecorate %_struct_7 Block
236 OpDecorate %9 DescriptorSet 0
237 OpDecorate %9 Binding 0
238 %void = OpTypeVoid
239 %3 = OpTypeFunction %void
240 %uint = OpTypeInt 32 0
241 %_struct_7 = OpTypeStruct %uint
242 %_ptr_StorageBuffer__struct_7 = OpTypePointer StorageBuffer %_struct_7
243 %9 = OpVariable %_ptr_StorageBuffer__struct_7 StorageBuffer
244 %int = OpTypeInt 32 1
245 %int_0 = OpConstant %int 0
246 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
247 %device = OpConstant %int 1
248 %workgroup = OpConstant %int 2
249 %4 = OpFunction %void None %3
250 %5 = OpLabel
251 %13 = OpAccessChain %_ptr_StorageBuffer_uint %9 %int_0
252 OpCopyMemory %13 %13 NonPrivatePointer|MakePointerAvailable %device NonPrivatePointer|MakePointerVisible %workgroup
253 OpReturn
254 OpFunctionEnd
255 */
256 static const uint32_t words[] = {
257 0x07230203, 0x00010500, 0x00070000, 0x00000010, 0x00000000, 0x00020011,
258 0x00000001, 0x00020011, 0x000014e1, 0x00020011, 0x000014e2, 0x0006000b,
259 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e,
260 0x00000000, 0x00000003, 0x0006000f, 0x00000005, 0x00000002, 0x6e69616d,
261 0x00000000, 0x00000003, 0x00060010, 0x00000002, 0x00000011, 0x00000001,
262 0x00000001, 0x00000001, 0x00050048, 0x00000004, 0x00000000, 0x00000023,
263 0x00000000, 0x00030047, 0x00000004, 0x00000002, 0x00040047, 0x00000003,
264 0x00000022, 0x00000000, 0x00040047, 0x00000003, 0x00000021, 0x00000000,
265 0x00020013, 0x00000005, 0x00030021, 0x00000006, 0x00000005, 0x00040015,
266 0x00000007, 0x00000020, 0x00000000, 0x0003001e, 0x00000004, 0x00000007,
267 0x00040020, 0x00000008, 0x0000000c, 0x00000004, 0x0004003b, 0x00000008,
268 0x00000003, 0x0000000c, 0x00040015, 0x00000009, 0x00000020, 0x00000001,
269 0x0004002b, 0x00000009, 0x0000000a, 0x00000000, 0x00040020, 0x0000000b,
270 0x0000000c, 0x00000007, 0x0004002b, 0x00000009, 0x0000000c, 0x00000001,
271 0x0004002b, 0x00000009, 0x0000000d, 0x00000002, 0x00050036, 0x00000005,
272 0x00000002, 0x00000000, 0x00000006, 0x000200f8, 0x0000000e, 0x00050041,
273 0x0000000b, 0x0000000f, 0x00000003, 0x0000000a, 0x0007003f, 0x0000000f,
274 0x0000000f, 0x00000028, 0x0000000c, 0x00000030, 0x0000000d, 0x000100fd,
275 0x00010038,
276 };
277
278 get_nir(sizeof(words) / sizeof(words[0]), words);
279
280 nir_intrinsic_instr *first = find_intrinsic(nir_intrinsic_scoped_barrier, 0);
281 nir_intrinsic_instr *second = find_intrinsic(nir_intrinsic_scoped_barrier, 1);
282 ASSERT_NE(first, nullptr);
283 ASSERT_NE(second, nullptr);
284
285 EXPECT_EQ(nir_intrinsic_memory_semantics(first), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
286 EXPECT_NE(nir_intrinsic_memory_modes(first) & nir_var_mem_ssbo, 0);
287 EXPECT_EQ(nir_intrinsic_memory_scope(first), NIR_SCOPE_WORKGROUP);
288 EXPECT_EQ(nir_intrinsic_execution_scope(first), NIR_SCOPE_NONE);
289
290 EXPECT_EQ(nir_intrinsic_memory_semantics(second), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
291 EXPECT_NE(nir_intrinsic_memory_modes(second) & nir_var_mem_ssbo, 0);
292 EXPECT_EQ(nir_intrinsic_memory_scope(second), NIR_SCOPE_DEVICE);
293 EXPECT_EQ(nir_intrinsic_execution_scope(second), NIR_SCOPE_NONE);
294 }
295
TEST_F(spirv_test,opcopymemory_avail)296 TEST_F(spirv_test, opcopymemory_avail)
297 {
298 /*
299 OpCapability Shader
300 OpCapability VulkanMemoryModel
301 OpCapability VulkanMemoryModelDeviceScope
302 %1 = OpExtInstImport "GLSL.std.450"
303 OpMemoryModel Logical Vulkan
304 OpEntryPoint GLCompute %4 "main" %9
305 OpExecutionMode %4 LocalSize 1 1 1
306 OpMemberDecorate %_struct_7 0 Offset 0
307 OpDecorate %_struct_7 Block
308 OpDecorate %9 DescriptorSet 0
309 OpDecorate %9 Binding 0
310 %void = OpTypeVoid
311 %3 = OpTypeFunction %void
312 %uint = OpTypeInt 32 0
313 %_struct_7 = OpTypeStruct %uint
314 %_ptr_StorageBuffer__struct_7 = OpTypePointer StorageBuffer %_struct_7
315 %9 = OpVariable %_ptr_StorageBuffer__struct_7 StorageBuffer
316 %int = OpTypeInt 32 1
317 %int_0 = OpConstant %int 0
318 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
319 %device = OpConstant %int 1
320 %4 = OpFunction %void None %3
321 %5 = OpLabel
322 %13 = OpAccessChain %_ptr_StorageBuffer_uint %9 %int_0
323 OpCopyMemory %13 %13 NonPrivatePointer|MakePointerAvailable %device
324 OpReturn
325 OpFunctionEnd
326 */
327 static const uint32_t words[] = {
328 0x07230203, 0x00010500, 0x00070000, 0x0000000f, 0x00000000, 0x00020011,
329 0x00000001, 0x00020011, 0x000014e1, 0x00020011, 0x000014e2, 0x0006000b,
330 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e,
331 0x00000000, 0x00000003, 0x0006000f, 0x00000005, 0x00000002, 0x6e69616d,
332 0x00000000, 0x00000003, 0x00060010, 0x00000002, 0x00000011, 0x00000001,
333 0x00000001, 0x00000001, 0x00050048, 0x00000004, 0x00000000, 0x00000023,
334 0x00000000, 0x00030047, 0x00000004, 0x00000002, 0x00040047, 0x00000003,
335 0x00000022, 0x00000000, 0x00040047, 0x00000003, 0x00000021, 0x00000000,
336 0x00020013, 0x00000005, 0x00030021, 0x00000006, 0x00000005, 0x00040015,
337 0x00000007, 0x00000020, 0x00000000, 0x0003001e, 0x00000004, 0x00000007,
338 0x00040020, 0x00000008, 0x0000000c, 0x00000004, 0x0004003b, 0x00000008,
339 0x00000003, 0x0000000c, 0x00040015, 0x00000009, 0x00000020, 0x00000001,
340 0x0004002b, 0x00000009, 0x0000000a, 0x00000000, 0x00040020, 0x0000000b,
341 0x0000000c, 0x00000007, 0x0004002b, 0x00000009, 0x0000000c, 0x00000001,
342 0x00050036, 0x00000005, 0x00000002, 0x00000000, 0x00000006, 0x000200f8,
343 0x0000000d, 0x00050041, 0x0000000b, 0x0000000e, 0x00000003, 0x0000000a,
344 0x0005003f, 0x0000000e, 0x0000000e, 0x00000028, 0x0000000c, 0x000100fd,
345 0x00010038,
346 };
347
348 get_nir(sizeof(words) / sizeof(words[0]), words);
349
350 nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_scoped_barrier, 0);
351 ASSERT_NE(intrinsic, nullptr);
352
353 EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_AVAILABLE | NIR_MEMORY_RELEASE);
354 EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
355 EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), NIR_SCOPE_DEVICE);
356 EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), NIR_SCOPE_NONE);
357 }
358
TEST_F(spirv_test,opcopymemory_vis)359 TEST_F(spirv_test, opcopymemory_vis)
360 {
361 /*
362 OpCapability Shader
363 OpCapability VulkanMemoryModel
364 OpCapability VulkanMemoryModelDeviceScope
365 %1 = OpExtInstImport "GLSL.std.450"
366 OpMemoryModel Logical Vulkan
367 OpEntryPoint GLCompute %4 "main" %9
368 OpExecutionMode %4 LocalSize 1 1 1
369 OpMemberDecorate %_struct_7 0 Offset 0
370 OpDecorate %_struct_7 Block
371 OpDecorate %9 DescriptorSet 0
372 OpDecorate %9 Binding 0
373 %void = OpTypeVoid
374 %3 = OpTypeFunction %void
375 %uint = OpTypeInt 32 0
376 %_struct_7 = OpTypeStruct %uint
377 %_ptr_StorageBuffer__struct_7 = OpTypePointer StorageBuffer %_struct_7
378 %9 = OpVariable %_ptr_StorageBuffer__struct_7 StorageBuffer
379 %int = OpTypeInt 32 1
380 %int_0 = OpConstant %int 0
381 %_ptr_StorageBuffer_uint = OpTypePointer StorageBuffer %uint
382 %workgroup = OpConstant %int 2
383 %4 = OpFunction %void None %3
384 %5 = OpLabel
385 %13 = OpAccessChain %_ptr_StorageBuffer_uint %9 %int_0
386 OpCopyMemory %13 %13 NonPrivatePointer|MakePointerVisible %workgroup
387 OpReturn
388 OpFunctionEnd
389 */
390 static const uint32_t words[] = {
391 0x07230203, 0x00010500, 0x00070000, 0x0000000f, 0x00000000, 0x00020011,
392 0x00000001, 0x00020011, 0x000014e1, 0x00020011, 0x000014e2, 0x0006000b,
393 0x00000001, 0x4c534c47, 0x6474732e, 0x3035342e, 0x00000000, 0x0003000e,
394 0x00000000, 0x00000003, 0x0006000f, 0x00000005, 0x00000002, 0x6e69616d,
395 0x00000000, 0x00000003, 0x00060010, 0x00000002, 0x00000011, 0x00000001,
396 0x00000001, 0x00000001, 0x00050048, 0x00000004, 0x00000000, 0x00000023,
397 0x00000000, 0x00030047, 0x00000004, 0x00000002, 0x00040047, 0x00000003,
398 0x00000022, 0x00000000, 0x00040047, 0x00000003, 0x00000021, 0x00000000,
399 0x00020013, 0x00000005, 0x00030021, 0x00000006, 0x00000005, 0x00040015,
400 0x00000007, 0x00000020, 0x00000000, 0x0003001e, 0x00000004, 0x00000007,
401 0x00040020, 0x00000008, 0x0000000c, 0x00000004, 0x0004003b, 0x00000008,
402 0x00000003, 0x0000000c, 0x00040015, 0x00000009, 0x00000020, 0x00000001,
403 0x0004002b, 0x00000009, 0x0000000a, 0x00000000, 0x00040020, 0x0000000b,
404 0x0000000c, 0x00000007, 0x0004002b, 0x00000009, 0x0000000c, 0x00000002,
405 0x00050036, 0x00000005, 0x00000002, 0x00000000, 0x00000006, 0x000200f8,
406 0x0000000d, 0x00050041, 0x0000000b, 0x0000000e, 0x00000003, 0x0000000a,
407 0x0005003f, 0x0000000e, 0x0000000e, 0x00000030, 0x0000000c, 0x000100fd,
408 0x00010038,
409 };
410
411 get_nir(sizeof(words) / sizeof(words[0]), words);
412
413 nir_intrinsic_instr *intrinsic = find_intrinsic(nir_intrinsic_scoped_barrier, 0);
414 ASSERT_NE(intrinsic, nullptr);
415
416 EXPECT_EQ(nir_intrinsic_memory_semantics(intrinsic), NIR_MEMORY_MAKE_VISIBLE | NIR_MEMORY_ACQUIRE);
417 EXPECT_NE(nir_intrinsic_memory_modes(intrinsic) & nir_var_mem_ssbo, 0);
418 EXPECT_EQ(nir_intrinsic_memory_scope(intrinsic), NIR_SCOPE_WORKGROUP);
419 EXPECT_EQ(nir_intrinsic_execution_scope(intrinsic), NIR_SCOPE_NONE);
420 }
421