AccelerationStructureBuilder.cpp 2.6 KB

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