GpuVisibleTransientMemoryPool.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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/Core/Common.h>
  7. #include <AnKi/Gr/Utils/StackGpuMemoryPool.h>
  8. #include <AnKi/Gr/GrManager.h>
  9. #include <AnKi/Gr/Buffer.h>
  10. namespace anki {
  11. /// @addtogroup gpu_memory
  12. /// @{
  13. /// GPU only transient memory. Used for temporary allocations. Allocations will get reset after each frame.
  14. class GpuVisibleTransientMemoryPool : public MakeSingleton<GpuVisibleTransientMemoryPool>
  15. {
  16. template<typename>
  17. friend class MakeSingleton;
  18. public:
  19. BufferView allocate(PtrSize size, PtrSize alignment)
  20. {
  21. PtrSize offset;
  22. Buffer* buffer;
  23. m_pool.allocate(size, alignment, offset, buffer);
  24. return BufferView(buffer, offset, size);
  25. }
  26. template<typename T>
  27. BufferView allocateStructuredBuffer(U32 count)
  28. {
  29. return allocateStructuredBuffer(count, sizeof(T));
  30. }
  31. BufferView allocateStructuredBuffer(U32 count, U32 structureSize)
  32. {
  33. return allocate(PtrSize(structureSize * count), (m_structuredBufferAlignment == kMaxU32) ? structureSize : m_structuredBufferAlignment);
  34. }
  35. void endFrame();
  36. private:
  37. StackGpuMemoryPool m_pool;
  38. U32 m_frame = 0;
  39. U32 m_structuredBufferAlignment = kMaxU32;
  40. GpuVisibleTransientMemoryPool()
  41. {
  42. if(!GrManager::getSingleton().getDeviceCapabilities().m_structuredBufferNaturalAlignment)
  43. {
  44. m_structuredBufferAlignment = GrManager::getSingleton().getDeviceCapabilities().m_structuredBufferBindOffsetAlignment;
  45. }
  46. BufferUsageBit buffUsage = BufferUsageBit::kAllConstant | BufferUsageBit::kAllUav | BufferUsageBit::kAllSrv | BufferUsageBit::kIndirectDraw
  47. | BufferUsageBit::kIndirectCompute | BufferUsageBit::kVertexOrIndex | BufferUsageBit::kAllCopy
  48. | BufferUsageBit::kIndirectDispatchRays | BufferUsageBit::kShaderBindingTable;
  49. if(GrManager::getSingleton().getDeviceCapabilities().m_rayTracingEnabled)
  50. {
  51. buffUsage |= (BufferUsageBit::kAccelerationStructureBuildScratch | BufferUsageBit::kAccelerationStructureBuild
  52. | BufferUsageBit::kAccelerationStructure);
  53. }
  54. m_pool.init(10_MB, 2.0, 0, buffUsage, BufferMapAccessBit::kNone, true, "GpuVisibleTransientMemoryPool");
  55. }
  56. ~GpuVisibleTransientMemoryPool() = default;
  57. };
  58. /// @}
  59. } // end namespace anki