StructuredBuffer DataBuffer : register(t0); RWByteAddressBuffer ResultDataBuffer : register(u0); cbuffer InfoBuffer : register(b0) { float4 Color; uint PlotIndex; float Interval; uint DataStartIndex; uint PlotDataLenght; } void InterlockedMaxFloat(RWByteAddressBuffer buf, uint addr, float value) { uint i_val = asuint(value); uint tmp0 = 0; uint tmp1; buf.InterlockedMax(addr, i_val, tmp1); } void InterlockedMinFloat(RWByteAddressBuffer buf, uint addr, float value) { uint i_val = asuint(value); uint tmp1; buf.InterlockedMin(addr, i_val, tmp1); } void InterlockedCompareExchangeFloat(RWByteAddressBuffer buf, uint addr, float value) { uint i_val = asuint(value); uint tmp0 = 0; uint tmp1; buf.InterlockedCompareExchange(addr, tmp0, i_val, tmp1); } [numthreads(1000, 1, 1)] void main(uint3 DTid : SV_DispatchThreadID) { float value = DataBuffer[DTid.x + PlotIndex * PlotDataLenght]; if (DTid.x >= DataStartIndex-1) { return; } if (DTid.x == 0) { InterlockedCompareExchangeFloat(ResultDataBuffer, PlotIndex * 8, value); InterlockedCompareExchangeFloat(ResultDataBuffer, PlotIndex * 8 + 4, value); return; } InterlockedMaxFloat(ResultDataBuffer, PlotIndex * 8, value); InterlockedMinFloat(ResultDataBuffer, PlotIndex * 8 + 4, value); }