xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_feedback.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #ifndef VN_FEEDBACK_H
7*61046927SAndroid Build Coastguard Worker #define VN_FEEDBACK_H
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "vn_common.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker struct vn_feedback_pool {
12*61046927SAndroid Build Coastguard Worker    /* single lock for simplicity though free_slots can use another */
13*61046927SAndroid Build Coastguard Worker    simple_mtx_t mutex;
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker    struct vn_device *dev;
16*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc;
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker    /* size in bytes of the feedback buffer */
19*61046927SAndroid Build Coastguard Worker    uint32_t size;
20*61046927SAndroid Build Coastguard Worker    /* size in bytes used of the active feedback buffer */
21*61046927SAndroid Build Coastguard Worker    uint32_t used;
22*61046927SAndroid Build Coastguard Worker    /* alignment in bytes for slot suballocation from the feedback buffer */
23*61046927SAndroid Build Coastguard Worker    uint32_t alignment;
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker    /* first entry is the active feedback buffer */
26*61046927SAndroid Build Coastguard Worker    struct list_head fb_bufs;
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    /* cache for returned feedback slots */
29*61046927SAndroid Build Coastguard Worker    struct list_head free_slots;
30*61046927SAndroid Build Coastguard Worker };
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker enum vn_feedback_type {
33*61046927SAndroid Build Coastguard Worker    VN_FEEDBACK_TYPE_FENCE = 0x1,
34*61046927SAndroid Build Coastguard Worker    VN_FEEDBACK_TYPE_SEMAPHORE = 0x2,
35*61046927SAndroid Build Coastguard Worker    VN_FEEDBACK_TYPE_EVENT = 0x4,
36*61046927SAndroid Build Coastguard Worker    VN_FEEDBACK_TYPE_QUERY = 0x8,
37*61046927SAndroid Build Coastguard Worker };
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot {
40*61046927SAndroid Build Coastguard Worker    enum vn_feedback_type type;
41*61046927SAndroid Build Coastguard Worker    uint32_t offset;
42*61046927SAndroid Build Coastguard Worker    VkBuffer buf_handle;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    union {
45*61046927SAndroid Build Coastguard Worker       void *data;
46*61046927SAndroid Build Coastguard Worker       VkResult *status;
47*61046927SAndroid Build Coastguard Worker       uint64_t *counter;
48*61046927SAndroid Build Coastguard Worker    };
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    struct list_head head;
51*61046927SAndroid Build Coastguard Worker };
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker struct vn_feedback_cmd_pool {
54*61046927SAndroid Build Coastguard Worker    simple_mtx_t mutex;
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    VkCommandPool pool_handle;
57*61046927SAndroid Build Coastguard Worker    struct list_head free_qfb_cmds;
58*61046927SAndroid Build Coastguard Worker };
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker /* coherent buffer with bound and mapped memory */
61*61046927SAndroid Build Coastguard Worker struct vn_feedback_buffer {
62*61046927SAndroid Build Coastguard Worker    VkBuffer buf_handle;
63*61046927SAndroid Build Coastguard Worker    VkDeviceMemory mem_handle;
64*61046927SAndroid Build Coastguard Worker    void *data;
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker    struct list_head head;
67*61046927SAndroid Build Coastguard Worker };
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker struct vn_semaphore_feedback_cmd {
70*61046927SAndroid Build Coastguard Worker    struct vn_feedback_slot *src_slot;
71*61046927SAndroid Build Coastguard Worker    VkCommandBuffer *cmd_handles;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    struct list_head head;
74*61046927SAndroid Build Coastguard Worker };
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker struct vn_query_feedback_cmd {
77*61046927SAndroid Build Coastguard Worker    struct vn_feedback_cmd_pool *fb_cmd_pool;
78*61046927SAndroid Build Coastguard Worker    VkCommandBuffer cmd_handle;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    struct list_head head;
81*61046927SAndroid Build Coastguard Worker };
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker VkResult
84*61046927SAndroid Build Coastguard Worker vn_feedback_pool_init(struct vn_device *dev,
85*61046927SAndroid Build Coastguard Worker                       struct vn_feedback_pool *pool,
86*61046927SAndroid Build Coastguard Worker                       uint32_t size,
87*61046927SAndroid Build Coastguard Worker                       const VkAllocationCallbacks *alloc);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker void
90*61046927SAndroid Build Coastguard Worker vn_feedback_pool_fini(struct vn_feedback_pool *pool);
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker struct vn_feedback_slot *
93*61046927SAndroid Build Coastguard Worker vn_feedback_pool_alloc(struct vn_feedback_pool *pool,
94*61046927SAndroid Build Coastguard Worker                        enum vn_feedback_type type);
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker void
97*61046927SAndroid Build Coastguard Worker vn_feedback_pool_free(struct vn_feedback_pool *pool,
98*61046927SAndroid Build Coastguard Worker                       struct vn_feedback_slot *slot);
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_feedback_get_status(struct vn_feedback_slot * slot)101*61046927SAndroid Build Coastguard Worker vn_feedback_get_status(struct vn_feedback_slot *slot)
102*61046927SAndroid Build Coastguard Worker {
103*61046927SAndroid Build Coastguard Worker    return *slot->status;
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker static inline void
vn_feedback_reset_status(struct vn_feedback_slot * slot)107*61046927SAndroid Build Coastguard Worker vn_feedback_reset_status(struct vn_feedback_slot *slot)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker    assert(slot->type == VN_FEEDBACK_TYPE_FENCE ||
110*61046927SAndroid Build Coastguard Worker           slot->type == VN_FEEDBACK_TYPE_EVENT);
111*61046927SAndroid Build Coastguard Worker    *slot->status =
112*61046927SAndroid Build Coastguard Worker       slot->type == VN_FEEDBACK_TYPE_FENCE ? VK_NOT_READY : VK_EVENT_RESET;
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker static inline void
vn_feedback_set_status(struct vn_feedback_slot * slot,VkResult status)116*61046927SAndroid Build Coastguard Worker vn_feedback_set_status(struct vn_feedback_slot *slot, VkResult status)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker    assert(slot->type == VN_FEEDBACK_TYPE_FENCE ||
119*61046927SAndroid Build Coastguard Worker           slot->type == VN_FEEDBACK_TYPE_EVENT);
120*61046927SAndroid Build Coastguard Worker    *slot->status = status;
121*61046927SAndroid Build Coastguard Worker }
122*61046927SAndroid Build Coastguard Worker 
123*61046927SAndroid Build Coastguard Worker static inline uint64_t
vn_feedback_get_counter(struct vn_feedback_slot * slot)124*61046927SAndroid Build Coastguard Worker vn_feedback_get_counter(struct vn_feedback_slot *slot)
125*61046927SAndroid Build Coastguard Worker {
126*61046927SAndroid Build Coastguard Worker    assert(slot->type == VN_FEEDBACK_TYPE_SEMAPHORE);
127*61046927SAndroid Build Coastguard Worker    return *slot->counter;
128*61046927SAndroid Build Coastguard Worker }
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker static inline void
vn_feedback_set_counter(struct vn_feedback_slot * slot,uint64_t counter)131*61046927SAndroid Build Coastguard Worker vn_feedback_set_counter(struct vn_feedback_slot *slot, uint64_t counter)
132*61046927SAndroid Build Coastguard Worker {
133*61046927SAndroid Build Coastguard Worker    assert(slot->type == VN_FEEDBACK_TYPE_SEMAPHORE);
134*61046927SAndroid Build Coastguard Worker    *slot->counter = counter;
135*61046927SAndroid Build Coastguard Worker }
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker VkResult
138*61046927SAndroid Build Coastguard Worker vn_feedback_buffer_create(struct vn_device *dev,
139*61046927SAndroid Build Coastguard Worker                           uint32_t size,
140*61046927SAndroid Build Coastguard Worker                           const VkAllocationCallbacks *alloc,
141*61046927SAndroid Build Coastguard Worker                           struct vn_feedback_buffer **out_fb_buf);
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker void
144*61046927SAndroid Build Coastguard Worker vn_feedback_buffer_destroy(struct vn_device *dev,
145*61046927SAndroid Build Coastguard Worker                            struct vn_feedback_buffer *fb_buf,
146*61046927SAndroid Build Coastguard Worker                            const VkAllocationCallbacks *alloc);
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker void
149*61046927SAndroid Build Coastguard Worker vn_event_feedback_cmd_record(VkCommandBuffer cmd_handle,
150*61046927SAndroid Build Coastguard Worker                              VkEvent ev_handle,
151*61046927SAndroid Build Coastguard Worker                              VkPipelineStageFlags2 src_stage_mask,
152*61046927SAndroid Build Coastguard Worker                              VkResult status,
153*61046927SAndroid Build Coastguard Worker                              bool sync2);
154*61046927SAndroid Build Coastguard Worker 
155*61046927SAndroid Build Coastguard Worker struct vn_semaphore_feedback_cmd *
156*61046927SAndroid Build Coastguard Worker vn_semaphore_feedback_cmd_alloc(struct vn_device *dev,
157*61046927SAndroid Build Coastguard Worker                                 struct vn_feedback_slot *dst_slot);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker void
160*61046927SAndroid Build Coastguard Worker vn_semaphore_feedback_cmd_free(struct vn_device *dev,
161*61046927SAndroid Build Coastguard Worker                                struct vn_semaphore_feedback_cmd *sfb_cmd);
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker VkResult
164*61046927SAndroid Build Coastguard Worker vn_query_feedback_cmd_alloc(VkDevice dev_handle,
165*61046927SAndroid Build Coastguard Worker                             struct vn_feedback_cmd_pool *fb_cmd_pool,
166*61046927SAndroid Build Coastguard Worker                             struct list_head *resolved_query_records,
167*61046927SAndroid Build Coastguard Worker                             struct vn_query_feedback_cmd **out_qfb_cmd);
168*61046927SAndroid Build Coastguard Worker 
169*61046927SAndroid Build Coastguard Worker void
170*61046927SAndroid Build Coastguard Worker vn_query_feedback_cmd_free(struct vn_query_feedback_cmd *qfb_cmd);
171*61046927SAndroid Build Coastguard Worker 
172*61046927SAndroid Build Coastguard Worker VkResult
173*61046927SAndroid Build Coastguard Worker vn_feedback_cmd_alloc(VkDevice dev_handle,
174*61046927SAndroid Build Coastguard Worker                       struct vn_feedback_cmd_pool *fb_cmd_pool,
175*61046927SAndroid Build Coastguard Worker                       struct vn_feedback_slot *dst_slot,
176*61046927SAndroid Build Coastguard Worker                       struct vn_feedback_slot *src_slot,
177*61046927SAndroid Build Coastguard Worker                       VkCommandBuffer *out_cmd_handle);
178*61046927SAndroid Build Coastguard Worker void
179*61046927SAndroid Build Coastguard Worker vn_feedback_cmd_free(VkDevice dev_handle,
180*61046927SAndroid Build Coastguard Worker                      struct vn_feedback_cmd_pool *fb_cmd_pool,
181*61046927SAndroid Build Coastguard Worker                      VkCommandBuffer cmd_handle);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker VkResult
184*61046927SAndroid Build Coastguard Worker vn_feedback_cmd_pools_init(struct vn_device *dev);
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker void
187*61046927SAndroid Build Coastguard Worker vn_feedback_cmd_pools_fini(struct vn_device *dev);
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker #endif /* VN_FEEDBACK_H */
190