Waveform.compute 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma warning(disable : 3568)
  2. #pragma exclude_renderers gles gles3 d3d11_9x
  3. #include "../StdLib.hlsl"
  4. #include "../Colors.hlsl"
  5. RWStructuredBuffer<uint4> _WaveformBuffer;
  6. Texture2D<float4> _Source;
  7. SamplerState sampler_Source;
  8. CBUFFER_START(Params)
  9. float4 _Params; // x: source width, y: source height, z: linear, w: unused
  10. CBUFFER_END
  11. #define GROUP_SIZE 256
  12. #define GROUP_SIZE_X 16
  13. #define GROUP_SIZE_Y 16
  14. #ifdef DISABLE_COMPUTE_SHADERS
  15. TRIVIAL_COMPUTE_KERNEL(KWaveformGather)
  16. TRIVIAL_COMPUTE_KERNEL(KWaveformClear)
  17. #else
  18. #pragma kernel KWaveformGather
  19. [numthreads(1, GROUP_SIZE, 1)]
  20. void KWaveformGather(uint2 dispatchThreadId : SV_DispatchThreadID)
  21. {
  22. // Gather local group histogram
  23. if (dispatchThreadId.x < uint(_Params.x) && dispatchThreadId.y < uint(_Params.y))
  24. {
  25. float3 color = _Source[dispatchThreadId].rgb;
  26. color = saturate(color);
  27. // We want a gamma-corrected histogram (like Photoshop & all)
  28. if (_Params.z > 0)
  29. color = LinearToSRGB(color);
  30. // Convert channel values to histogram bins
  31. uint3 idx = (uint3)(round(color * (_Params.y - 1)));
  32. idx += dispatchThreadId.x * _Params.y;
  33. if (idx.x > 0u) InterlockedAdd(_WaveformBuffer[idx.x].x, 1u); // Red
  34. if (idx.y > 0u) InterlockedAdd(_WaveformBuffer[idx.y].y, 1u); // Green
  35. if (idx.z > 0u) InterlockedAdd(_WaveformBuffer[idx.z].z, 1u); // Blue
  36. }
  37. }
  38. #pragma kernel KWaveformClear
  39. [numthreads(GROUP_SIZE_X, GROUP_SIZE_Y, 1)]
  40. void KWaveformClear(uint2 dispatchThreadId : SV_DispatchThreadID)
  41. {
  42. if (dispatchThreadId.x < uint(_Params.x) && dispatchThreadId.y < uint(_Params.y))
  43. _WaveformBuffer[dispatchThreadId.y * uint(_Params.x) + dispatchThreadId.x] = uint4(0u, 0u, 0u, 0u);
  44. }
  45. #endif // DISABLE_COMPUTE_SHADERS