SpiecsEngine
 
Loading...
Searching...
No Matches

◆ BuildTLAS() [1/2]

template<class T >
void Spices::VulkanRayTracing::BuildTLAS ( const std::vector< T > & instances,
VkBuildAccelerationStructureFlagsKHR flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR,
bool update = false,
bool motion = false )
inline

Build TLAS from an array of VkAccelerationStructureInstanceKHR. The resulting TLAS will be stored in m_tlas. update is to rebuild the Tlas with updated matrices, flag must have the 'allow_update'.

Parameters
[in]instancesScene MeshPack Instances data.
[in]flagsVkBuildAccelerationStructureFlagsKHR.
[in]updateTrue if want update rather than create new one.
[in]motionTrue if with VkAccelerationStructureMotionInstanceNV.

Cannot call buildTlas twice except to update.

Create a buffer holding the actual instance data (matrices++) for use by the AS builder.

Command buffer to create the TLAS.

Make sure the copy of the instance buffer are copied before triggering the acceleration structure build.

Definition at line 326 of file VulkanRayTracing.h.

332 {
334
338 assert(m_tlas.accel == VK_NULL_HANDLE || update);
339 const uint32_t countInstance = static_cast<uint32_t>(instances.size());
340
344 VulkanBuffer instancesBuffer(
346 "TLASInstancesBuffer" ,
347 sizeof(T) * instances.size() ,
348 VK_BUFFER_USAGE_TRANSFER_DST_BIT |
349 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT |
350 VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR ,
351 0
352 );
353
354 VulkanBuffer stagingBuffer(
356 "StagingBuffer" ,
357 sizeof(T) * instances.size() ,
358 VK_BUFFER_USAGE_TRANSFER_SRC_BIT ,
359 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
360 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
361 );
362
363 stagingBuffer.WriteToBuffer(instances.data());
364
365 instancesBuffer.CopyBuffer(stagingBuffer.Get(), instancesBuffer.Get(), sizeof(T) * instances.size());
366
367 const VkDeviceAddress instBufferAddr = instancesBuffer.GetAddress();
368
372 std::unique_ptr<VulkanBuffer> scratchBuffer = nullptr;
373 VulkanCommandBuffer::CustomGraphicCmd(m_VulkanState, [&](const VkCommandBuffer& commandBuffer) {
374
378 VkMemoryBarrier barrier{};
379 barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
380 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
381 barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR;
382
383 vkCmdPipelineBarrier(
384 commandBuffer ,
385 VK_PIPELINE_STAGE_TRANSFER_BIT ,
386 VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR ,
387 0 ,
388 1 ,
389 &barrier ,
390 0 ,
391 nullptr ,
392 0 ,
393 nullptr
394 );
395
397 commandBuffer ,
398 countInstance ,
399 instBufferAddr ,
400 scratchBuffer ,
401 flags ,
402 update ,
403 motion
404 );
405 });
406 }
#define SPICES_PROFILE_ZONE
static void CustomGraphicCmd(VulkanState &vulkanState, T func)
Create a new command buffer and record custom cmd, submit to graphic queue, execute it immediately.
VulkanState & m_VulkanState
The global VulkanState Referenced from VulkanRenderBackend.
void 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.
AccelKHR m_tlas
Top-level acceleration structure.
std::shared_ptr< VulkanAccelerationStructure > accel
Definition Attribute.h:18

References Spices::VulkanObject::m_VulkanState.