Home | History | Annotate | Download | only in Test
      1 #version 450
      2 #extension GL_KHR_memory_scope_semantics : require
      3 #extension GL_ARB_gpu_shader_int64 : require
      4 
      5 #pragma use_vulkan_memory_model
      6 
      7 shared uint value;
      8 shared int atomi;
      9 shared uint atomu;
     10 layout(binding = 0, r32ui) workgroupcoherent uniform uimage2D imageu;
     11 layout(binding = 1, r32i) volatile coherent uniform iimage2D imagei;
     12 layout(binding = 5, r32i) nonprivate uniform iimage2D imagej[2];
     13 layout (binding = 2) buffer BufferU { workgroupcoherent uint x; } bufferu;
     14 layout (binding = 3) coherent buffer BufferI { uint x; } bufferi;
     15 struct A { uint x[2]; };
     16 layout (binding = 4) volatile buffer BufferJ { subgroupcoherent A a; } bufferj[2];
     17 layout (binding = 6) nonprivate uniform sampler2D samp[2];
     18 layout (binding = 7) nonprivate uniform BufferK { uint x; } bufferk;
     19 shared uint64_t atomu64;
     20 shared int64_t atomi64;
     21 
     22 
     23 void main()
     24 {
     25     int origi = atomicAdd(atomi, 3, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
     26     uint origu = atomicAnd(atomu, value);
     27     origi = atomicLoad(atomi, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
     28     atomicStore(atomu, value, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
     29     origi = imageAtomicLoad(imagei, ivec2(0,0), gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
     30     origu = imageAtomicAdd(imageu, ivec2(0,0), 3u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsAcquire);
     31     imageAtomicStore(imageu, ivec2(0,0), 4u, gl_ScopeDevice, gl_StorageSemanticsBuffer, gl_SemanticsRelease);
     32     origu = atomicOr(atomu, 7u, gl_ScopeDevice, 0, 0);
     33     origu = atomicXor(atomu, 7u, gl_ScopeDevice, 0, 0);
     34     origu = atomicMin(atomu, value, gl_ScopeDevice, 0, 0);
     35     origi = atomicMax(atomi, 7, gl_ScopeDevice, 0, 0);
     36     origi = atomicExchange(atomi, origi, gl_ScopeDevice, 0, 0);
     37     origu = atomicCompSwap(atomu, 10u, value, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
     38     atomicAdd(bufferu.x, 1, gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
     39     memoryBarrier(gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsRelease);
     40     controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
     41     controlBarrier(gl_ScopeWorkgroup, gl_ScopeWorkgroup, 0, 0);
     42 
     43     uint y;
     44     y = bufferu.x;
     45     bufferu.x = y;
     46     y = bufferi.x;
     47     y = bufferj[0].a.x[1];
     48     bufferi.x = y;
     49     bufferj[0].a.x[1] = y;
     50     bufferj[0].a = bufferj[1].a;
     51     bufferi.x = bufferk.x;
     52 
     53     imageLoad(imagei, ivec2(0,0));
     54     imageLoad(imagej[0], ivec2(0,0));
     55     imageStore(imagej[1], ivec2(0,0), ivec4(0,0,0,0));
     56     texture(samp[0], vec2(0,0));
     57 
     58     atomu64 = atomicMax(atomu64, uint64_t(7), gl_ScopeDevice, 0, 0);
     59     atomicCompSwap(atomi64, int64_t(10), int64_t(atomu64), gl_ScopeDevice, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire, gl_StorageSemanticsBuffer | gl_StorageSemanticsShared, gl_SemanticsAcquire);
     60 }
     61 
     62