diff --git a/include/vkcv/BufferManager.hpp b/include/vkcv/BufferManager.hpp index 7144350afede0dc597f0fe6c6da2e4af5a9075e9..1f10c8dc4bbdf3142ffffcd6e1061fc83d52c0f6 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 66a50e5640783048a41f5ca18dbdffc6f5be679b..50a5a8a452a930a772533fe7cf7c627540442461 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 648b025e31cfed2cf06706d61ce9e013ae5a07ca..8958adbb9d6b9eea79f2b5a8e7a95298bb7ffe60 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 fbe6e2e7d0008b3856a44de82eb5e8d76f987cf5..ea0408094d86d72206eff7d31566e4af7c182d80 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 aaf8a7a6aeacc4af7fdfc4b42914dcd54a754e57..6c3a388b8c0f668b7994b7cd6c7c5106f2ab10dd 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); }