]> git.tdb.fi Git - libs/gl.git/blob - source/backends/vulkan/transferqueue.h
Check the flat qualifier from the correct member
[libs/gl.git] / source / backends / vulkan / transferqueue.h
1 #ifndef MSP_GL_VULKAN_TRANSFERQUEUE_H_
2 #define MSP_GL_VULKAN_TRANSFERQUEUE_H_
3
4 #include <functional>
5 #include <vector>
6 #include "handles.h"
7
8 namespace Msp {
9 namespace GL {
10
11 class Buffer;
12 class Device;
13 class VulkanCommandRecorder;
14
15 class TransferQueue
16 {
17 private:
18         struct StagingBuffer
19         {
20                 Device &device;
21                 VkBuffer buffer = 0;
22                 unsigned memory_id = 0;
23                 std::size_t size = 0;
24                 std::size_t used = 0;
25                 void *mapped_address = 0;
26                 unsigned async_count = 0;
27                 unsigned last_frame = 0;
28
29                 StagingBuffer(Device &, std::size_t);
30                 StagingBuffer(StagingBuffer &&);
31                 ~StagingBuffer();
32         };
33
34         struct PendingTransfer
35         {
36                 const void *object = 0;
37                 unsigned order = 0;
38                 int buffer_index = -1;
39                 std::size_t offset = 0;
40                 std::size_t size = 0;
41                 void *staging_address = 0;
42                 std::function<void()> synchronize;
43                 std::function<void(const VulkanCommandRecorder &, VkBuffer, std::size_t)> transfer;
44         };
45
46         Device &device;
47         std::size_t default_buffer_size = 16*1048576;
48         std::vector<StagingBuffer> buffers;
49         std::vector<PendingTransfer> transfers;
50         std::vector<PendingTransfer> async_transfers;
51         std::map<const void *, unsigned> next_orders;
52         unsigned current_frame = 0;
53
54 public:
55         TransferQueue(Device &);
56
57         template<typename S, typename T>
58         void *prepare_transfer(const void *, bool, std::size_t, S &&, T &&);
59
60         template<typename S, typename T>
61         void prepare_transfer(const void *o, bool r, S &&s, T &&t)
62         { prepare_transfer(o, r, 0, std::forward<S>(s), std::forward<T>(t)); }
63
64         void finalize_transfer(void *);
65
66 private:
67         void allocate_staging(PendingTransfer &, std::size_t);
68         PendingTransfer &prepare_transfer(const void *, bool, std::size_t);
69         PendingTransfer &insert_transfer(PendingTransfer &&);
70
71 public:
72         void dispatch_transfers(const VulkanCommandRecorder &);
73 };
74
75 template<typename S, typename T>
76 void *TransferQueue::prepare_transfer(const void *object, bool ordered, std::size_t size, S &&synchronize, T &&transfer)
77 {
78         PendingTransfer &pt = prepare_transfer(object, ordered, size);
79         pt.synchronize = std::forward<S>(synchronize);
80         pt.transfer = std::forward<T>(transfer);
81         return pt.staging_address;
82 }
83
84 } // namespace GL
85 } // namespace Msp
86
87 #endif