SpiecsEngine
 
Loading...
Searching...
No Matches

◆ UpdateBlas()

void Spices::VulkanRayTracing::UpdateBlas ( uint32_t blasIdx,
const BlasInput & blas,
VkBuildAccelerationStructureFlagsKHR flags ) const

Update part of BLAS.

Parameters
[in]blasIdxindex of BLAS.
[in]blasspecific BlasInput.
[in]flagsVkBuildAccelerationStructureFlagsKHR.

Definition at line 155 of file VulkanRayTracing.cpp.

156 {
158
159 // Preparing all build information, acceleration is filled later
160 VkAccelerationStructureBuildGeometryInfoKHR buildInfos{};
161 buildInfos.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
162 buildInfos.flags = flags;
163 buildInfos.geometryCount = static_cast<uint32_t>(blas.asGeometry.size());
164 buildInfos.pGeometries = blas.asGeometry.data();
165 buildInfos.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR; // UPDATE
166 buildInfos.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
167 //buildInfos.srcAccelerationStructure = m_blas[blasIdx].accel; // UPDATE
168 //buildInfos.dstAccelerationStructure = m_blas[blasIdx].accel;
169
170 // Find size to build on the device
171 std::vector<uint32_t> maxPrimCount(blas.asBuildOffsetInfo.size());
172
173 for (auto tt = 0; tt < blas.asBuildOffsetInfo.size(); tt++)
174 {
175 maxPrimCount[tt] = blas.asBuildOffsetInfo[tt].primitiveCount; // Number of primitives/triangles
176 }
177
178 VkAccelerationStructureBuildSizesInfoKHR sizeInfo{};
179 sizeInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;
180
181 m_VulkanState.m_VkFunc.vkGetAccelerationStructureBuildSizesKHR(
183 VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR,
184 &buildInfos,
185 maxPrimCount.data(),
186 &sizeInfo
187 );
188
189 // Allocate the scratch buffer and setting the scratch info
190 VulkanBuffer scratchBuffer(
192 "ScratchBuffer",
193 sizeInfo.buildScratchSize,
194 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
195 VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
196 0
197 );
198
199 VkBufferDeviceAddressInfo bufferInfo{};
200 bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO;
201 bufferInfo.buffer = scratchBuffer.Get();
202 buildInfos.scratchData.deviceAddress = vkGetBufferDeviceAddress(m_VulkanState.m_Device, &bufferInfo);
203
204 std::vector<const VkAccelerationStructureBuildRangeInfoKHR*> pBuildOffset(blas.asBuildOffsetInfo.size());
205 for (size_t i = 0; i < blas.asBuildOffsetInfo.size(); i++)
206 {
207 pBuildOffset[i] = &blas.asBuildOffsetInfo[i];
208 }
209
210 // Update the instance buffer on the device side and build the TLAS
211 VulkanCommandBuffer::CustomGraphicCmd(m_VulkanState, [&](const VkCommandBuffer& commandBuffer) {
212 // Update the acceleration structure. Note the VK_TRUE parameter to trigger the update,
213 // and the existing BLAS being passed and updated in place
214 m_VulkanState.m_VkFunc.vkCmdBuildAccelerationStructuresKHR(commandBuffer, 1, &buildInfos, pBuildOffset.data());
215 });
216 }
#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.
VulkanFunctions m_VkFunc
Definition VulkanUtils.h:98

References Spices::VulkanObject::m_VulkanState.