X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftransferqueue.h;h=536edbd8782830f1352444e2c5f38419653523f4;hb=HEAD;hp=419760bdf4d6b709bd4b28a393428f8da45f9383;hpb=99ca354f18119f82f1adeca100cd665a8f640317;p=libs%2Fgl.git diff --git a/source/backends/vulkan/transferqueue.h b/source/backends/vulkan/transferqueue.h index 419760bd..536edbd8 100644 --- a/source/backends/vulkan/transferqueue.h +++ b/source/backends/vulkan/transferqueue.h @@ -10,6 +10,7 @@ namespace GL { class Buffer; class Device; +class VulkanCommandRecorder; class TransferQueue { @@ -22,46 +23,62 @@ private: 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 &&); ~StagingBuffer(); }; - using TransferCallback = void(VkCommandBuffer, VkBuffer, std::size_t); - struct PendingTransfer { - unsigned buffer_index = 0; + const void *object = 0; + unsigned order = 0; + int buffer_index = -1; std::size_t offset = 0; std::size_t size = 0; - std::function callback; + void *staging_address = 0; + std::function synchronize; + std::function transfer; }; Device &device; std::size_t default_buffer_size = 16*1048576; std::vector buffers; std::vector transfers; + std::vector async_transfers; + std::map next_orders; + unsigned current_frame = 0; public: TransferQueue(Device &); - template - void *prepare_transfer(std::size_t, T &&); + template + void *prepare_transfer(const void *, bool, std::size_t, S &&, T &&); + + template + void prepare_transfer(const void *o, bool r, S &&s, T &&t) + { prepare_transfer(o, r, 0, std::forward(s), std::forward(t)); } + + void finalize_transfer(void *); private: - PendingTransfer &prepare_transfer(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 -void *TransferQueue::prepare_transfer(std::size_t size, T &&callback) +template +void *TransferQueue::prepare_transfer(const void *object, bool ordered, std::size_t size, S &&synchronize, T &&transfer) { - PendingTransfer &pt = prepare_transfer(size); - pt.callback = std::forward(callback); - return static_cast(buffers[pt.buffer_index].mapped_address)+pt.offset; + PendingTransfer &pt = prepare_transfer(object, ordered, size); + pt.synchronize = std::forward(synchronize); + pt.transfer = std::forward(transfer); + return pt.staging_address; } } // namespace GL