spv.memoryScopeSemantics.comp 3.1 KB

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