RtShadowsSbtBuild.ankiprog 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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. #include <AnKi/Shaders/RtShadows.hlsl>
  6. #include <AnKi/Shaders/Include/GpuSceneTypes.h>
  7. #pragma anki technique comp
  8. StructuredBuffer<GpuSceneRenderable> g_renderables : register(t0);
  9. ByteAddressBuffer g_gpuScene : register(t1);
  10. StructuredBuffer<U32> g_visibleRenderableIndices : register(t2); // 1st element is the count
  11. StructuredBuffer<U32> g_shaderHandles : register(t3);
  12. RWStructuredBuffer<U32> g_sbtBuffer : register(u0);
  13. ANKI_FAST_CONSTANTS(RtShadowsSbtBuildConstants, g_consts)
  14. #define NUMTHREADS 64
  15. [numthreads(NUMTHREADS, 1, 1)] void main(U32 svDispatchThreadId : SV_DISPATCHTHREADID)
  16. {
  17. const U32 renderableCount = g_visibleRenderableIndices[0];
  18. if(svDispatchThreadId >= renderableCount)
  19. {
  20. return;
  21. }
  22. const GpuSceneRenderable renderable = g_renderables[g_visibleRenderableIndices[svDispatchThreadId + 1]];
  23. U32 sbtDwordOffset = g_consts.m_sbtRecordDwordSize * 2; // Skip raygen and miss shaders which are first
  24. sbtDwordOffset += g_consts.m_sbtRecordDwordSize * svDispatchThreadId;
  25. // Copy the handle
  26. for(U32 i = 0; i < g_consts.m_shaderHandleDwordSize; ++i)
  27. {
  28. g_sbtBuffer[sbtDwordOffset] = g_shaderHandles[renderable.m_rtShadowsShaderHandleIndex * g_consts.m_shaderHandleDwordSize + i];
  29. ++sbtDwordOffset;
  30. }
  31. // Copy the GpuScenePerDraw
  32. g_sbtBuffer[sbtDwordOffset++] = renderable.m_worldTransformsIndex;
  33. g_sbtBuffer[sbtDwordOffset++] = renderable.m_constantsOffset;
  34. g_sbtBuffer[sbtDwordOffset++] = renderable.m_meshLodsIndex;
  35. g_sbtBuffer[sbtDwordOffset] = 0;
  36. }