Home | History | Annotate | Line # | Download | only in tests
      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 }
    421