]> git.tdb.fi Git - libs/gl.git/blobdiff - source/backends/vulkan/transferqueue.h
Use another callback for pre-transfer synchronization
[libs/gl.git] / source / backends / vulkan / transferqueue.h
index 419760bdf4d6b709bd4b28a393428f8da45f9383..a25519c8a121b417b0fe1dc1a60692bc7f7f90ff 100644 (file)
@@ -28,14 +28,13 @@ private:
                ~StagingBuffer();
        };
 
-       using TransferCallback = void(VkCommandBuffer, VkBuffer, std::size_t);
-
        struct PendingTransfer
        {
                unsigned buffer_index = 0;
                std::size_t offset = 0;
                std::size_t size = 0;
-               std::function<TransferCallback> callback;
+               std::function<void()> synchronize;
+               std::function<void(VkCommandBuffer, VkBuffer, std::size_t)> transfer;
        };
 
        Device &device;
@@ -46,8 +45,8 @@ private:
 public:
        TransferQueue(Device &);
 
-       template<typename T>
-       void *prepare_transfer(std::size_t, T &&);
+       template<typename S, typename T>
+       void *prepare_transfer(std::size_t, S &&, T &&);
 
 private:
        PendingTransfer &prepare_transfer(std::size_t);
@@ -56,11 +55,12 @@ public:
        void dispatch_transfers(VkCommandBuffer);
 };
 
-template<typename T>
-void *TransferQueue::prepare_transfer(std::size_t size, T &&callback)
+template<typename S, typename T>
+void *TransferQueue::prepare_transfer(std::size_t size, S &&synchronize, T &&transfer)
 {
        PendingTransfer &pt = prepare_transfer(size);
-       pt.callback = std::forward<T>(callback);
+       pt.synchronize = std::forward<S>(synchronize);
+       pt.transfer = std::forward<T>(transfer);
        return static_cast<char *>(buffers[pt.buffer_index].mapped_address)+pt.offset;
 }