Firstborn/Library/PackageCache/com.unity.postprocessing@3.2.2/PostProcessing/Shaders/Debug/Waveform.compute

59 lines
1.9 KiB
Plaintext
Raw Normal View History

2023-03-28 13:24:16 -04:00
#pragma warning(disable : 3568)
#pragma exclude_renderers gles gles3 d3d11_9x
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/StdLib.hlsl"
#include "Packages/com.unity.postprocessing/PostProcessing/Shaders/Colors.hlsl"
RWStructuredBuffer<uint4> _WaveformBuffer;
Texture2D<float4> _Source;
SamplerState sampler_Source;
CBUFFER_START(Params)
float4 _Params; // x: source width, y: source height, z: linear, w: unused
CBUFFER_END
#define GROUP_SIZE 256
#define GROUP_SIZE_X 16
#define GROUP_SIZE_Y 16
#ifdef DISABLE_COMPUTE_SHADERS
TRIVIAL_COMPUTE_KERNEL(KWaveformGather)
TRIVIAL_COMPUTE_KERNEL(KWaveformClear)
#else
#pragma kernel KWaveformGather
[numthreads(1, GROUP_SIZE, 1)]
void KWaveformGather(uint2 dispatchThreadId : SV_DispatchThreadID)
{
// Gather local group histogram
if (dispatchThreadId.x < uint(_Params.x) && dispatchThreadId.y < uint(_Params.y))
{
float3 color = _Source[dispatchThreadId].rgb;
color = saturate(color);
// We want a gamma-corrected histogram (like Photoshop & all)
if (_Params.z > 0)
color = LinearToSRGB(color);
// Convert channel values to histogram bins
uint3 idx = (uint3)(round(color * (_Params.y - 1)));
idx += dispatchThreadId.x * _Params.y;
if (idx.x > 0u) InterlockedAdd(_WaveformBuffer[idx.x].x, 1u); // Red
if (idx.y > 0u) InterlockedAdd(_WaveformBuffer[idx.y].y, 1u); // Green
if (idx.z > 0u) InterlockedAdd(_WaveformBuffer[idx.z].z, 1u); // Blue
}
}
#pragma kernel KWaveformClear
[numthreads(GROUP_SIZE_X, GROUP_SIZE_Y, 1)]
void KWaveformClear(uint2 dispatchThreadId : SV_DispatchThreadID)
{
if (dispatchThreadId.x < uint(_Params.x) && dispatchThreadId.y < uint(_Params.y))
_WaveformBuffer[dispatchThreadId.y * uint(_Params.x) + dispatchThreadId.x] = uint4(0u, 0u, 0u, 0u);
}
#endif // DISABLE_COMPUTE_SHADERS