SpiecsEngine
 
Loading...
Searching...
No Matches

◆ CmdCreateTLAS()

void Spices::VulkanRayTracing::CmdCreateTLAS ( VkCommandBuffer cmdBuf,
uint32_t countInstance,
VkDeviceAddress instBufferAddr,
std::unique_ptr< VulkanBuffer > & scratchBuffer,
VkBuildAccelerationStructureFlagsKHR flags,
bool update,
bool motion )

Low level of Tlas creation. Creating the TLAS, called by buildTlas.

Parameters
[in]cmdBufVkCommandBuffer.
[in]countInstancenumber of instances.
[in]instBufferAddrBuffer address of instances.
[in]scratchBufferScratchBuffer Buffer.
[in]flagsBuild creation flag.
[in]updateUpdate == animation.
[in]motionMotion Blur.

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.

Build Offsets info : n instances.

Build the TLAS.

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.

Build Offsets info : n instances.

Build the TLAS.

Definition at line 229 of file VulkanRayTracing.cpp.

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
271 m_VulkanState.m_VkFunc.vkGetAccelerationStructureBuildSizesKHR(
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
307 m_tlas = CreateAcceleration(createInfo);
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
Definition Attribute.h:18
VulkanFunctions m_VkFunc
Definition VulkanUtils.h:98