AccelerationStructureImpl.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. // Copyright (C) 2009-2020, 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/gr/vulkan/AccelerationStructureImpl.h>
  6. #include <anki/gr/vulkan/GrManagerImpl.h>
  7. namespace anki
  8. {
  9. AccelerationStructureImpl::~AccelerationStructureImpl()
  10. {
  11. if(m_handle)
  12. {
  13. vkDestroyAccelerationStructureKHR(getDevice(), m_handle, nullptr);
  14. }
  15. if(m_memHandle)
  16. {
  17. getGrManagerImpl().getGpuMemoryManager().freeMemory(m_memHandle);
  18. }
  19. m_topLevelInfo.m_instances.destroy(getAllocator());
  20. }
  21. Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
  22. {
  23. ANKI_ASSERT(inf.isValid());
  24. m_type = inf.m_type;
  25. if(m_type == AccelerationStructureType::BOTTOM_LEVEL)
  26. {
  27. static_cast<BottomLevelAccelerationStructureInitInfo&>(m_bottomLevelInfo) = inf.m_bottomLevel;
  28. }
  29. else
  30. {
  31. m_topLevelInfo.m_instances.create(getAllocator(), inf.m_topLevel.m_instances.getSize());
  32. for(U32 i = 0; i < inf.m_topLevel.m_instances.getSize(); ++i)
  33. {
  34. m_topLevelInfo.m_instances[i] = inf.m_topLevel.m_instances[i];
  35. }
  36. }
  37. // Create the handle
  38. {
  39. VkAccelerationStructureCreateGeometryTypeInfoKHR geom = {};
  40. geom.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR;
  41. geom.maxPrimitiveCount = 1;
  42. if(m_type == AccelerationStructureType::BOTTOM_LEVEL)
  43. {
  44. geom.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
  45. geom.indexType = convertIndexType(m_bottomLevelInfo.m_indexType);
  46. geom.vertexFormat = convertFormat(m_bottomLevelInfo.m_positionsFormat);
  47. geom.maxPrimitiveCount = m_bottomLevelInfo.m_indexCount / 3;
  48. geom.maxVertexCount = m_bottomLevelInfo.m_positionCount;
  49. }
  50. else
  51. {
  52. geom.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
  53. geom.maxPrimitiveCount = m_topLevelInfo.m_instances.getSize();
  54. }
  55. geom.allowsTransforms = false; // Only for triangle types and at the moment not used
  56. VkAccelerationStructureCreateInfoKHR ci = {};
  57. ci.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
  58. ci.type = convertAccelerationStructureType(m_type);
  59. ci.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
  60. ci.maxGeometryCount = 1;
  61. ci.pGeometryInfos = &geom;
  62. ANKI_VK_CHECK(vkCreateAccelerationStructureKHR(getDevice(), &ci, nullptr, &m_handle));
  63. getGrManagerImpl().trySetVulkanHandleName(inf.getName(),
  64. VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT, m_handle);
  65. }
  66. // Allocate memory
  67. {
  68. // Get mem requirements
  69. VkAccelerationStructureMemoryRequirementsInfoKHR reqIn = {};
  70. reqIn.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR;
  71. reqIn.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR;
  72. reqIn.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
  73. reqIn.accelerationStructure = m_handle;
  74. VkMemoryRequirements2 req = {};
  75. req.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
  76. vkGetAccelerationStructureMemoryRequirementsKHR(getDevice(), &reqIn, &req);
  77. // Find mem IDX
  78. U32 memIdx = getGrManagerImpl().getGpuMemoryManager().findMemoryType(req.memoryRequirements.memoryTypeBits,
  79. VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
  80. VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
  81. // Fallback
  82. if(memIdx == MAX_U32)
  83. {
  84. memIdx = getGrManagerImpl().getGpuMemoryManager().findMemoryType(req.memoryRequirements.memoryTypeBits,
  85. VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, 0);
  86. }
  87. ANKI_ASSERT(memIdx != MAX_U32);
  88. // Allocate
  89. // TODO is it linear or no-linear?
  90. getGrManagerImpl().getGpuMemoryManager().allocateMemory(
  91. memIdx, req.memoryRequirements.size, U32(req.memoryRequirements.alignment), true, m_memHandle);
  92. // Bind memory
  93. VkBindAccelerationStructureMemoryInfoKHR bindInfo = {};
  94. bindInfo.sType = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_KHR;
  95. bindInfo.accelerationStructure = m_handle;
  96. bindInfo.memory = m_memHandle.m_memory;
  97. bindInfo.memoryOffset = m_memHandle.m_offset;
  98. ANKI_VK_CHECK(vkBindAccelerationStructureMemoryKHR(getDevice(), 1, &bindInfo));
  99. }
  100. // Get scratch buffer size
  101. {
  102. VkMemoryRequirements2 req = {};
  103. req.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
  104. VkAccelerationStructureMemoryRequirementsInfoKHR inf = {};
  105. inf.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR;
  106. inf.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_KHR;
  107. inf.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
  108. inf.accelerationStructure = m_handle;
  109. vkGetAccelerationStructureMemoryRequirementsKHR(getDevice(), &inf, &req);
  110. m_scratchBufferSize = U32(req.memoryRequirements.size);
  111. }
  112. // Get GPU address
  113. if(m_type == AccelerationStructureType::BOTTOM_LEVEL)
  114. {
  115. VkAccelerationStructureDeviceAddressInfoKHR inf = {};
  116. inf.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR;
  117. inf.accelerationStructure = m_handle;
  118. m_bottomLevelInfo.m_gpuAddress = vkGetAccelerationStructureDeviceAddressKHR(getDevice(), &inf);
  119. ANKI_ASSERT(m_bottomLevelInfo.m_gpuAddress);
  120. }
  121. initBuildInfo();
  122. return Error::NONE;
  123. }
  124. void AccelerationStructureImpl::initBuildInfo()
  125. {
  126. if(m_type == AccelerationStructureType::BOTTOM_LEVEL)
  127. {
  128. m_geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
  129. m_geometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
  130. m_geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR; // TODO
  131. VkAccelerationStructureGeometryTrianglesDataKHR& triangles = m_geometry.geometry.triangles;
  132. triangles.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
  133. triangles.vertexFormat = convertFormat(m_bottomLevelInfo.m_positionsFormat);
  134. triangles.vertexData.deviceAddress =
  135. m_bottomLevelInfo.m_positionBuffer->getGpuAddress() + m_bottomLevelInfo.m_positionBufferOffset;
  136. triangles.vertexStride = m_bottomLevelInfo.m_positionStride;
  137. triangles.indexType = convertIndexType(m_bottomLevelInfo.m_indexType);
  138. triangles.indexData.deviceAddress =
  139. m_bottomLevelInfo.m_indexBuffer->getGpuAddress() + m_bottomLevelInfo.m_indexBufferOffset;
  140. }
  141. else
  142. {
  143. const U32 instanceCount = m_topLevelInfo.m_instances.getSize();
  144. // Create the instances buffer
  145. {
  146. BufferInitInfo buffInit("RT_instances");
  147. buffInit.m_size = sizeof(VkAccelerationStructureInstanceKHR) * instanceCount;
  148. buffInit.m_usage = InternalBufferUsageBit::ACCELERATION_STRUCTURE_BUILD_SCRATCH;
  149. buffInit.m_mapAccess = BufferMapAccessBit::WRITE;
  150. m_topLevelInfo.m_instancesBuff = getManager().newBuffer(buffInit);
  151. }
  152. // Populate the instances buffer
  153. {
  154. VkAccelerationStructureInstanceKHR* instances = static_cast<VkAccelerationStructureInstanceKHR*>(
  155. m_topLevelInfo.m_instancesBuff->map(0, MAX_PTR_SIZE, BufferMapAccessBit::WRITE));
  156. for(U32 i = 0; i < instanceCount; ++i)
  157. {
  158. VkAccelerationStructureInstanceKHR& outInst = instances[i];
  159. const AccelerationStructureInstance& inInst = m_topLevelInfo.m_instances[i];
  160. static_assert(sizeof(outInst.transform) == sizeof(inInst.m_transform), "See file");
  161. memcpy(&outInst.transform, &inInst.m_transform, sizeof(inInst.m_transform));
  162. outInst.instanceCustomIndex = i & 0xFFFFFF;
  163. outInst.mask = 0xFF;
  164. outInst.instanceShaderBindingTableRecordOffset = inInst.m_sbtRecordIndex & 0xFFFFFF;
  165. outInst.flags = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR;
  166. outInst.accelerationStructureReference =
  167. static_cast<const AccelerationStructureImpl&>(*inInst.m_bottomLevel).m_bottomLevelInfo.m_gpuAddress;
  168. ANKI_ASSERT(outInst.accelerationStructureReference != 0);
  169. }
  170. m_topLevelInfo.m_instancesBuff->unmap();
  171. }
  172. m_geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
  173. m_geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
  174. m_geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR; // TODO
  175. VkAccelerationStructureGeometryInstancesDataKHR& inst = m_geometry.geometry.instances;
  176. inst.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
  177. inst.arrayOfPointers = false;
  178. inst.data.deviceAddress = m_topLevelInfo.m_instancesBuff->getGpuAddress();
  179. }
  180. m_buildInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
  181. m_buildInfo.type = convertAccelerationStructureType(m_type);
  182. m_buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
  183. m_buildInfo.update = false;
  184. m_buildInfo.dstAccelerationStructure = m_handle;
  185. m_buildInfo.geometryArrayOfPointers = false;
  186. m_buildInfo.geometryCount = 1;
  187. m_buildInfo.ppGeometries = &m_geometryPtr;
  188. m_buildInfo.scratchData.deviceAddress = MAX_U64;
  189. // Ofset info
  190. m_offsetInfo.firstVertex = 0;
  191. if(m_type == AccelerationStructureType::BOTTOM_LEVEL)
  192. {
  193. m_offsetInfo.primitiveCount = m_bottomLevelInfo.m_indexCount / 3;
  194. }
  195. else
  196. {
  197. m_offsetInfo.primitiveCount = m_topLevelInfo.m_instances.getSize();
  198. }
  199. m_offsetInfo.primitiveOffset = 0;
  200. m_offsetInfo.transformOffset = 0;
  201. }
  202. void AccelerationStructureImpl::computeBarrierInfo(AccelerationStructureUsageBit before,
  203. AccelerationStructureUsageBit after, VkPipelineStageFlags& srcStages,
  204. VkAccessFlags& srcAccesses, VkPipelineStageFlags& dstStages,
  205. VkAccessFlags& dstAccesses)
  206. {
  207. // Before
  208. srcStages = 0;
  209. srcAccesses = 0;
  210. if(before == AccelerationStructureUsageBit::NONE)
  211. {
  212. srcStages |= VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
  213. srcAccesses |= 0;
  214. }
  215. if(!!(before & AccelerationStructureUsageBit::BUILD))
  216. {
  217. srcStages |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
  218. srcAccesses |= VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
  219. }
  220. if(!!(before & AccelerationStructureUsageBit::ATTACH))
  221. {
  222. srcStages |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
  223. srcAccesses |= VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
  224. }
  225. if(!!(before & AccelerationStructureUsageBit::GEOMETRY_READ))
  226. {
  227. srcStages |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
  228. | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
  229. srcAccesses |= VK_ACCESS_MEMORY_READ_BIT; // READ_BIT is the only viable solution by elimination
  230. }
  231. if(!!(before & AccelerationStructureUsageBit::FRAGMENT_READ))
  232. {
  233. srcStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
  234. srcAccesses |= VK_ACCESS_MEMORY_READ_BIT;
  235. }
  236. if(!!(before & AccelerationStructureUsageBit::COMPUTE_READ))
  237. {
  238. srcStages |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
  239. srcAccesses |= VK_ACCESS_MEMORY_READ_BIT;
  240. }
  241. if(!!(before & AccelerationStructureUsageBit::TRACE_RAYS_READ))
  242. {
  243. srcStages |= VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR;
  244. srcAccesses |= VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
  245. }
  246. // After
  247. dstStages = 0;
  248. dstAccesses = 0;
  249. if(!!(after & AccelerationStructureUsageBit::BUILD))
  250. {
  251. dstStages |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
  252. dstAccesses |= VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
  253. }
  254. if(!!(after & AccelerationStructureUsageBit::ATTACH))
  255. {
  256. dstStages |= VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR;
  257. dstAccesses |= VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
  258. }
  259. if(!!(after & AccelerationStructureUsageBit::GEOMETRY_READ))
  260. {
  261. dstStages |= VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
  262. | VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT;
  263. dstAccesses |= VK_ACCESS_MEMORY_READ_BIT; // READ_BIT is the only viable solution by elimination
  264. }
  265. if(!!(after & AccelerationStructureUsageBit::FRAGMENT_READ))
  266. {
  267. dstStages |= VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
  268. dstAccesses |= VK_ACCESS_MEMORY_READ_BIT;
  269. }
  270. if(!!(after & AccelerationStructureUsageBit::COMPUTE_READ))
  271. {
  272. dstStages |= VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT;
  273. dstAccesses |= VK_ACCESS_MEMORY_READ_BIT;
  274. }
  275. if(!!(after & AccelerationStructureUsageBit::TRACE_RAYS_READ))
  276. {
  277. dstStages |= VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR;
  278. dstAccesses |= VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR;
  279. }
  280. ANKI_ASSERT(srcStages && dstStages);
  281. }
  282. } // end namespace anki