~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/compiler/spirv/tests/avail_vis.cpp

  • Committer: mmach
  • Date: 2022-09-22 19:56:13 UTC
  • Revision ID: netbit73@gmail.com-20220922195613-wtik9mmy20tmor0i
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
 
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
 
}