AccelerationStructureImpl.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. #pragma once
  6. #include <AnKi/Gr/AccelerationStructure.h>
  7. #include <AnKi/Gr/Vulkan/VulkanObject.h>
  8. #include <AnKi/Gr/Vulkan/GpuMemoryManager.h>
  9. namespace anki {
  10. /// @addtogroup vulkan
  11. /// @{
  12. /// AccelerationStructure implementation.
  13. class AccelerationStructureImpl final :
  14. public AccelerationStructure,
  15. public VulkanObject<AccelerationStructure, AccelerationStructureImpl>
  16. {
  17. public:
  18. AccelerationStructureImpl(GrManager* manager, CString name)
  19. : AccelerationStructure(manager, name)
  20. {
  21. }
  22. ~AccelerationStructureImpl();
  23. Error init(const AccelerationStructureInitInfo& inf);
  24. VkAccelerationStructureKHR getHandle() const
  25. {
  26. ANKI_ASSERT(m_handle);
  27. return m_handle;
  28. }
  29. U32 getBuildScratchBufferSize() const
  30. {
  31. ANKI_ASSERT(m_scratchBufferSize > 0);
  32. return m_scratchBufferSize;
  33. }
  34. void generateBuildInfo(U64 scratchBufferAddress, VkAccelerationStructureBuildGeometryInfoKHR& buildInfo,
  35. VkAccelerationStructureBuildRangeInfoKHR& rangeInfo) const
  36. {
  37. buildInfo = m_buildInfo;
  38. buildInfo.scratchData.deviceAddress = scratchBufferAddress;
  39. rangeInfo = m_rangeInfo;
  40. }
  41. static void computeBarrierInfo(AccelerationStructureUsageBit before, AccelerationStructureUsageBit after,
  42. VkPipelineStageFlags& srcStages, VkAccessFlags& srcAccesses,
  43. VkPipelineStageFlags& dstStages, VkAccessFlags& dstAccesses);
  44. private:
  45. class ASBottomLevelInfo
  46. {
  47. public:
  48. BufferPtr m_positionsBuffer;
  49. BufferPtr m_indexBuffer;
  50. };
  51. class ASTopLevelInfo
  52. {
  53. public:
  54. BufferPtr m_instancesBuffer;
  55. DynamicArray<AccelerationStructurePtr> m_blas;
  56. };
  57. BufferPtr m_asBuffer;
  58. VkAccelerationStructureKHR m_handle = VK_NULL_HANDLE;
  59. VkDeviceAddress m_deviceAddress = 0;
  60. ASBottomLevelInfo m_bottomLevelInfo;
  61. ASTopLevelInfo m_topLevelInfo;
  62. /// @name Build-time info
  63. /// @{
  64. VkAccelerationStructureGeometryKHR m_geometry = {};
  65. VkAccelerationStructureBuildGeometryInfoKHR m_buildInfo = {};
  66. VkAccelerationStructureBuildRangeInfoKHR m_rangeInfo = {};
  67. U32 m_scratchBufferSize = 0;
  68. /// @}
  69. };
  70. /// @}
  71. } // end namespace anki