ColorCopyBetweenMsNonMs.comp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #version 450 core
  2. // +ve for MsToNonMs, -ve for reverse
  3. layout (constant_id = 0) const int convType = 0;
  4. layout (std140, binding = 0) uniform sample_counts_log2_in
  5. {
  6. ivec4 sample_counts_log2;
  7. };
  8. #define R8_ID 1
  9. #define R16_ID 2
  10. #define R32_ID 4
  11. #define RG32_ID 8
  12. #define RGBA32_ID 16
  13. #define R8_TYPE r8ui
  14. #define R16_TYPE r16ui
  15. #define R32_TYPE r32ui
  16. #define RG32_TYPE rg32ui
  17. #define RGBA32_TYPE rgba32ui
  18. #define DECLARE_BINDINGS(type) layout (set = 3, binding = 0, type##_TYPE) uniform uimage2DMS dstMS ## type; \
  19. layout (set = 3, binding = 0, type##_TYPE) uniform uimage2D dst ## type;
  20. #define CASE_SIZE(type) case type##_ID: imageSz = imageSize(dst ## type); break;
  21. #define CASE_CONVERT(type) case type##_ID: imageStore(dst ## type, ivec2(coords), texelFetch(srcMS, shiftedCoords, sampleIdx)); break; \
  22. case -type##_ID: imageStore(dstMS ## type, shiftedCoords, sampleIdx, texelFetch(src, ivec2(coords), 0)); break;
  23. // src tex
  24. layout (set = 2, binding = 0) uniform usampler2DMS srcMS;
  25. layout (set = 2, binding = 0) uniform usampler2D src;
  26. // dst img
  27. DECLARE_BINDINGS(R8)
  28. DECLARE_BINDINGS(R16)
  29. DECLARE_BINDINGS(R32)
  30. DECLARE_BINDINGS(RG32)
  31. DECLARE_BINDINGS(RGBA32)
  32. layout (local_size_x = 32, local_size_y = 32, local_size_z = 1) in;
  33. void main()
  34. {
  35. uvec2 coords = gl_GlobalInvocationID.xy;
  36. ivec2 imageSz = ivec2(0, 0);
  37. switch (convType)
  38. {
  39. case 0: break;
  40. CASE_SIZE(R8 )
  41. CASE_SIZE(R16 )
  42. CASE_SIZE(R32 )
  43. CASE_SIZE(RG32 )
  44. CASE_SIZE(RGBA32)
  45. default:
  46. imageSz = textureSize(src, 0);
  47. break;
  48. }
  49. if (int(coords.x) >= imageSz.x || int(coords.y) >= imageSz.y)
  50. {
  51. return;
  52. }
  53. int deltaX = sample_counts_log2.x - sample_counts_log2.z;
  54. int deltaY = sample_counts_log2.y - sample_counts_log2.w;
  55. int samplesInXLog2 = sample_counts_log2.z;
  56. int samplesInYLog2 = sample_counts_log2.w;
  57. int samplesInX = 1 << samplesInXLog2;
  58. int samplesInY = 1 << samplesInYLog2;
  59. int sampleIdx = ((int(coords.x) >> deltaX) & (samplesInX - 1)) | (((int(coords.y) >> deltaY) & (samplesInY - 1)) << samplesInXLog2);
  60. samplesInXLog2 = sample_counts_log2.x;
  61. samplesInYLog2 = sample_counts_log2.y;
  62. ivec2 shiftedCoords = ivec2(int(coords.x) >> samplesInXLog2, int(coords.y) >> samplesInYLog2);
  63. switch (convType)
  64. {
  65. CASE_CONVERT(R8 )
  66. CASE_CONVERT(R16 )
  67. CASE_CONVERT(R32 )
  68. CASE_CONVERT(RG32 )
  69. CASE_CONVERT(RGBA32)
  70. }
  71. }