transfer.size = size;
transfer.staging_address = static_cast<char *>(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)
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);
}
return *j;
}
-void TransferQueue::dispatch_transfers(VkCommandBuffer command_buffer)
+void TransferQueue::dispatch_transfers(const VulkanCommandRecorder &vkCmd)
{
if(transfers.empty())
return;
+ ++current_frame;
for(auto i=transfers.begin(); i!=transfers.end(); )
{
auto j = i;
for(; (j!=transfers.end() && j->order==i->order); ++j)
j->synchronize();
- device.get_synchronizer().barrier(command_buffer);
+ device.get_synchronizer().barrier(vkCmd);
for(; i!=j; ++i)
{
VkBuffer buffer = (i->buffer_index>=0 ? buffers[i->buffer_index].buffer : 0);
- i->transfer(command_buffer, buffer, i->offset);
+ i->transfer(vkCmd, 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<current_frame)
+ b.used = 0;
}
MemoryAllocator &allocator = device.get_allocator();
memory_id = allocator.allocate(buffer, STAGING_MEMORY);
- mapped_address = allocator.map(memory_id, 0, size);
+ mapped_address = allocator.map(memory_id);
}
TransferQueue::StagingBuffer::StagingBuffer(StagingBuffer &&other):
if(mapped_address)
{
- allocator.unmap(mapped_address);
+ allocator.unmap(memory_id);
allocator.release(memory_id);
}
if(buffer)