ParticleInnerSortCS.hlsl 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
  2. // CHECK: groupId
  3. // CHECK: flattenedThreadIdInGroup
  4. // CHECK: bufferLoad
  5. // CHECK: addrspace(3)
  6. // CHECK: barrier
  7. // CHECK: addrspace(3)
  8. // CHECK: barrier
  9. // CHECK: bufferStore
  10. //
  11. // Copyright (c) Microsoft. All rights reserved.
  12. // This code is licensed under the MIT License (MIT).
  13. // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
  14. // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
  15. // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
  16. // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
  17. //
  18. // Developed by Minigraph
  19. //
  20. // Author: James Stanard
  21. //
  22. #include "ParticleUtility.hlsli"
  23. RWStructuredBuffer<uint> g_SortBuffer : register(u0);
  24. cbuffer CB : register(b0)
  25. {
  26. uint k; // k >= 4096
  27. };
  28. groupshared uint gs_SortKeys[2048];
  29. [RootSignature(Particle_RootSig)]
  30. [numthreads(1024, 1, 1)]
  31. void main( uint3 Gid : SV_GroupID, uint GI : SV_GroupIndex )
  32. {
  33. const uint RangeStart = Gid.x * 2048;
  34. gs_SortKeys[GI] = g_SortBuffer[RangeStart + GI];
  35. gs_SortKeys[GI + 1024] = g_SortBuffer[RangeStart + GI + 1024];
  36. GroupMemoryBarrierWithGroupSync();
  37. for (uint j = 1024; j > 0; j >>= 1)
  38. {
  39. uint Index1 = InsertZeroBit(GI, j);
  40. uint Index2 = Index1 | j;
  41. uint A = gs_SortKeys[Index1];
  42. uint B = gs_SortKeys[Index2];
  43. if ((A > B) != ((RangeStart & k) == 0))
  44. {
  45. gs_SortKeys[Index1] = B;
  46. gs_SortKeys[Index2] = A;
  47. }
  48. GroupMemoryBarrierWithGroupSync();
  49. }
  50. g_SortBuffer[RangeStart + GI] = gs_SortKeys[GI];
  51. g_SortBuffer[RangeStart + GI + 1024] = gs_SortKeys[GI + 1024];
  52. }