From 0fcdae9daee5578c65ddbd6cb6f17f2498020de4 Mon Sep 17 00:00:00 2001
From: Leonie Franken <lfranken@uni-koblenz.de>
Date: Thu, 29 Jul 2021 15:59:16 +0200
Subject: [PATCH] [#91] reading from Buffer **warning** broken

---
 include/vkcv/BufferManager.hpp       |  7 +++
 include/vkcv/Core.hpp                |  1 +
 projects/neural_network/src/main.cpp |  4 +-
 src/vkcv/BufferManager.cpp           | 74 ++++++++++++++++++++++++++++
 src/vkcv/Core.cpp                    |  6 +++
 5 files changed, 91 insertions(+), 1 deletion(-)

diff --git a/include/vkcv/BufferManager.hpp b/include/vkcv/BufferManager.hpp
index c7f32d9f..7144350a 100644
--- a/include/vkcv/BufferManager.hpp
+++ b/include/vkcv/BufferManager.hpp
@@ -135,6 +135,13 @@ namespace vkcv
 		void recordBufferMemoryBarrier(
 			const BufferHandle& handle,
 			vk::CommandBuffer cmdBuffer);
+
+		void readBufferMemoryBarrier(
+		    const BufferHandle& handle,
+		    vk::CommandBuffer cmdBuffer,
+		    void* data);
+
+        void readBuffer(const BufferHandle& handle, void *data);
 	};
 	
 }
diff --git a/include/vkcv/Core.hpp b/include/vkcv/Core.hpp
index cd3676f4..5db834cb 100644
--- a/include/vkcv/Core.hpp
+++ b/include/vkcv/Core.hpp
@@ -289,6 +289,7 @@ namespace vkcv
 		void prepareImageForStorage(const CommandStreamHandle cmdStream, const ImageHandle image);
 		void recordImageMemoryBarrier(const CommandStreamHandle cmdStream, const ImageHandle image);
 		void recordBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer);
+        void readBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data);
 		void resolveMSAAImage(CommandStreamHandle cmdStream, ImageHandle src, ImageHandle dst);
 
 		vk::ImageView getSwapchainImageView() const;
diff --git a/projects/neural_network/src/main.cpp b/projects/neural_network/src/main.cpp
index 1da1ce40..612ebd7a 100644
--- a/projects/neural_network/src/main.cpp
+++ b/projects/neural_network/src/main.cpp
@@ -75,8 +75,10 @@ int main(int argc, const char** argv) {
         { vkcv::DescriptorSetUsage(0,core.getDescriptorSet(computeDescriptorSet).vulkanHandle) },
         pushConstantsCompute);
 
-    core.recordBufferMemoryBarrier(cmdStream, inputBuffer.getHandle());
+    int output[64] = { 0 };
+    core.readBufferMemoryBarrier(cmdStream, inputBuffer.getHandle(), &output);
     core.submitCommandStream(cmdStream);
 
+    std::cout << output << std::endl;
     return 0;
 }
diff --git a/src/vkcv/BufferManager.cpp b/src/vkcv/BufferManager.cpp
index cfa23329..85515f31 100644
--- a/src/vkcv/BufferManager.cpp
+++ b/src/vkcv/BufferManager.cpp
@@ -330,4 +330,78 @@ namespace vkcv {
 			nullptr);
 	}
 
+    void BufferManager::readBuffer(const BufferHandle& handle, void *data) {
+        const uint64_t id = handle.getId();
+        size_t size = getBufferSize(handle);
+
+        if (size == 0) {
+            size = SIZE_MAX;
+        }
+
+        if (id >= m_buffers.size()) {
+            return;
+        }
+
+        auto& buffer = m_buffers[id];
+
+        const vma::Allocator& allocator = m_core->getContext().getAllocator();
+
+
+        const size_t max_size = std::min(size, buffer.m_size);
+
+        void* mapped = allocator.mapMemory(buffer.m_allocation);
+        memcpy(data, reinterpret_cast<char*>(mapped) , max_size);
+        allocator.unmapMemory(buffer.m_allocation);
+
+    }
+
+    void BufferManager ::readBufferMemoryBarrier(const BufferHandle& handle, vk::CommandBuffer cmdBuffer, void *data) {
+
+        const uint64_t id = handle.getId();
+
+        if (id >= m_buffers.size()) {
+            vkcv_log(vkcv::LogLevel::ERROR, "Invalid buffer handle");
+            return;
+        }
+
+        auto& buffer = m_buffers[id];
+
+        vk::BufferMemoryBarrier memoryBarrier(
+                vk::AccessFlagBits::eShaderWrite,
+                vk::AccessFlagBits::eTransferRead,
+                0,
+                0,
+                buffer.m_handle,
+                0,
+                buffer.m_size);
+
+        cmdBuffer.pipelineBarrier(
+                vk::PipelineStageFlagBits::eTopOfPipe,
+                vk::PipelineStageFlagBits::eBottomOfPipe,
+                {},
+                nullptr,
+                memoryBarrier,
+                nullptr);
+
+        readBuffer(handle, data);
+
+        vk::BufferMemoryBarrier memoryBarrier2(
+                vk::AccessFlagBits::eTransferWrite,
+                vk::AccessFlagBits::eHostRead,
+                0,
+                0,
+                buffer.m_handle,
+                0,
+                buffer.m_size);
+
+        cmdBuffer.pipelineBarrier(
+                vk::PipelineStageFlagBits::eTopOfPipe,
+                vk::PipelineStageFlagBits::eBottomOfPipe,
+                {},
+                nullptr,
+                memoryBarrier2,
+                nullptr);
+    }
+
+
 }
diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp
index a66c1e62..bdfbdeef 100644
--- a/src/vkcv/Core.cpp
+++ b/src/vkcv/Core.cpp
@@ -574,6 +574,12 @@ namespace vkcv
 			m_BufferManager->recordBufferMemoryBarrier(buffer, cmdBuffer);
 		}, nullptr);
 	}
+
+	void Core::readBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data) {
+		recordCommandsToStream(cmdStream, [buffer, this, data](const vk::CommandBuffer cmdBuffer) {
+			m_BufferManager->readBufferMemoryBarrier(buffer, cmdBuffer, data);
+		}, nullptr);
+	}
 	
 	void Core::resolveMSAAImage(CommandStreamHandle cmdStream, ImageHandle src, ImageHandle dst) {
 		recordCommandsToStream(cmdStream, [src, dst, this](const vk::CommandBuffer cmdBuffer) {
-- 
GitLab