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