Low level of Tlas creation. Creating the TLAS, called by buildTlas.
Wraps a device pointer to the above uploaded instances.
Put the above into a VkAccelerationStructureGeometryKHR.We need to put the instances struct in a union and label it as instance data.
Find sizes.
Create TLAS.
Allocate the scratch memory.
Update build information.
Wraps a device pointer to the above uploaded instances.
Put the above into a VkAccelerationStructureGeometryKHR.We need to put the instances struct in a union and label it as instance data.
Find sizes.
Create TLAS.
Allocate the scratch memory.
Update build information.
238 {
240
244 VkAccelerationStructureGeometryInstancesDataKHR instancesVk{};
245 instancesVk.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
246 instancesVk.data.deviceAddress = instBufferAddr;
247
251 VkAccelerationStructureGeometryKHR topASGeometry{};
252 topASGeometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
253 topASGeometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
254 topASGeometry.geometry.instances = instancesVk;
255
259 VkAccelerationStructureBuildGeometryInfoKHR buildInfo{};
260 buildInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
261 buildInfo.flags = flags;
262 buildInfo.geometryCount = 1;
263 buildInfo.pGeometries = &topASGeometry;
264 buildInfo.mode = update ? VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR : VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
265 buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
266 buildInfo.srcAccelerationStructure = VK_NULL_HANDLE;
267
268 VkAccelerationStructureBuildSizesInfoKHR sizeInfo{};
269 sizeInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
270
273 VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR,
274 &buildInfo,
275 &countInstance,
276 &sizeInfo
277 );
278
279#ifdef VK_NV_ray_tracing_motion_blur
280
281 VkAccelerationStructureMotionInfoNV motionInfo{};
282 motionInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV;
283 motionInfo.maxInstances = countInstance;
284
285#endif
286
290 if (update == false)
291 {
292 VkAccelerationStructureCreateInfoKHR createInfo{};
293 createInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
294 createInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
295 createInfo.size = sizeInfo.accelerationStructureSize;
296
297#ifdef VK_NV_ray_tracing_motion_blur
298
299 if (motion)
300 {
301 createInfo.createFlags = VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV;
302 createInfo.pNext = &motionInfo;
303 }
304
305#endif
306
308 }
309
313 scratchBuffer = std::make_unique<VulkanBuffer>(
315 "ScratchBuffer",
316 sizeInfo.buildScratchSize,
317 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
318 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
320 );
321
322 VkDeviceAddress scratchAddress = scratchBuffer->GetAddress();
323
327 buildInfo.srcAccelerationStructure = update ?
m_tlas.
accel->Get() : VK_NULL_HANDLE;
328 buildInfo.dstAccelerationStructure =
m_tlas.
accel->Get();
329 buildInfo.scratchData.deviceAddress = scratchAddress;
330
334 VkAccelerationStructureBuildRangeInfoKHR buildOffsetInfo{};
335 buildOffsetInfo.primitiveCount = countInstance;
336 buildOffsetInfo.primitiveOffset = 0;
337 buildOffsetInfo.firstVertex = 0;
338 buildOffsetInfo.transformOffset = 0;
339
340 const VkAccelerationStructureBuildRangeInfoKHR* pBuildOffsetInfo = &buildOffsetInfo;
341
345 m_VulkanState.
m_VkFunc.vkCmdBuildAccelerationStructuresKHR(cmdBuf, 1, &buildInfo, &pBuildOffsetInfo);
346 }
#define SPICES_PROFILE_ZONE
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
AccelKHR m_tlas
Top-level acceleration structure.
AccelKHR CreateAcceleration(VkAccelerationStructureCreateInfoKHR &accel) const
Create Acceleration.
@ VMA_MEMORY_PROPERTY_DEDICATED_MEMORY_BIT
VkMemoryPropertyFlagBits.
std::shared_ptr< VulkanAccelerationStructure > accel