]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/transferqueue.h
Use const void * for the object pointers in TransferQueue
[libs/gl.git] / source / backends / vulkan / transferqueue.h
index a25519c8a121b417b0fe1dc1a60692bc7f7f90ff..58b1bc2d6fa5f4743964c72d1e15e01305a97af0 100644 (file)
@@ -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<void()> synchronize;
@@ -41,27 +42,28 @@ private:
        std::size_t default_buffer_size = 16*1048576;
        std::vector<StagingBuffer> buffers;
        std::vector<PendingTransfer> transfers;
+       std::map<const void *, unsigned> next_orders;
 
 public:
        TransferQueue(Device &);
 
        template<typename S, typename T>
-       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<typename S, typename T>
-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<S>(synchronize);
        pt.transfer = std::forward<T>(transfer);
-       return static_cast<char *>(buffers[pt.buffer_index].mapped_address)+pt.offset;
+       return (pt.buffer_index<0 ? 0 : static_cast<char *>(buffers[pt.buffer_index].mapped_address)+pt.offset);
 }
 
 } // namespace GL