diff --git a/modules/scene/src/vkcv/scene/Mesh.cpp b/modules/scene/src/vkcv/scene/Mesh.cpp index 09358824dd5510499a00055ad26dc72284703100..cd0509e787d4810209a8d36e99af6b98b9fc67ea 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 1dafe9f3230ac1e673c996fdd786235e639fce7a..b673921bf9e9db9b3dfc1282640a414043c805d4 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 (