AccelerationStructure.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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/Gr/Buffer.h>
  7. #include <AnKi/Math.h>
  8. #include <AnKi/Util/WeakArray.h>
  9. namespace anki {
  10. /// @addtogroup graphics
  11. /// @{
  12. /// @memberof AccelerationStructureInitInfo
  13. class BottomLevelAccelerationStructureInitInfo
  14. {
  15. public:
  16. BufferView m_indexBuffer;
  17. U32 m_indexCount = 0;
  18. IndexType m_indexType = IndexType::kCount;
  19. BufferView m_positionBuffer;
  20. U32 m_positionStride = 0;
  21. Format m_positionsFormat = Format::kNone;
  22. U32 m_positionCount = 0;
  23. Bool isValid(Bool validateBuffers) const
  24. {
  25. Bool valid = true;
  26. valid = valid && (m_indexCount >= 3 && m_indexType != IndexType::kCount);
  27. if(validateBuffers)
  28. {
  29. valid = valid && (m_indexBuffer.isValid() && m_indexCount * getIndexSize(m_indexType) == m_indexBuffer.getRange());
  30. }
  31. const U32 vertSize = getFormatInfo(m_positionsFormat).m_texelSize;
  32. valid = valid && (m_positionStride >= vertSize && m_positionCount >= 3);
  33. if(validateBuffers)
  34. {
  35. valid = valid && (m_positionBuffer.isValid() && m_positionStride * m_positionCount == m_positionBuffer.getRange());
  36. }
  37. return valid;
  38. }
  39. };
  40. /// @memberof AccelerationStructureInitInfo
  41. class TopLevelAccelerationStructureInitInfo
  42. {
  43. public:
  44. U32 m_instanceCount = 0;
  45. BufferView m_instancesBuffer; ///< Filled with AccelerationStructureInstance structs.
  46. Bool isValid(Bool validateBuffers) const
  47. {
  48. Bool valid = true;
  49. if(validateBuffers)
  50. {
  51. if(m_instanceCount)
  52. {
  53. valid = valid && (m_instancesBuffer.getRange() == sizeof(AccelerationStructureInstance) * m_instanceCount);
  54. }
  55. else
  56. {
  57. valid = valid && (!m_instancesBuffer.isValid());
  58. }
  59. }
  60. return valid;
  61. }
  62. };
  63. /// Acceleration struture init info.
  64. /// @memberof AccelerationStructure
  65. class AccelerationStructureInitInfo : public GrBaseInitInfo
  66. {
  67. public:
  68. AccelerationStructureType m_type = AccelerationStructureType::kCount;
  69. BottomLevelAccelerationStructureInitInfo m_bottomLevel;
  70. TopLevelAccelerationStructureInitInfo m_topLevel;
  71. BufferView m_accelerationStructureBuffer; ///< Optionaly supply the buffer of the AS.
  72. AccelerationStructureInitInfo(CString name = {})
  73. : GrBaseInitInfo(name)
  74. {
  75. }
  76. Bool isValid() const
  77. {
  78. if(m_type == AccelerationStructureType::kCount)
  79. {
  80. return false;
  81. }
  82. return (m_type == AccelerationStructureType::kBottomLevel) ? m_bottomLevel.isValid(true) : m_topLevel.isValid(true);
  83. }
  84. Bool isValidForGettingMemoryRequirements() const
  85. {
  86. if(m_type == AccelerationStructureType::kCount)
  87. {
  88. return false;
  89. }
  90. return (m_type == AccelerationStructureType::kBottomLevel) ? m_bottomLevel.isValid(false) : m_topLevel.isValid(false);
  91. }
  92. };
  93. /// Acceleration structure GPU object.
  94. class AccelerationStructure : public GrObject
  95. {
  96. ANKI_GR_OBJECT
  97. public:
  98. static constexpr GrObjectType kClassType = GrObjectType::kAccelerationStructure;
  99. AccelerationStructureType getType() const
  100. {
  101. ANKI_ASSERT(m_type != AccelerationStructureType::kCount);
  102. return m_type;
  103. }
  104. /// Get the size of the scratch buffer used in building this AS.
  105. PtrSize getBuildScratchBufferSize() const
  106. {
  107. ANKI_ASSERT(m_scratchBufferSize != 0);
  108. return m_scratchBufferSize;
  109. }
  110. U64 getGpuAddress() const;
  111. protected:
  112. PtrSize m_scratchBufferSize = 0; ///< Contains more bytes than what the APIs report. This is done to avoid exposing the alignment.
  113. AccelerationStructureType m_type = AccelerationStructureType::kCount;
  114. /// Construct.
  115. AccelerationStructure(CString name)
  116. : GrObject(kClassType, name)
  117. {
  118. }
  119. /// Destroy.
  120. ~AccelerationStructure()
  121. {
  122. }
  123. private:
  124. /// Allocate and initialize a new instance.
  125. [[nodiscard]] static AccelerationStructure* newInstance(const AccelerationStructureInitInfo& init);
  126. };
  127. /// @}
  128. } // end namespace anki