X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftransferqueue.cpp;h=f6f3c6f5079f2c2a01812348616d8b1fb83ef367;hb=e9d24b3844110f8a545083bb0acbc504737aca88;hp=8db81020425ee5e705b15bee3e098002483cf728;hpb=33253bf6d6a330181fda83ba23a6ac0a756d9a8d;p=libs%2Fgl.git diff --git a/source/backends/vulkan/transferqueue.cpp b/source/backends/vulkan/transferqueue.cpp index 8db81020..f6f3c6f5 100644 --- a/source/backends/vulkan/transferqueue.cpp +++ b/source/backends/vulkan/transferqueue.cpp @@ -27,7 +27,9 @@ void TransferQueue::allocate_staging(PendingTransfer &transfer, size_t size) transfer.size = size; transfer.staging_address = static_cast(i->mapped_address)+transfer.offset; - i->used += size; + i->used += size+47; + i->used -= i->used%48; + ++i->async_count; } TransferQueue::PendingTransfer &TransferQueue::prepare_transfer(const void *object, bool ordered, size_t size) @@ -53,6 +55,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 +83,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 +96,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