From 404685d6ed5c2353bdc17f96819f927f0e5b20a8 Mon Sep 17 00:00:00 2001 From: Tobias Frisch <tfrisch@uni-koblenz.de> Date: Tue, 29 Nov 2022 01:27:04 +0100 Subject: [PATCH] Allow building acceleration structures from multiple geometry data elements Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de> --- modules/scene/src/vkcv/scene/Mesh.cpp | 1 - src/vkcv/AccelerationStructureManager.cpp | 28 +++++++++++++++++------ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/modules/scene/src/vkcv/scene/Mesh.cpp b/modules/scene/src/vkcv/scene/Mesh.cpp index 09358824..cd0509e7 100644 --- a/modules/scene/src/vkcv/scene/Mesh.cpp +++ b/modules/scene/src/vkcv/scene/Mesh.cpp @@ -131,7 +131,6 @@ namespace vkcv::scene { for (auto& part : m_parts) { if (part.m_geometry.isValid()) { geometryData.push_back(part.m_geometry); - break; // TODO: Ensure safe support of multiple geometry data structures to build bottom-level acceleration structures first! Avoid crashes! } } diff --git a/src/vkcv/AccelerationStructureManager.cpp b/src/vkcv/AccelerationStructureManager.cpp index 1dafe9f3..b673921b 100644 --- a/src/vkcv/AccelerationStructureManager.cpp +++ b/src/vkcv/AccelerationStructureManager.cpp @@ -199,18 +199,33 @@ namespace vkcv { cmdStream, [&geometryInfos, &pRangeInfos, &dynamicDispatch]( const vk::CommandBuffer &cmdBuffer) { - cmdBuffer.buildAccelerationStructuresKHR( - static_cast<uint32_t>(geometryInfos.size()), - geometryInfos.data(), - pRangeInfos.data(), - dynamicDispatch + const vk::MemoryBarrier barrier ( + vk::AccessFlagBits::eAccelerationStructureWriteKHR, + vk::AccessFlagBits::eAccelerationStructureReadKHR ); + + for (size_t i = 0; i < geometryInfos.size(); i++) { + cmdBuffer.buildAccelerationStructuresKHR( + 1, + &(geometryInfos[i]), + &(pRangeInfos[i]), + dynamicDispatch + ); + + cmdBuffer.pipelineBarrier( + vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::PipelineStageFlagBits::eAccelerationStructureBuildKHR, + vk::DependencyFlags(), + barrier, + nullptr, + nullptr + ); + } }, nullptr ); core.submitCommandStream(cmdStream, false); - core.getContext().getDevice().waitIdle(); // TODO: Fix that mess! return { accelerationStructure, @@ -262,7 +277,6 @@ namespace vkcv { const auto vertexCount = (vertexBufferSize / vertexStride); const vk::Format vertexFormat = getVertexFormat(data.getGeometryVertexType()); - const vk::IndexType indexType = getIndexType(data.getIndexBitCount()); const vk::AccelerationStructureGeometryTrianglesDataKHR asTrianglesData ( -- GitLab