AccelerationStructureScratchAllocator.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 once
  6. #include <AnKi/Resource/Common.h>
  7. #include <AnKi/Gr/Buffer.h>
  8. #include <AnKi/Gr/GrManager.h>
  9. namespace anki {
  10. /// @addtogroup resource
  11. /// @{
  12. /// Ring buffer used for AS scratch memory.
  13. class AccelerationStructureScratchAllocator : public MakeSingleton<AccelerationStructureScratchAllocator>
  14. {
  15. public:
  16. static constexpr PtrSize kBufferSize = 64_MB;
  17. static constexpr PtrSize kMaxBufferSize = 256_MB;
  18. AccelerationStructureScratchAllocator()
  19. {
  20. BufferInitInfo buffInit("BLAS scratch");
  21. buffInit.m_size = kBufferSize;
  22. buffInit.m_usage = BufferUsageBit::kAccelerationStructureBuildScratch;
  23. m_buffer = GrManager::getSingleton().newBuffer(buffInit);
  24. }
  25. BufferView allocate(PtrSize size, Bool& addBarrierBefore)
  26. {
  27. if(size > kMaxBufferSize)
  28. {
  29. ANKI_RESOURCE_LOGF("Asked for too much BLAS scratch memory: %zu", size);
  30. }
  31. if(size > m_buffer->getSize())
  32. {
  33. BufferInitInfo buffInit("BLAS scratch");
  34. buffInit.m_size = min(kMaxBufferSize, m_buffer->getSize() * 2u);
  35. buffInit.m_usage = BufferUsageBit::kAccelerationStructureBuildScratch;
  36. m_buffer = GrManager::getSingleton().newBuffer(buffInit);
  37. m_offset = 0;
  38. }
  39. if(m_offset + size > m_buffer->getSize())
  40. {
  41. m_offset = 0;
  42. addBarrierBefore = true;
  43. }
  44. else
  45. {
  46. addBarrierBefore = false;
  47. }
  48. const BufferView view(m_buffer.get(), m_offset, size);
  49. m_offset += size;
  50. return view;
  51. }
  52. private:
  53. BufferPtr m_buffer;
  54. PtrSize m_offset = 0;
  55. };
  56. /// @}
  57. } // end namespace anki