X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fbackends%2Fvulkan%2Ftransferqueue.h;h=592bb69e1303458870842391c2d1ad41ba44049f;hp=58b1bc2d6fa5f4743964c72d1e15e01305a97af0;hb=33253bf6d6a330181fda83ba23a6ac0a756d9a8d;hpb=c633fcc87e295ebc88b5847c44ca0da121652819 diff --git a/source/backends/vulkan/transferqueue.h b/source/backends/vulkan/transferqueue.h index 58b1bc2d..592bb69e 100644 --- a/source/backends/vulkan/transferqueue.h +++ b/source/backends/vulkan/transferqueue.h @@ -30,10 +30,12 @@ private: struct PendingTransfer { + const void *object = 0; unsigned order = 0; int buffer_index = -1; std::size_t offset = 0; std::size_t size = 0; + void *staging_address = 0; std::function synchronize; std::function transfer; }; @@ -42,6 +44,7 @@ private: std::size_t default_buffer_size = 16*1048576; std::vector buffers; std::vector transfers; + std::vector async_transfers; std::map next_orders; public: @@ -50,8 +53,16 @@ public: 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: + 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); @@ -63,7 +74,7 @@ void *TransferQueue::prepare_transfer(const void *object, bool ordered, std::siz PendingTransfer &pt = prepare_transfer(object, ordered, size); pt.synchronize = std::forward(synchronize); pt.transfer = std::forward(transfer); - return (pt.buffer_index<0 ? 0 : static_cast(buffers[pt.buffer_index].mapped_address)+pt.offset); + return pt.staging_address; } } // namespace GL