RtSbtBuild.ankiprog 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma anki mutator TECHNIQUE 0 1 // Shdows or MaterialFetch
  6. #pragma anki technique Build comp mutators TECHNIQUE
  7. #pragma anki technique PatchRaygenAndMiss comp mutators
  8. #include <AnKi/Shaders/Include/GpuSceneTypes.h>
  9. #include <AnKi/Shaders/Include/MiscRendererTypes.h>
  10. #include <AnKi/Shaders/Common.hlsl>
  11. // ===========================================================================
  12. // Build =
  13. // ===========================================================================
  14. #if NOT_ZERO(ANKI_TECHNIQUE_Build)
  15. StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
  16. StructuredBuffer<LodAndRenderableIndex> g_visibleRenderables : register(t1); // 1st element is the count
  17. StructuredBuffer<U32> g_shaderHandles : register(t2);
  18. RWByteAddressBuffer g_sbtBuffer : register(u0);
  19. ANKI_FAST_CONSTANTS(RtShadowsSbtBuildConstants, g_consts)
  20. # define NUMTHREADS 64
  21. [numthreads(NUMTHREADS, 1, 1)] void main(COMPUTE_ARGS)
  22. {
  23. if(all(svGroupId == 0))
  24. {
  25. // First group copies the raygen and miss handles
  26. const U32 dword = svGroupIndex;
  27. if(dword < g_consts.m_shaderHandleDwordSize)
  28. {
  29. const U32 raygenHandleDwordOffset = g_consts.m_raygenHandleIndex * g_consts.m_shaderHandleDwordSize + dword;
  30. BAB_STORE(g_sbtBuffer, U32, dword * 4, SBUFF(g_shaderHandles, raygenHandleDwordOffset));
  31. const U32 missHandleDwordOffset = g_consts.m_missHandleIndex * g_consts.m_shaderHandleDwordSize + dword;
  32. BAB_STORE(g_sbtBuffer, U32, (dword + g_consts.m_sbtRecordDwordSize) * 4, SBUFF(g_shaderHandles, missHandleDwordOffset));
  33. }
  34. }
  35. const U32 renderableCount = SBUFF(g_visibleRenderables, 0).m_lod_2bit_renderableIndex_30bit;
  36. if(svDispatchThreadId.x >= renderableCount)
  37. {
  38. return;
  39. }
  40. const U32 lodAndRenderableIdx = SBUFF(g_visibleRenderables, svDispatchThreadId.x + 1).m_lod_2bit_renderableIndex_30bit;
  41. const U32 renderableIdx = lodAndRenderableIdx & ((1u << 30) - 1u);
  42. const U32 lod = lodAndRenderableIdx >> 30u;
  43. const GpuSceneRenderable renderable = SBUFF(g_renderables, renderableIdx);
  44. U32 sbtDwordOffset = g_consts.m_sbtRecordDwordSize * 2; // Skip raygen and miss shaders which are first
  45. sbtDwordOffset += g_consts.m_sbtRecordDwordSize * svDispatchThreadId.x;
  46. // Copy the handle
  47. for(U32 i = 0; i < g_consts.m_shaderHandleDwordSize; ++i)
  48. {
  49. const U32 shaderHandleIdx = (TECHNIQUE == 0) ? renderable.m_rtShadowsShaderHandleIndex : renderable.m_rtMaterialFetchShaderHandleIndex;
  50. const U32 offset = shaderHandleIdx * g_consts.m_shaderHandleDwordSize + i;
  51. BAB_STORE(g_sbtBuffer, U32, sbtDwordOffset * 4, SBUFF(g_shaderHandles, offset));
  52. ++sbtDwordOffset;
  53. }
  54. // Copy the GpuScenePerDraw
  55. GpuScenePerDraw perDraw;
  56. perDraw.m_worldTransformsIndex = renderable.m_worldTransformsIndex;
  57. perDraw.m_particleEmitterIndex = renderable.m_particleEmitterIndex2;
  58. perDraw.m_isParticleEmitter = renderable.m_particleEmitterIndex2 != kMaxU32;
  59. perDraw.m_constantsOffset = renderable.m_constantsOffset;
  60. perDraw.m_meshLodIndex = renderable.m_meshLodsIndex + lod;
  61. perDraw.m_boneTransformsOffset = 0;
  62. BAB_STORE(g_sbtBuffer, GpuScenePerDraw, sbtDwordOffset * 4, perDraw);
  63. }
  64. #endif
  65. // ===========================================================================
  66. // PatchRaygenAndMiss =
  67. // ===========================================================================
  68. #if ANKI_TECHNIQUE_PatchRaygenAndMiss
  69. StructuredBuffer<U32> g_shaderHandles : register(t0);
  70. RWByteAddressBuffer g_sbtBuffer : register(u0);
  71. ANKI_FAST_CONSTANTS(RtShadowsSbtBuildConstants, g_consts)
  72. // Patches only raygen and miss handles to the SBT
  73. [numthreads(32, 1, 1)] void main(COMPUTE_ARGS)
  74. {
  75. const U32 dword = svGroupIndex;
  76. if(dword < g_consts.m_shaderHandleDwordSize)
  77. {
  78. const U32 raygenHandleDwordOffset = g_consts.m_raygenHandleIndex * g_consts.m_shaderHandleDwordSize + dword;
  79. BAB_STORE(g_sbtBuffer, U32, dword * 4, SBUFF(g_shaderHandles, raygenHandleDwordOffset));
  80. const U32 missHandleDwordOffset = g_consts.m_missHandleIndex * g_consts.m_shaderHandleDwordSize + dword;
  81. BAB_STORE(g_sbtBuffer, U32, (dword + g_consts.m_sbtRecordDwordSize) * 4, SBUFF(g_shaderHandles, missHandleDwordOffset));
  82. }
  83. }
  84. #endif