From 7d221b1fd6194e59bc0783740a2a17ac71fa4da5 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 20 Dec 2021 23:03:33 +0200 Subject: [PATCH] Reset staging buffers in TransferQueue once the transfers are done --- source/backends/vulkan/transferqueue.cpp | 11 +++++++++++ source/backends/vulkan/transferqueue.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/source/backends/vulkan/transferqueue.cpp b/source/backends/vulkan/transferqueue.cpp index 8db81020..9fc94140 100644 --- a/source/backends/vulkan/transferqueue.cpp +++ b/source/backends/vulkan/transferqueue.cpp @@ -28,6 +28,7 @@ void TransferQueue::allocate_staging(PendingTransfer &transfer, size_t size) transfer.staging_address = static_cast(i->mapped_address)+transfer.offset; i->used += size; + ++i->async_count; } TransferQueue::PendingTransfer &TransferQueue::prepare_transfer(const void *object, bool ordered, size_t size) @@ -53,6 +54,8 @@ void TransferQueue::finalize_transfer(void *staging) if(i==async_transfers.end() || i->staging_address!=staging) throw key_error(staging); + if(i->buffer_index>=0) + --buffers[i->buffer_index].async_count; insert_transfer(move(*i)); async_transfers.erase(i); } @@ -79,6 +82,7 @@ void TransferQueue::dispatch_transfers(VkCommandBuffer command_buffer) if(transfers.empty()) return; + ++current_frame; for(auto i=transfers.begin(); i!=transfers.end(); ) { auto j = i; @@ -91,11 +95,18 @@ void TransferQueue::dispatch_transfers(VkCommandBuffer command_buffer) { VkBuffer buffer = (i->buffer_index>=0 ? buffers[i->buffer_index].buffer : 0); i->transfer(command_buffer, buffer, i->offset); + if(i->buffer_index>=0) + buffers[i->buffer_index].last_frame = current_frame; } } transfers.clear(); next_orders.clear(); + + unsigned n_frames_in_flight = device.get_n_frames_in_flight(); + for(StagingBuffer &b: buffers) + if(!b.async_count && b.last_frame+n_frames_in_flight transfers; std::vector async_transfers; std::map next_orders; + unsigned current_frame = 0; public: TransferQueue(Device &); -- 2.45.2