1 #ifndef MSP_GL_VULKAN_TRANSFERQUEUE_H_
2 #define MSP_GL_VULKAN_TRANSFERQUEUE_H_
13 class VulkanCommandRecorder;
22 unsigned memory_id = 0;
25 void *mapped_address = 0;
26 unsigned async_count = 0;
27 unsigned last_frame = 0;
29 StagingBuffer(Device &, std::size_t);
30 StagingBuffer(StagingBuffer &&);
34 struct PendingTransfer
36 const void *object = 0;
38 int buffer_index = -1;
39 std::size_t offset = 0;
41 void *staging_address = 0;
42 std::function<void()> synchronize;
43 std::function<void(const VulkanCommandRecorder &, VkBuffer, std::size_t)> transfer;
47 std::size_t default_buffer_size = 16*1048576;
48 std::vector<StagingBuffer> buffers;
49 std::vector<PendingTransfer> transfers;
50 std::vector<PendingTransfer> async_transfers;
51 std::map<const void *, unsigned> next_orders;
52 unsigned current_frame = 0;
55 TransferQueue(Device &);
57 template<typename S, typename T>
58 void *prepare_transfer(const void *, bool, std::size_t, S &&, T &&);
60 template<typename S, typename T>
61 void prepare_transfer(const void *o, bool r, S &&s, T &&t)
62 { prepare_transfer(o, r, 0, std::forward<S>(s), std::forward<T>(t)); }
64 void finalize_transfer(void *);
67 void allocate_staging(PendingTransfer &, std::size_t);
68 PendingTransfer &prepare_transfer(const void *, bool, std::size_t);
69 PendingTransfer &insert_transfer(PendingTransfer &&);
72 void dispatch_transfers(const VulkanCommandRecorder &);
75 template<typename S, typename T>
76 void *TransferQueue::prepare_transfer(const void *object, bool ordered, std::size_t size, S &&synchronize, T &&transfer)
78 PendingTransfer &pt = prepare_transfer(object, ordered, size);
79 pt.synchronize = std::forward<S>(synchronize);
80 pt.transfer = std::forward<T>(transfer);
81 return pt.staging_address;