DataReViewPlot.hlsl 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. StructuredBuffer<float> DataBuffer : register(t0);
  2. RWByteAddressBuffer ResultDataBuffer : register(u0);
  3. cbuffer InfoBuffer : register(b0)
  4. {
  5. float4 Color;
  6. uint PlotCount;
  7. float Interval;
  8. uint PlotIndex;
  9. uint PlotDataLenght;
  10. }
  11. void InterlockedMaxFloat(RWByteAddressBuffer buf, uint addr, float value)
  12. {
  13. uint i_val = asuint(value);
  14. uint tmp0 = 0;
  15. uint tmp1;
  16. buf.InterlockedMax(addr, i_val, tmp1);
  17. }
  18. void InterlockedMinFloat(RWByteAddressBuffer buf, uint addr, float value)
  19. {
  20. uint i_val = asuint(value);
  21. uint tmp1;
  22. buf.InterlockedMin(addr, i_val, tmp1);
  23. }
  24. void InterlockedCompareExchangeFloat(RWByteAddressBuffer buf, uint addr, float value)
  25. {
  26. uint i_val = asuint(value);
  27. uint tmp0 = 0;
  28. uint tmp1;
  29. buf.InterlockedCompareExchange(addr, tmp0, i_val, tmp1);
  30. }
  31. [numthreads(1000, 1, 1)]
  32. void main(uint3 DTid : SV_DispatchThreadID)
  33. {
  34. float value = DataBuffer[DTid.x + PlotIndex * PlotCount];
  35. if (DTid.x >= PlotDataLenght)
  36. {
  37. return;
  38. }
  39. if (DTid.x == 0)
  40. {
  41. InterlockedCompareExchangeFloat(ResultDataBuffer, PlotIndex * 8, value);
  42. InterlockedCompareExchangeFloat(ResultDataBuffer, PlotIndex * 8 + 4, value);
  43. return;
  44. }
  45. InterlockedMaxFloat(ResultDataBuffer, PlotIndex * 8, value);
  46. InterlockedMinFloat(ResultDataBuffer, PlotIndex * 8 + 4, value);
  47. }