spv.atomicInt64.comp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #version 450 core
  2. #extension GL_ARB_gpu_shader_int64: enable
  3. #extension GL_NV_shader_atomic_int64: enable
  4. layout(local_size_x = 16, local_size_y = 16) in;
  5. layout(binding = 0) buffer Buffer
  6. {
  7. int64_t i64;
  8. uint64_t u64;
  9. } buf;
  10. struct Struct
  11. {
  12. int64_t i64;
  13. uint64_t u64;
  14. };
  15. shared Struct s;
  16. void main()
  17. {
  18. const int64_t i64c = -24;
  19. const uint64_t u64c = 0xF00000000Ful;
  20. // Test shader storage block
  21. int64_t i64 = 0;
  22. uint64_t u64 = 0;
  23. i64 += atomicMin(buf.i64, i64c);
  24. u64 += atomicMin(buf.u64, u64c);
  25. i64 += atomicMax(buf.i64, i64c);
  26. u64 += atomicMax(buf.u64, u64c);
  27. i64 += atomicAnd(buf.i64, i64c);
  28. u64 += atomicAnd(buf.u64, u64c);
  29. i64 += atomicOr(buf.i64, i64c);
  30. u64 += atomicOr(buf.u64, u64c);
  31. i64 += atomicXor(buf.i64, i64c);
  32. u64 += atomicXor(buf.u64, u64c);
  33. i64 += atomicAdd(buf.i64, i64c);
  34. i64 += atomicExchange(buf.i64, i64c);
  35. i64 += atomicCompSwap(buf.i64, i64c, i64);
  36. buf.i64 = i64;
  37. buf.u64 = u64;
  38. // Test shared variable
  39. i64 = 0;
  40. u64 = 0;
  41. i64 += atomicMin(s.i64, i64c);
  42. u64 += atomicMin(s.u64, u64c);
  43. i64 += atomicMax(s.i64, i64c);
  44. u64 += atomicMax(s.u64, u64c);
  45. i64 += atomicAnd(s.i64, i64c);
  46. u64 += atomicAnd(s.u64, u64c);
  47. i64 += atomicOr(s.i64, i64c);
  48. u64 += atomicOr(s.u64, u64c);
  49. i64 += atomicXor(s.i64, i64c);
  50. u64 += atomicXor(s.u64, u64c);
  51. i64 += atomicAdd(s.i64, i64c);
  52. i64 += atomicExchange(s.i64, i64c);
  53. i64 += atomicCompSwap(s.i64, i64c, i64);
  54. s.i64 = i64;
  55. s.u64 = u64;
  56. }