X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftransferqueue.cpp;h=9fc941401ed90ef954b4a156ae7b1b801baf149f;hp=8db81020425ee5e705b15bee3e098002483cf728;hb=7d221b1fd6194e59bc0783740a2a17ac71fa4da5;hpb=a9e3cf282bd9c5c43e767552b73068e7a56765e2 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