123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- StructuredBuffer<float> 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);
- }
|