2
0

AccelerationStructureBuilder.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright (C) 2009-2021, 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/Renderer/AccelerationStructureBuilder.h>
  6. #include <AnKi/Renderer/RenderQueue.h>
  7. #include <AnKi/Renderer/Renderer.h>
  8. #include <AnKi/Util/Tracer.h>
  9. namespace anki
  10. {
  11. void AccelerationStructureBuilder::populateRenderGraph(RenderingContext& ctx)
  12. {
  13. ANKI_TRACE_SCOPED_EVENT(R_TLAS);
  14. // Get some things
  15. ANKI_ASSERT(ctx.m_renderQueue->m_rayTracingQueue);
  16. ConstWeakArray<RayTracingInstanceQueueElement> instanceElements =
  17. ctx.m_renderQueue->m_rayTracingQueue->m_rayTracingInstances;
  18. const U32 instanceCount = instanceElements.getSize();
  19. ANKI_ASSERT(instanceCount > 0);
  20. // Create the instances. Allocate but not construct to save some CPU time
  21. void* instancesMem = ctx.m_tempAllocator.getMemoryPool().allocate(
  22. sizeof(AccelerationStructureInstance) * instanceCount, alignof(AccelerationStructureInstance));
  23. WeakArray<AccelerationStructureInstance> instances(static_cast<AccelerationStructureInstance*>(instancesMem),
  24. instanceCount);
  25. for(U32 instanceIdx = 0; instanceIdx < instanceCount; ++instanceIdx)
  26. {
  27. const RayTracingInstanceQueueElement& element = instanceElements[instanceIdx];
  28. // Init instance
  29. AccelerationStructureInstance& out = instances[instanceIdx];
  30. ::new(&out) AccelerationStructureInstance();
  31. out.m_bottomLevel.reset(element.m_bottomLevelAccelerationStructure);
  32. memcpy(&out.m_transform, &element.m_modelDescriptor.m_worldTransform[0], sizeof(out.m_transform));
  33. out.m_hitgroupSbtRecordIndex = instanceIdx;
  34. out.m_mask = 0xFF;
  35. }
  36. // Create the TLAS
  37. AccelerationStructureInitInfo initInf("MainTlas");
  38. initInf.m_type = AccelerationStructureType::TOP_LEVEL;
  39. initInf.m_topLevel.m_instances = instances;
  40. m_runCtx.m_tlas = getGrManager().newAccelerationStructure(initInf);
  41. // Need a cleanup
  42. for(U32 instanceIdx = 0; instanceIdx < instanceCount; ++instanceIdx)
  43. {
  44. instances[instanceIdx].m_bottomLevel.reset(nullptr);
  45. }
  46. // Build the job
  47. RenderGraphDescription& rgraph = ctx.m_renderGraphDescr;
  48. m_runCtx.m_tlasHandle = rgraph.importAccelerationStructure(m_runCtx.m_tlas, AccelerationStructureUsageBit::NONE);
  49. ComputeRenderPassDescription& rpass = rgraph.newComputeRenderPass("BuildTlas");
  50. rpass.setWork(
  51. [](RenderPassWorkContext& rgraphCtx) {
  52. static_cast<AccelerationStructureBuilder*>(rgraphCtx.m_userData)->run(rgraphCtx);
  53. },
  54. this, 0);
  55. rpass.newDependency(RenderPassDependency(m_runCtx.m_tlasHandle, AccelerationStructureUsageBit::BUILD));
  56. }
  57. void AccelerationStructureBuilder::run(RenderPassWorkContext& rgraphCtx)
  58. {
  59. ANKI_TRACE_SCOPED_EVENT(R_TLAS);
  60. rgraphCtx.m_commandBuffer->buildAccelerationStructure(m_runCtx.m_tlas);
  61. }
  62. } // end namespace anki