X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftransferqueue.h;h=58b1bc2d6fa5f4743964c72d1e15e01305a97af0;hb=c633fcc87e295ebc88b5847c44ca0da121652819;hp=a25519c8a121b417b0fe1dc1a60692bc7f7f90ff;hpb=d9c769b5847beefa378d2c5555f5b5d8e5d26c0e;p=libs%2Fgl.git diff --git a/source/backends/vulkan/transferqueue.h b/source/backends/vulkan/transferqueue.h index a25519c8..58b1bc2d 100644 --- a/source/backends/vulkan/transferqueue.h +++ b/source/backends/vulkan/transferqueue.h @@ -30,7 +30,8 @@ private: struct PendingTransfer { - unsigned buffer_index = 0; + unsigned order = 0; + int buffer_index = -1; std::size_t offset = 0; std::size_t size = 0; std::function synchronize; @@ -41,27 +42,28 @@ private: std::size_t default_buffer_size = 16*1048576; std::vector buffers; std::vector transfers; + std::map next_orders; public: TransferQueue(Device &); template - void *prepare_transfer(std::size_t, S &&, T &&); + void *prepare_transfer(const void *, bool, std::size_t, S &&, T &&); private: - PendingTransfer &prepare_transfer(std::size_t); + PendingTransfer &prepare_transfer(const void *, bool, std::size_t); public: void dispatch_transfers(VkCommandBuffer); }; template -void *TransferQueue::prepare_transfer(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(size); + PendingTransfer &pt = prepare_transfer(object, ordered, size); pt.synchronize = std::forward(synchronize); pt.transfer = std::forward(transfer); - return static_cast(buffers[pt.buffer_index].mapped_address)+pt.offset; + return (pt.buffer_index<0 ? 0 : static_cast(buffers[pt.buffer_index].mapped_address)+pt.offset); } } // namespace GL