From d4445a10509118740f8205d27567d7941e42fc94 Mon Sep 17 00:00:00 2001 From: Lars Hoerttrich <larshoerttrich@uni-koblenz.de> Date: Tue, 17 Aug 2021 13:11:50 +0200 Subject: [PATCH] [#91] combined and renamed functions for clarity, added documentation --- include/vkcv/BufferManager.hpp | 15 ++++++++--- include/vkcv/Core.hpp | 2 +- projects/neural_network/src/main.cpp | 5 ++-- src/vkcv/BufferManager.cpp | 39 ++++++++++------------------ src/vkcv/Core.cpp | 4 +-- 5 files changed, 32 insertions(+), 33 deletions(-) diff --git a/include/vkcv/BufferManager.hpp b/include/vkcv/BufferManager.hpp index 7144350a..1f10c8dc 100644 --- a/include/vkcv/BufferManager.hpp +++ b/include/vkcv/BufferManager.hpp @@ -136,12 +136,21 @@ namespace vkcv const BufferHandle& handle, vk::CommandBuffer cmdBuffer); - void readBufferMemoryBarrier( + + /** + * Reads buffer data from GPU for a given buffer handle + * and writes it to data pointer. Uses cmdBuffer to + * create neccessary memory barriers. + * + * @param handle Buffer handle to read + * @param cmdBuffer commandbuffer to execute memory barriers + * @param data data pointer to which result will be written + * + */ + void readBuffer( 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 66a50e56..50a5a8a4 100644 --- a/include/vkcv/Core.hpp +++ b/include/vkcv/Core.hpp @@ -303,7 +303,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 recordReadBuffer(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data); void resolveMSAAImage(const CommandStreamHandle& cmdStream, const ImageHandle& src, const ImageHandle& dst); [[nodiscard]] diff --git a/projects/neural_network/src/main.cpp b/projects/neural_network/src/main.cpp index 648b025e..8958adbb 100644 --- a/projects/neural_network/src/main.cpp +++ b/projects/neural_network/src/main.cpp @@ -63,7 +63,7 @@ int main(int argc, const char** argv) { std::cout << "Error. Could not create compute pipeline. Exiting." << std::endl; return EXIT_FAILURE; } - + for(int i =0;i<3;i++){ auto cmdStream = core.createCommandStream(vkcv::QueueType::Compute); uint32_t computeDispatchCount[3] = {64,1,1 }; @@ -78,12 +78,13 @@ int main(int argc, const char** argv) { int output[64] = { 0 }; std::fill_n(output, 64, -1); - core.readBufferMemoryBarrier(cmdStream, inputBuffer.getHandle(), &output); + core.recordReadBuffer(cmdStream, inputBuffer.getHandle(), &output); core.submitCommandStream(cmdStream); std::cout << "["; for (int i = 0; i < 64; i++) { std::cout << output[i] << ", "; } std::cout << "]" << std::endl; + } return 0; } diff --git a/src/vkcv/BufferManager.cpp b/src/vkcv/BufferManager.cpp index fbe6e2e7..ea040809 100644 --- a/src/vkcv/BufferManager.cpp +++ b/src/vkcv/BufferManager.cpp @@ -330,33 +330,15 @@ 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(reinterpret_cast<int*>(data), reinterpret_cast<char*>(mapped) , max_size); - allocator.unmapMemory(buffer.m_allocation); - } - - void BufferManager ::readBufferMemoryBarrier(const BufferHandle& handle, vk::CommandBuffer cmdBuffer, void *data) { + void BufferManager ::readBuffer(const BufferHandle& handle, vk::CommandBuffer cmdBuffer, void *data) { const uint64_t id = handle.getId(); + size_t size = getBufferSize(handle); + + if (size == 0) { + size = SIZE_MAX; + } if (id >= m_buffers.size()) { vkcv_log(vkcv::LogLevel::ERROR, "Invalid buffer handle"); @@ -382,7 +364,14 @@ namespace vkcv { memoryBarrier, nullptr); - readBuffer(handle, data); + 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(reinterpret_cast<int*>(data), reinterpret_cast<char*>(mapped), max_size); + allocator.unmapMemory(buffer.m_allocation); vk::BufferMemoryBarrier memoryBarrier2( vk::AccessFlagBits::eTransferWrite, diff --git a/src/vkcv/Core.cpp b/src/vkcv/Core.cpp index aaf8a7a6..6c3a388b 100644 --- a/src/vkcv/Core.cpp +++ b/src/vkcv/Core.cpp @@ -698,9 +698,9 @@ namespace vkcv }, nullptr); } - void Core::readBufferMemoryBarrier(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data) { + void Core::recordReadBuffer(const CommandStreamHandle cmdStream, const BufferHandle buffer, void *data) { recordCommandsToStream(cmdStream, [buffer, this, data](const vk::CommandBuffer cmdBuffer) { - m_BufferManager->readBufferMemoryBarrier(buffer, cmdBuffer, data); + m_BufferManager->readBuffer(buffer, cmdBuffer, data); }, nullptr); } -- GitLab