class Buffer;
class Device;
+class VulkanCommandRecorder;
class TransferQueue
{
std::size_t size = 0;
std::size_t used = 0;
void *mapped_address = 0;
+ unsigned async_count = 0;
+ unsigned last_frame = 0;
StagingBuffer(Device &, std::size_t);
StagingBuffer(StagingBuffer &&);
struct PendingTransfer
{
+ const void *object = 0;
unsigned order = 0;
- unsigned buffer_index = 0;
+ int buffer_index = -1;
std::size_t offset = 0;
std::size_t size = 0;
+ void *staging_address = 0;
std::function<void()> synchronize;
- std::function<void(VkCommandBuffer, VkBuffer, std::size_t)> transfer;
+ std::function<void(const VulkanCommandRecorder &, VkBuffer, std::size_t)> transfer;
};
Device &device;
std::size_t default_buffer_size = 16*1048576;
std::vector<StagingBuffer> buffers;
std::vector<PendingTransfer> transfers;
- std::map<void *, unsigned> next_orders;
+ std::vector<PendingTransfer> async_transfers;
+ std::map<const void *, unsigned> next_orders;
+ unsigned current_frame = 0;
public:
TransferQueue(Device &);
template<typename S, typename T>
- void *prepare_transfer(void *, bool, std::size_t, S &&, T &&);
+ void *prepare_transfer(const void *, bool, std::size_t, S &&, T &&);
+
+ template<typename S, typename T>
+ void prepare_transfer(const void *o, bool r, S &&s, T &&t)
+ { prepare_transfer(o, r, 0, std::forward<S>(s), std::forward<T>(t)); }
+
+ void finalize_transfer(void *);
private:
- PendingTransfer &prepare_transfer(void *, bool, std::size_t);
+ void allocate_staging(PendingTransfer &, std::size_t);
+ PendingTransfer &prepare_transfer(const void *, bool, std::size_t);
+ PendingTransfer &insert_transfer(PendingTransfer &&);
public:
- void dispatch_transfers(VkCommandBuffer);
+ void dispatch_transfers(const VulkanCommandRecorder &);
};
template<typename S, typename T>
-void *TransferQueue::prepare_transfer(void *object, bool ordered, std::size_t size, S &&synchronize, T &&transfer)
+void *TransferQueue::prepare_transfer(const void *object, bool ordered, std::size_t size, S &&synchronize, T &&transfer)
{
PendingTransfer &pt = prepare_transfer(object, ordered, size);
pt.synchronize = std::forward<S>(synchronize);
pt.transfer = std::forward<T>(transfer);
- return static_cast<char *>(buffers[pt.buffer_index].mapped_address)+pt.offset;
+ return pt.staging_address;
}
} // namespace GL