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.
332 {
334
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;
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