ClearLoadStore.bsl 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. shader ClearLoadStore
  2. {
  3. featureset = HighEnd;
  4. variations
  5. {
  6. // 0 - Texture, 1 - Texture array, 2 - Buffer, 3 - StructuredBuffer
  7. OBJ_TYPE = { 0, 1, 2, 3 };
  8. // 0 - Float, 1 - Integer
  9. DATA_TYPE = { 0, 1 };
  10. NUM_COMPONENTS = { 0, 1, 2, 3 };
  11. };
  12. code
  13. {
  14. #if DATA_TYPE == 0
  15. #if NUM_COMPONENTS == 0
  16. #define TYPE float
  17. #define CLEAR_VAL gFloatClearVal.x
  18. #elif NUM_COMPONENTS == 1
  19. #define TYPE float2
  20. #define CLEAR_VAL gFloatClearVal.xy
  21. #elif NUM_COMPONENTS == 2
  22. #define TYPE float3
  23. #define CLEAR_VAL gFloatClearVal.xyz
  24. #elif NUM_COMPONENTS == 3
  25. #define TYPE float4
  26. #define CLEAR_VAL gFloatClearVal
  27. #endif
  28. #else
  29. #if NUM_COMPONENTS == 0
  30. #define TYPE uint
  31. #define CLEAR_VAL gIntClearVal.x
  32. #elif NUM_COMPONENTS == 1
  33. #define TYPE uint2
  34. #define CLEAR_VAL gIntClearVal.xy
  35. #elif NUM_COMPONENTS == 2
  36. #define TYPE uint3
  37. #define CLEAR_VAL gIntClearVal.xyz
  38. #elif NUM_COMPONENTS == 3
  39. #define TYPE uint4
  40. #define CLEAR_VAL gIntClearVal
  41. #endif
  42. #endif
  43. #if OBJ_TYPE == 0
  44. RWTexture2D<TYPE> gOutput;
  45. #elif OBJ_TYPE == 1
  46. RWTexture2DArray<TYPE> gOutput;
  47. #elif OBJ_TYPE == 2
  48. RWBuffer<TYPE> gOutput;
  49. #else
  50. RWStructuredBuffer<TYPE> gOutput;
  51. #endif
  52. [internal]
  53. cbuffer Params
  54. {
  55. uint2 gSize;
  56. float4 gFloatClearVal;
  57. uint4 gIntClearVal;
  58. }
  59. [numthreads(NUM_THREADS, 1, 1)]
  60. void csmain(uint3 groupThreadId : SV_GroupThreadID, uint3 groupId : SV_GroupID)
  61. {
  62. #if OBJ_TYPE == 0 || OBJ_TYPE == 1
  63. uint2 tilePos;
  64. tilePos.x = groupId.x * NUM_THREADS + groupThreadId.x;
  65. tilePos.y = groupId.y * NUM_THREADS + groupThreadId.y;
  66. if(tilePos.x >= gSize.x || tilePos.y >= gSize.y)
  67. return;
  68. for (uint y = 0; y < TILE_SIZE; ++y)
  69. {
  70. for (uint x = 0; x < TILE_SIZE; ++x)
  71. {
  72. uint2 pixelPos = tilePos + uint2(x, y);
  73. if(pixelPos.x >= gSize.x || pixelPos.y >= gSize.y)
  74. continue;
  75. #if OBJ_TYPE == 1
  76. gOutput[uint3(pixelPos, 0)] = CLEAR_VAL;
  77. #else
  78. gOutput[pixelPos] = CLEAR_VAL;
  79. #endif
  80. }
  81. }
  82. #else
  83. uint threadIdx = groupId.x * NUM_THREADS + groupThreadId.x;
  84. uint pos = threadIdx * (TILE_SIZE * TILE_SIZE);
  85. if(pos >= gSize.x)
  86. return;
  87. for (uint x = 0; x < (TILE_SIZE * TILE_SIZE); ++x)
  88. {
  89. uint curPos = pos + x;
  90. if(curPos.x >= gSize.x)
  91. continue;
  92. gOutput[curPos] = CLEAR_VAL;
  93. }
  94. #endif
  95. }
  96. };
  97. };