OIT_CreatePrefixSum_Pass0_CS.hlsl 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
  2. // CHECK: groupId
  3. // CHECK: textureLoad
  4. // CHECK: bufferStore
  5. // CHECK: bufferLoad
  6. // CHECK: textureLoad
  7. // CHECK: bufferStore
  8. //-----------------------------------------------------------------------------
  9. // File: OIT_CS.hlsl
  10. //
  11. // Desc: Compute shaders for used in the Order Independent Transparency sample.
  12. //
  13. // Copyright (c) Microsoft Corporation. All rights reserved.
  14. //-----------------------------------------------------------------------------
  15. // TODO: use structured buffers
  16. RWBuffer<float> deepBufferDepth : register( u0 );
  17. RWBuffer<uint> deepBufferColorUINT : register( u1 );
  18. RWTexture2D<float4> frameBuffer : register( u2 );
  19. RWBuffer<uint> prefixSum : register( u3 );
  20. Texture2D<uint> fragmentCount : register ( t0 );
  21. cbuffer CB : register( b0 )
  22. {
  23. uint g_nFrameWidth : packoffset( c0.x );
  24. uint g_nFrameHeight : packoffset( c0.y );
  25. uint g_nPassSize : packoffset( c0.z );
  26. uint g_nReserved : packoffset( c0.w );
  27. }
  28. #define blocksize 1
  29. #define groupthreads (blocksize*blocksize)
  30. groupshared float accum[groupthreads];
  31. // First pass of the prefix sum creation algorithm. Converts a 2D buffer to a 1D buffer,
  32. // and sums every other value with the previous value.
  33. [numthreads(1,1,1)]
  34. void main( uint3 nGid : SV_GroupID, uint3 nDTid : SV_DispatchThreadID, uint3 nGTid : SV_GroupThreadID )
  35. {
  36. int nThreadNum = nGid.y*g_nFrameWidth + nGid.x;
  37. if( nThreadNum%2 == 0 )
  38. {
  39. prefixSum[nThreadNum] = fragmentCount[nGid.xy];
  40. // Add the Fragment count to the next bin
  41. if( (nThreadNum+1) < g_nFrameWidth * g_nFrameHeight )
  42. {
  43. int2 nextUV;
  44. nextUV.x = (nThreadNum+1) % g_nFrameWidth;
  45. nextUV.y = (nThreadNum+1) / g_nFrameWidth;
  46. prefixSum[ nThreadNum+1 ] = prefixSum[ nThreadNum ] + fragmentCount[ nextUV ];
  47. }
  48. }
  49. }