Skip to content

Commit f76dc6e

Browse files
Merge pull request #36 from rokuz/rt_tlas_fix
Store scracth buffer for TLAS updating
2 parents c297911 + 3d553a0 commit f76dc6e

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

lvk/vulkan/VulkanClasses.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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

714719
namespace 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

lvk/vulkan/VulkanClasses.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ struct AccelerationStructure {
321321
VkAccelerationStructureKHR vkHandle = VK_NULL_HANDLE;
322322
uint64_t deviceAddress = 0;
323323
lvk::Holder<lvk::BufferHandle> buffer;
324+
lvk::Holder<lvk::BufferHandle> scratchBuffer; // Store only for TLAS
324325
};
325326

326327
class CommandBuffer final : public ICommandBuffer {

0 commit comments

Comments
 (0)