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