@@ -709,6 +709,11 @@ VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>
709709 return formats[0 ];
710710}
711711
712+ VkDeviceSize bufferSize (lvk::VulkanContext& ctx, const lvk::Holder<lvk::BufferHandle>& handle) {
713+ lvk::VulkanBuffer* buffer = ctx.buffersPool_ .get (handle);
714+ return buffer ? buffer->bufferSize_ : 0 ;
715+ }
716+
712717} // namespace
713718
714719namespace lvk {
@@ -2853,16 +2858,19 @@ void lvk::CommandBuffer::cmdUpdateTLAS(AccelStructHandle handle, BufferHandle in
28532858 &accelerationStructureBuildGeometryInfo,
28542859 &as->buildRangeInfo .primitiveCount ,
28552860 &accelerationStructureBuildSizesInfo);
2856-
2857- lvk::Holder<lvk::BufferHandle> scratchBuffer = ctx_->createBuffer (
2858- lvk::BufferDesc{
2859- .usage = lvk::BufferUsageBits_Storage,
2860- .storage = lvk::StorageType_Device,
2861- .size = accelerationStructureBuildSizesInfo.buildScratchSize ,
2862- .debugName = " scratchBuffer" ,
2863- },
2864- nullptr ,
2865- nullptr );
2861+
2862+ if (!as->scratchBuffer .valid () || bufferSize (*ctx_, as->scratchBuffer ) < accelerationStructureBuildSizesInfo.buildScratchSize ) {
2863+ LLOGD (" Recreating scratch buffer for TLAS update" );
2864+ as->scratchBuffer = ctx_->createBuffer (
2865+ lvk::BufferDesc{
2866+ .usage = lvk::BufferUsageBits_Storage,
2867+ .storage = lvk::StorageType_Device,
2868+ .size = accelerationStructureBuildSizesInfo.buildScratchSize ,
2869+ .debugName = " scratchBuffer" ,
2870+ },
2871+ nullptr ,
2872+ nullptr );
2873+ }
28662874
28672875 const VkAccelerationStructureBuildGeometryInfoKHR accelerationBuildGeometryInfo = {
28682876 .sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR,
@@ -2873,7 +2881,7 @@ void lvk::CommandBuffer::cmdUpdateTLAS(AccelStructHandle handle, BufferHandle in
28732881 .dstAccelerationStructure = as->vkHandle ,
28742882 .geometryCount = 1 ,
28752883 .pGeometries = &accelerationStructureGeometry,
2876- .scratchData = {.deviceAddress = ctx_->gpuAddress (scratchBuffer)},
2884+ .scratchData = {.deviceAddress = ctx_->gpuAddress (as-> scratchBuffer )},
28772885 };
28782886
28792887 const VkAccelerationStructureBuildRangeInfoKHR* accelerationBuildStructureRangeInfos[] = {&as->buildRangeInfo };
@@ -4359,7 +4367,7 @@ lvk::AccelStructHandle lvk::VulkanContext::createTLAS(const AccelStructDesc& des
43594367 },
43604368 nullptr ,
43614369 outResult);
4362-
4370+
43634371 const VkAccelerationStructureBuildGeometryInfoKHR accelerationBuildGeometryInfo = {
43644372 .sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR,
43654373 .type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR,
@@ -4370,6 +4378,10 @@ lvk::AccelStructHandle lvk::VulkanContext::createTLAS(const AccelStructDesc& des
43704378 .pGeometries = &accelerationStructureGeometry,
43714379 .scratchData = {.deviceAddress = gpuAddress (scratchBuffer)},
43724380 };
4381+ if (desc.buildFlags & lvk::AccelStructBuildFlagBits_AllowUpdate) {
4382+ // Store scratch buffer for future updates
4383+ accelStruct.scratchBuffer = std::move (scratchBuffer);
4384+ }
43734385
43744386 const VkAccelerationStructureBuildRangeInfoKHR* accelerationBuildStructureRangeInfos[] = {&accelStruct.buildRangeInfo };
43754387
0 commit comments