AoPrepareDepthBuffers1CS.hlsl 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // RUN: %dxc -E main -T cs_6_0 %s | FileCheck %s
  2. // CHECK: groupId
  3. // CHECK: flattenedThreadIdInGroup
  4. // CHECK: threadIdInGroup
  5. // CHECK: threadId
  6. // CHECK: barrier
  7. //
  8. // Copyright (c) Microsoft. All rights reserved.
  9. // This code is licensed under the MIT License (MIT).
  10. // THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
  11. // ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
  12. // IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
  13. // PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
  14. //
  15. // Developed by Minigraph
  16. //
  17. // Author: James Stanard
  18. //
  19. #include "SSAORS.hlsli"
  20. RWTexture2D<float> LinearZ : register(u0);
  21. RWTexture2D<float2> DS2x : register(u1);
  22. RWTexture2DArray<float> DS2xAtlas : register(u2);
  23. RWTexture2D<float2> DS4x : register(u3);
  24. RWTexture2DArray<float> DS4xAtlas : register(u4);
  25. cbuffer ConstantBuffer_x : register(b0)
  26. {
  27. float ZMagic;
  28. }
  29. Texture2D<float> Depth : register(t0);
  30. float Linearize( uint2 st )
  31. {
  32. float depth = Depth[st];
  33. float dist = 1.0 / (ZMagic * depth + 1.0);
  34. LinearZ[st] = dist;
  35. return dist;
  36. }
  37. groupshared float g_CacheW[256];
  38. [RootSignature(SSAO_RootSig)]
  39. [numthreads( 8, 8, 1 )]
  40. void main( uint3 Gid : SV_GroupID, uint GI : SV_GroupIndex, uint3 GTid : SV_GroupThreadID, uint3 DTid : SV_DispatchThreadID )
  41. {
  42. uint2 startST = Gid.xy << 4 | GTid.xy;
  43. uint destIdx = GTid.y << 4 | GTid.x;
  44. g_CacheW[ destIdx + 0 ] = Linearize(startST | uint2(0, 0));
  45. g_CacheW[ destIdx + 8 ] = Linearize(startST | uint2(8, 0));
  46. g_CacheW[ destIdx + 128 ] = Linearize(startST | uint2(0, 8));
  47. g_CacheW[ destIdx + 136 ] = Linearize(startST | uint2(8, 8));
  48. GroupMemoryBarrierWithGroupSync();
  49. uint ldsIndex = (GTid.x << 1) | (GTid.y << 5);
  50. float w1 = g_CacheW[ldsIndex];
  51. uint2 st = DTid.xy;
  52. uint slice = (st.x & 3) | ((st.y & 3) << 2);
  53. DS2x[st] = w1;
  54. DS2xAtlas[uint3(st >> 2, slice)] = w1;
  55. if ((GI & 011) == 0)
  56. {
  57. st = DTid.xy >> 1;
  58. slice = (st.x & 3) | ((st.y & 3) << 2);
  59. DS4x[st] = w1;
  60. DS4xAtlas[uint3(st >> 2, slice)] = w1;
  61. }
  62. }