1 #ifndef MSP_GL_VULKAN_TRANSFERQUEUE_H_
2 #define MSP_GL_VULKAN_TRANSFERQUEUE_H_
21 unsigned memory_id = 0;
24 void *mapped_address = 0;
26 StagingBuffer(Device &, std::size_t);
27 StagingBuffer(StagingBuffer &&);
31 struct PendingTransfer
34 int buffer_index = -1;
35 std::size_t offset = 0;
37 std::function<void()> synchronize;
38 std::function<void(VkCommandBuffer, VkBuffer, std::size_t)> transfer;
42 std::size_t default_buffer_size = 16*1048576;
43 std::vector<StagingBuffer> buffers;
44 std::vector<PendingTransfer> transfers;
45 std::map<void *, unsigned> next_orders;
48 TransferQueue(Device &);
50 template<typename S, typename T>
51 void *prepare_transfer(void *, bool, std::size_t, S &&, T &&);
54 PendingTransfer &prepare_transfer(void *, bool, std::size_t);
57 void dispatch_transfers(VkCommandBuffer);
60 template<typename S, typename T>
61 void *TransferQueue::prepare_transfer(void *object, bool ordered, std::size_t size, S &&synchronize, T &&transfer)
63 PendingTransfer &pt = prepare_transfer(object, ordered, size);
64 pt.synchronize = std::forward<S>(synchronize);
65 pt.transfer = std::forward<T>(transfer);
66 return (pt.buffer_index<0 ? 0 : static_cast<char *>(buffers[pt.buffer_index].mapped_address)+pt.offset);