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