xref: /aosp_15_r20/external/mesa3d/src/virtio/vulkan/vn_common.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2019 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * based in part on anv and radv which are:
6*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
7*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
8*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
9*61046927SAndroid Build Coastguard Worker  */
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #ifndef VN_COMMON_H
12*61046927SAndroid Build Coastguard Worker #define VN_COMMON_H
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #include <assert.h>
15*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
16*61046927SAndroid Build Coastguard Worker #include <limits.h>
17*61046927SAndroid Build Coastguard Worker #include <stdatomic.h>
18*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
19*61046927SAndroid Build Coastguard Worker #include <stddef.h>
20*61046927SAndroid Build Coastguard Worker #include <stdint.h>
21*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
22*61046927SAndroid Build Coastguard Worker #include <string.h>
23*61046927SAndroid Build Coastguard Worker #include <sys/syscall.h>
24*61046927SAndroid Build Coastguard Worker #include <vulkan/vulkan.h>
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #include "c11/threads.h"
27*61046927SAndroid Build Coastguard Worker #include "drm-uapi/drm_fourcc.h"
28*61046927SAndroid Build Coastguard Worker #include "util/bitscan.h"
29*61046927SAndroid Build Coastguard Worker #include "util/bitset.h"
30*61046927SAndroid Build Coastguard Worker #include "util/compiler.h"
31*61046927SAndroid Build Coastguard Worker #include "util/detect_os.h"
32*61046927SAndroid Build Coastguard Worker #include "util/libsync.h"
33*61046927SAndroid Build Coastguard Worker #include "util/list.h"
34*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
35*61046927SAndroid Build Coastguard Worker #include "util/os_time.h"
36*61046927SAndroid Build Coastguard Worker #include "util/perf/cpu_trace.h"
37*61046927SAndroid Build Coastguard Worker #include "util/simple_mtx.h"
38*61046927SAndroid Build Coastguard Worker #include "util/u_atomic.h"
39*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
40*61046927SAndroid Build Coastguard Worker #include "util/xmlconfig.h"
41*61046927SAndroid Build Coastguard Worker #include "vk_alloc.h"
42*61046927SAndroid Build Coastguard Worker #include "vk_debug_report.h"
43*61046927SAndroid Build Coastguard Worker #include "vk_device.h"
44*61046927SAndroid Build Coastguard Worker #include "vk_device_memory.h"
45*61046927SAndroid Build Coastguard Worker #include "vk_image.h"
46*61046927SAndroid Build Coastguard Worker #include "vk_instance.h"
47*61046927SAndroid Build Coastguard Worker #include "vk_object.h"
48*61046927SAndroid Build Coastguard Worker #include "vk_physical_device.h"
49*61046927SAndroid Build Coastguard Worker #include "vk_queue.h"
50*61046927SAndroid Build Coastguard Worker #include "vk_util.h"
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker #include "vn_entrypoints.h"
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker #define VN_DEFAULT_ALIGN             8
55*61046927SAndroid Build Coastguard Worker #define VN_WATCHDOG_REPORT_PERIOD_US 3000000
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker #define VN_DEBUG(category) (unlikely(vn_env.debug & VN_DEBUG_##category))
58*61046927SAndroid Build Coastguard Worker #define VN_PERF(category)  (unlikely(vn_env.perf & VN_PERF_##category))
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker #define vn_error(instance, error)                                            \
61*61046927SAndroid Build Coastguard Worker    (VN_DEBUG(RESULT) ? vn_log_result((instance), (error), __func__) : (error))
62*61046927SAndroid Build Coastguard Worker #define vn_result(instance, result)                                          \
63*61046927SAndroid Build Coastguard Worker    ((result) >= VK_SUCCESS ? (result) : vn_error((instance), (result)))
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker #define VN_TRACE_SCOPE(name) MESA_TRACE_SCOPE(name)
66*61046927SAndroid Build Coastguard Worker #define VN_TRACE_FUNC()      MESA_TRACE_SCOPE(__func__)
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker struct vn_instance;
69*61046927SAndroid Build Coastguard Worker struct vn_physical_device;
70*61046927SAndroid Build Coastguard Worker struct vn_device;
71*61046927SAndroid Build Coastguard Worker struct vn_queue;
72*61046927SAndroid Build Coastguard Worker struct vn_fence;
73*61046927SAndroid Build Coastguard Worker struct vn_semaphore;
74*61046927SAndroid Build Coastguard Worker struct vn_device_memory;
75*61046927SAndroid Build Coastguard Worker struct vn_buffer;
76*61046927SAndroid Build Coastguard Worker struct vn_buffer_view;
77*61046927SAndroid Build Coastguard Worker struct vn_image;
78*61046927SAndroid Build Coastguard Worker struct vn_image_view;
79*61046927SAndroid Build Coastguard Worker struct vn_sampler;
80*61046927SAndroid Build Coastguard Worker struct vn_sampler_ycbcr_conversion;
81*61046927SAndroid Build Coastguard Worker struct vn_descriptor_set_layout;
82*61046927SAndroid Build Coastguard Worker struct vn_descriptor_pool;
83*61046927SAndroid Build Coastguard Worker struct vn_descriptor_set;
84*61046927SAndroid Build Coastguard Worker struct vn_descriptor_update_template;
85*61046927SAndroid Build Coastguard Worker struct vn_render_pass;
86*61046927SAndroid Build Coastguard Worker struct vn_framebuffer;
87*61046927SAndroid Build Coastguard Worker struct vn_event;
88*61046927SAndroid Build Coastguard Worker struct vn_query_pool;
89*61046927SAndroid Build Coastguard Worker struct vn_shader_module;
90*61046927SAndroid Build Coastguard Worker struct vn_pipeline_layout;
91*61046927SAndroid Build Coastguard Worker struct vn_pipeline_cache;
92*61046927SAndroid Build Coastguard Worker struct vn_pipeline;
93*61046927SAndroid Build Coastguard Worker struct vn_command_pool;
94*61046927SAndroid Build Coastguard Worker struct vn_command_buffer;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker struct vn_cs_encoder;
97*61046927SAndroid Build Coastguard Worker struct vn_cs_decoder;
98*61046927SAndroid Build Coastguard Worker struct vn_ring;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker struct vn_renderer;
101*61046927SAndroid Build Coastguard Worker struct vn_renderer_shmem;
102*61046927SAndroid Build Coastguard Worker struct vn_renderer_bo;
103*61046927SAndroid Build Coastguard Worker struct vn_renderer_sync;
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker enum vn_debug {
106*61046927SAndroid Build Coastguard Worker    VN_DEBUG_INIT = 1ull << 0,
107*61046927SAndroid Build Coastguard Worker    VN_DEBUG_RESULT = 1ull << 1,
108*61046927SAndroid Build Coastguard Worker    VN_DEBUG_VTEST = 1ull << 2,
109*61046927SAndroid Build Coastguard Worker    VN_DEBUG_WSI = 1ull << 3,
110*61046927SAndroid Build Coastguard Worker    VN_DEBUG_NO_ABORT = 1ull << 4,
111*61046927SAndroid Build Coastguard Worker    VN_DEBUG_LOG_CTX_INFO = 1ull << 5,
112*61046927SAndroid Build Coastguard Worker    VN_DEBUG_CACHE = 1ull << 6,
113*61046927SAndroid Build Coastguard Worker    VN_DEBUG_NO_SPARSE = 1ull << 7,
114*61046927SAndroid Build Coastguard Worker    VN_DEBUG_NO_GPL = 1ull << 8,
115*61046927SAndroid Build Coastguard Worker };
116*61046927SAndroid Build Coastguard Worker 
117*61046927SAndroid Build Coastguard Worker enum vn_perf {
118*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_ASYNC_SET_ALLOC = 1ull << 0,
119*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_ASYNC_BUFFER_CREATE = 1ull << 1,
120*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_ASYNC_QUEUE_SUBMIT = 1ull << 2,
121*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_EVENT_FEEDBACK = 1ull << 3,
122*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_FENCE_FEEDBACK = 1ull << 4,
123*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_CMD_BATCHING = 1ull << 6,
124*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_SEMAPHORE_FEEDBACK = 1ull << 7,
125*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_QUERY_FEEDBACK = 1ull << 8,
126*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_ASYNC_MEM_ALLOC = 1ull << 9,
127*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_TILED_WSI_IMAGE = 1ull << 10,
128*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_MULTI_RING = 1ull << 11,
129*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_ASYNC_IMAGE_CREATE = 1ull << 12,
130*61046927SAndroid Build Coastguard Worker    VN_PERF_NO_ASYNC_IMAGE_FORMAT = 1ull << 13,
131*61046927SAndroid Build Coastguard Worker };
132*61046927SAndroid Build Coastguard Worker 
133*61046927SAndroid Build Coastguard Worker typedef uint64_t vn_object_id;
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker /* base class of vn_instance */
136*61046927SAndroid Build Coastguard Worker struct vn_instance_base {
137*61046927SAndroid Build Coastguard Worker    struct vk_instance base;
138*61046927SAndroid Build Coastguard Worker    vn_object_id id;
139*61046927SAndroid Build Coastguard Worker };
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker /* base class of vn_physical_device */
142*61046927SAndroid Build Coastguard Worker struct vn_physical_device_base {
143*61046927SAndroid Build Coastguard Worker    struct vk_physical_device base;
144*61046927SAndroid Build Coastguard Worker    vn_object_id id;
145*61046927SAndroid Build Coastguard Worker };
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker /* base class of vn_device */
148*61046927SAndroid Build Coastguard Worker struct vn_device_base {
149*61046927SAndroid Build Coastguard Worker    struct vk_device base;
150*61046927SAndroid Build Coastguard Worker    vn_object_id id;
151*61046927SAndroid Build Coastguard Worker };
152*61046927SAndroid Build Coastguard Worker 
153*61046927SAndroid Build Coastguard Worker /* base class of vn_queue */
154*61046927SAndroid Build Coastguard Worker struct vn_queue_base {
155*61046927SAndroid Build Coastguard Worker    struct vk_queue base;
156*61046927SAndroid Build Coastguard Worker    vn_object_id id;
157*61046927SAndroid Build Coastguard Worker };
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker /* base class of vn_device_memory */
160*61046927SAndroid Build Coastguard Worker struct vn_device_memory_base {
161*61046927SAndroid Build Coastguard Worker    struct vk_device_memory base;
162*61046927SAndroid Build Coastguard Worker    vn_object_id id;
163*61046927SAndroid Build Coastguard Worker };
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker /* base class of vn_image */
166*61046927SAndroid Build Coastguard Worker struct vn_image_base {
167*61046927SAndroid Build Coastguard Worker    struct vk_image base;
168*61046927SAndroid Build Coastguard Worker    vn_object_id id;
169*61046927SAndroid Build Coastguard Worker };
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker /* base class of other driver objects */
172*61046927SAndroid Build Coastguard Worker struct vn_object_base {
173*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
174*61046927SAndroid Build Coastguard Worker    vn_object_id id;
175*61046927SAndroid Build Coastguard Worker };
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker struct vn_refcount {
178*61046927SAndroid Build Coastguard Worker    atomic_int count;
179*61046927SAndroid Build Coastguard Worker };
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker struct vn_env {
182*61046927SAndroid Build Coastguard Worker    uint64_t debug;
183*61046927SAndroid Build Coastguard Worker    uint64_t perf;
184*61046927SAndroid Build Coastguard Worker };
185*61046927SAndroid Build Coastguard Worker extern struct vn_env vn_env;
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker /* Only one "waiting" thread may fulfill the "watchdog" role at a time. Every
188*61046927SAndroid Build Coastguard Worker  * VN_WATCHDOG_REPORT_PERIOD_US or longer, the watchdog tests the ring's ALIVE
189*61046927SAndroid Build Coastguard Worker  * status, updates the "alive" atomic, and resets the ALIVE status for the
190*61046927SAndroid Build Coastguard Worker  * next cycle. Other waiting threads just check the "alive" atomic. The
191*61046927SAndroid Build Coastguard Worker  * watchdog role may be released and acquired by another waiting thread
192*61046927SAndroid Build Coastguard Worker  * dynamically.
193*61046927SAndroid Build Coastguard Worker  *
194*61046927SAndroid Build Coastguard Worker  * Examples of "waiting" are to wait for:
195*61046927SAndroid Build Coastguard Worker  * - ring to reach a seqno
196*61046927SAndroid Build Coastguard Worker  * - ring space to be released
197*61046927SAndroid Build Coastguard Worker  * - sync primitives to signal
198*61046927SAndroid Build Coastguard Worker  * - query result being available
199*61046927SAndroid Build Coastguard Worker  */
200*61046927SAndroid Build Coastguard Worker struct vn_watchdog {
201*61046927SAndroid Build Coastguard Worker    mtx_t mutex;
202*61046927SAndroid Build Coastguard Worker    atomic_int tid;
203*61046927SAndroid Build Coastguard Worker    atomic_bool alive;
204*61046927SAndroid Build Coastguard Worker };
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker enum vn_relax_reason {
207*61046927SAndroid Build Coastguard Worker    VN_RELAX_REASON_RING_SEQNO,
208*61046927SAndroid Build Coastguard Worker    VN_RELAX_REASON_TLS_RING_SEQNO,
209*61046927SAndroid Build Coastguard Worker    VN_RELAX_REASON_RING_SPACE,
210*61046927SAndroid Build Coastguard Worker    VN_RELAX_REASON_FENCE,
211*61046927SAndroid Build Coastguard Worker    VN_RELAX_REASON_SEMAPHORE,
212*61046927SAndroid Build Coastguard Worker    VN_RELAX_REASON_QUERY,
213*61046927SAndroid Build Coastguard Worker };
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker /* vn_relax_profile defines the driver side polling behavior
216*61046927SAndroid Build Coastguard Worker  *
217*61046927SAndroid Build Coastguard Worker  * - base_sleep_us:
218*61046927SAndroid Build Coastguard Worker  *   - the minimum polling interval after initial busy waits
219*61046927SAndroid Build Coastguard Worker  *
220*61046927SAndroid Build Coastguard Worker  * - busy_wait_order:
221*61046927SAndroid Build Coastguard Worker  *   - initial 2 ^ busy_wait_order times thrd_yield()
222*61046927SAndroid Build Coastguard Worker  *
223*61046927SAndroid Build Coastguard Worker  * - warn_order:
224*61046927SAndroid Build Coastguard Worker  *   - number of polls at order N:
225*61046927SAndroid Build Coastguard Worker  *     - fn_cnt(N) = 2 ^ N
226*61046927SAndroid Build Coastguard Worker  *   - interval of poll at order N:
227*61046927SAndroid Build Coastguard Worker  *     - fn_step(N) = base_sleep_us * (2 ^ (N - busy_wait_order))
228*61046927SAndroid Build Coastguard Worker  *   - warn occasionally if we have slept at least:
229*61046927SAndroid Build Coastguard Worker  *     - for (i = busy_wait_order; i < warn_order; i++)
230*61046927SAndroid Build Coastguard Worker  *          total_sleep += fn_cnt(i) * fn_step(i)
231*61046927SAndroid Build Coastguard Worker  *
232*61046927SAndroid Build Coastguard Worker  * - abort_order:
233*61046927SAndroid Build Coastguard Worker  *   - similar to warn_order, but would abort() instead
234*61046927SAndroid Build Coastguard Worker  */
235*61046927SAndroid Build Coastguard Worker struct vn_relax_profile {
236*61046927SAndroid Build Coastguard Worker    uint32_t base_sleep_us;
237*61046927SAndroid Build Coastguard Worker    uint32_t busy_wait_order;
238*61046927SAndroid Build Coastguard Worker    uint32_t warn_order;
239*61046927SAndroid Build Coastguard Worker    uint32_t abort_order;
240*61046927SAndroid Build Coastguard Worker };
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker struct vn_relax_state {
243*61046927SAndroid Build Coastguard Worker    struct vn_instance *instance;
244*61046927SAndroid Build Coastguard Worker    uint32_t iter;
245*61046927SAndroid Build Coastguard Worker    const struct vn_relax_profile profile;
246*61046927SAndroid Build Coastguard Worker    const char *reason_str;
247*61046927SAndroid Build Coastguard Worker };
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker /* TLS ring
250*61046927SAndroid Build Coastguard Worker  * - co-owned by TLS and VkInstance
251*61046927SAndroid Build Coastguard Worker  * - initialized in TLS upon requested
252*61046927SAndroid Build Coastguard Worker  * - teardown happens upon thread exit or instance destroy
253*61046927SAndroid Build Coastguard Worker  * - teardown is split into 2 stages:
254*61046927SAndroid Build Coastguard Worker  *   1. one owner locks and destroys the ring and mark destroyed
255*61046927SAndroid Build Coastguard Worker  *   2. the other owner locks and frees up the tls ring storage
256*61046927SAndroid Build Coastguard Worker  */
257*61046927SAndroid Build Coastguard Worker struct vn_tls_ring {
258*61046927SAndroid Build Coastguard Worker    mtx_t mutex;
259*61046927SAndroid Build Coastguard Worker    struct vn_ring *ring;
260*61046927SAndroid Build Coastguard Worker    struct vn_instance *instance;
261*61046927SAndroid Build Coastguard Worker    struct list_head tls_head;
262*61046927SAndroid Build Coastguard Worker    struct list_head vk_head;
263*61046927SAndroid Build Coastguard Worker };
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker struct vn_tls {
266*61046927SAndroid Build Coastguard Worker    /* Track the threads on which swapchain and command pool creations occur.
267*61046927SAndroid Build Coastguard Worker     * Pipeline create on those threads are forced async via the primary ring.
268*61046927SAndroid Build Coastguard Worker     */
269*61046927SAndroid Build Coastguard Worker    bool async_pipeline_create;
270*61046927SAndroid Build Coastguard Worker    /* Track TLS rings owned across instances. */
271*61046927SAndroid Build Coastguard Worker    struct list_head tls_rings;
272*61046927SAndroid Build Coastguard Worker };
273*61046927SAndroid Build Coastguard Worker 
274*61046927SAndroid Build Coastguard Worker /* A cached storage for object internal usages with below constraints:
275*61046927SAndroid Build Coastguard Worker  * - It belongs to the object and shares the lifetime.
276*61046927SAndroid Build Coastguard Worker  * - The storage reuse is protected by external synchronization.
277*61046927SAndroid Build Coastguard Worker  * - The returned storage is not zero-initialized.
278*61046927SAndroid Build Coastguard Worker  * - It never shrinks unless being purged via fini.
279*61046927SAndroid Build Coastguard Worker  *
280*61046927SAndroid Build Coastguard Worker  * The current users are:
281*61046927SAndroid Build Coastguard Worker  * - VkCommandPool
282*61046927SAndroid Build Coastguard Worker  * - VkQueue
283*61046927SAndroid Build Coastguard Worker  */
284*61046927SAndroid Build Coastguard Worker struct vn_cached_storage {
285*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc;
286*61046927SAndroid Build Coastguard Worker    size_t size;
287*61046927SAndroid Build Coastguard Worker    void *data;
288*61046927SAndroid Build Coastguard Worker };
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker void
291*61046927SAndroid Build Coastguard Worker vn_env_init(void);
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker void
294*61046927SAndroid Build Coastguard Worker vn_trace_init(void);
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker void
297*61046927SAndroid Build Coastguard Worker vn_log(struct vn_instance *instance, const char *format, ...)
298*61046927SAndroid Build Coastguard Worker    PRINTFLIKE(2, 3);
299*61046927SAndroid Build Coastguard Worker 
300*61046927SAndroid Build Coastguard Worker VkResult
301*61046927SAndroid Build Coastguard Worker vn_log_result(struct vn_instance *instance,
302*61046927SAndroid Build Coastguard Worker               VkResult result,
303*61046927SAndroid Build Coastguard Worker               const char *where);
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker #define VN_REFCOUNT_INIT(val)                                                \
306*61046927SAndroid Build Coastguard Worker    (struct vn_refcount)                                                      \
307*61046927SAndroid Build Coastguard Worker    {                                                                         \
308*61046927SAndroid Build Coastguard Worker       .count = (val),                                                        \
309*61046927SAndroid Build Coastguard Worker    }
310*61046927SAndroid Build Coastguard Worker 
311*61046927SAndroid Build Coastguard Worker static inline int
vn_refcount_load_relaxed(const struct vn_refcount * ref)312*61046927SAndroid Build Coastguard Worker vn_refcount_load_relaxed(const struct vn_refcount *ref)
313*61046927SAndroid Build Coastguard Worker {
314*61046927SAndroid Build Coastguard Worker    return atomic_load_explicit(&ref->count, memory_order_relaxed);
315*61046927SAndroid Build Coastguard Worker }
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker static inline int
vn_refcount_fetch_add_relaxed(struct vn_refcount * ref,int val)318*61046927SAndroid Build Coastguard Worker vn_refcount_fetch_add_relaxed(struct vn_refcount *ref, int val)
319*61046927SAndroid Build Coastguard Worker {
320*61046927SAndroid Build Coastguard Worker    return atomic_fetch_add_explicit(&ref->count, val, memory_order_relaxed);
321*61046927SAndroid Build Coastguard Worker }
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker static inline int
vn_refcount_fetch_sub_release(struct vn_refcount * ref,int val)324*61046927SAndroid Build Coastguard Worker vn_refcount_fetch_sub_release(struct vn_refcount *ref, int val)
325*61046927SAndroid Build Coastguard Worker {
326*61046927SAndroid Build Coastguard Worker    return atomic_fetch_sub_explicit(&ref->count, val, memory_order_release);
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker 
329*61046927SAndroid Build Coastguard Worker static inline bool
vn_refcount_is_valid(const struct vn_refcount * ref)330*61046927SAndroid Build Coastguard Worker vn_refcount_is_valid(const struct vn_refcount *ref)
331*61046927SAndroid Build Coastguard Worker {
332*61046927SAndroid Build Coastguard Worker    return vn_refcount_load_relaxed(ref) > 0;
333*61046927SAndroid Build Coastguard Worker }
334*61046927SAndroid Build Coastguard Worker 
335*61046927SAndroid Build Coastguard Worker static inline void
vn_refcount_inc(struct vn_refcount * ref)336*61046927SAndroid Build Coastguard Worker vn_refcount_inc(struct vn_refcount *ref)
337*61046927SAndroid Build Coastguard Worker {
338*61046927SAndroid Build Coastguard Worker    /* no ordering imposed */
339*61046927SAndroid Build Coastguard Worker    ASSERTED const int old = vn_refcount_fetch_add_relaxed(ref, 1);
340*61046927SAndroid Build Coastguard Worker    assert(old >= 1);
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker static inline bool
vn_refcount_dec(struct vn_refcount * ref)344*61046927SAndroid Build Coastguard Worker vn_refcount_dec(struct vn_refcount *ref)
345*61046927SAndroid Build Coastguard Worker {
346*61046927SAndroid Build Coastguard Worker    /* prior reads/writes cannot be reordered after this */
347*61046927SAndroid Build Coastguard Worker    const int old = vn_refcount_fetch_sub_release(ref, 1);
348*61046927SAndroid Build Coastguard Worker    assert(old >= 1);
349*61046927SAndroid Build Coastguard Worker 
350*61046927SAndroid Build Coastguard Worker    /* subsequent free cannot be reordered before this */
351*61046927SAndroid Build Coastguard Worker    if (old == 1)
352*61046927SAndroid Build Coastguard Worker       atomic_thread_fence(memory_order_acquire);
353*61046927SAndroid Build Coastguard Worker 
354*61046927SAndroid Build Coastguard Worker    return old == 1;
355*61046927SAndroid Build Coastguard Worker }
356*61046927SAndroid Build Coastguard Worker 
357*61046927SAndroid Build Coastguard Worker extern uint64_t vn_next_obj_id;
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker static inline uint64_t
vn_get_next_obj_id(void)360*61046927SAndroid Build Coastguard Worker vn_get_next_obj_id(void)
361*61046927SAndroid Build Coastguard Worker {
362*61046927SAndroid Build Coastguard Worker    return p_atomic_fetch_add(&vn_next_obj_id, 1);
363*61046927SAndroid Build Coastguard Worker }
364*61046927SAndroid Build Coastguard Worker 
365*61046927SAndroid Build Coastguard Worker uint32_t
366*61046927SAndroid Build Coastguard Worker vn_extension_get_spec_version(const char *name);
367*61046927SAndroid Build Coastguard Worker 
368*61046927SAndroid Build Coastguard Worker static inline void
vn_watchdog_init(struct vn_watchdog * watchdog)369*61046927SAndroid Build Coastguard Worker vn_watchdog_init(struct vn_watchdog *watchdog)
370*61046927SAndroid Build Coastguard Worker {
371*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
372*61046927SAndroid Build Coastguard Worker    /* ensure minimum check period is greater than maximum renderer
373*61046927SAndroid Build Coastguard Worker     * reporting period (with margin of safety to ensure no false
374*61046927SAndroid Build Coastguard Worker     * positives).
375*61046927SAndroid Build Coastguard Worker     *
376*61046927SAndroid Build Coastguard Worker     * first_warn_time is pre-calculated based on parameters in vn_relax
377*61046927SAndroid Build Coastguard Worker     * and must update together.
378*61046927SAndroid Build Coastguard Worker     */
379*61046927SAndroid Build Coastguard Worker    static const uint32_t first_warn_time = 3481600;
380*61046927SAndroid Build Coastguard Worker    static const uint32_t safety_margin = 250000;
381*61046927SAndroid Build Coastguard Worker    assert(first_warn_time - safety_margin >= VN_WATCHDOG_REPORT_PERIOD_US);
382*61046927SAndroid Build Coastguard Worker #endif
383*61046927SAndroid Build Coastguard Worker 
384*61046927SAndroid Build Coastguard Worker    mtx_init(&watchdog->mutex, mtx_plain);
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker    watchdog->tid = 0;
387*61046927SAndroid Build Coastguard Worker 
388*61046927SAndroid Build Coastguard Worker    /* initialized to be alive to avoid vn_watchdog_timout false alarm */
389*61046927SAndroid Build Coastguard Worker    watchdog->alive = true;
390*61046927SAndroid Build Coastguard Worker }
391*61046927SAndroid Build Coastguard Worker 
392*61046927SAndroid Build Coastguard Worker static inline void
vn_watchdog_fini(struct vn_watchdog * watchdog)393*61046927SAndroid Build Coastguard Worker vn_watchdog_fini(struct vn_watchdog *watchdog)
394*61046927SAndroid Build Coastguard Worker {
395*61046927SAndroid Build Coastguard Worker    mtx_destroy(&watchdog->mutex);
396*61046927SAndroid Build Coastguard Worker }
397*61046927SAndroid Build Coastguard Worker 
398*61046927SAndroid Build Coastguard Worker struct vn_relax_state
399*61046927SAndroid Build Coastguard Worker vn_relax_init(struct vn_instance *instance, enum vn_relax_reason reason);
400*61046927SAndroid Build Coastguard Worker 
401*61046927SAndroid Build Coastguard Worker void
402*61046927SAndroid Build Coastguard Worker vn_relax(struct vn_relax_state *state);
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker void
405*61046927SAndroid Build Coastguard Worker vn_relax_fini(struct vn_relax_state *state);
406*61046927SAndroid Build Coastguard Worker 
407*61046927SAndroid Build Coastguard Worker static_assert(sizeof(vn_object_id) >= sizeof(uintptr_t), "");
408*61046927SAndroid Build Coastguard Worker 
409*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_instance_base_init(struct vn_instance_base * instance,const struct vk_instance_extension_table * supported_extensions,const struct vk_instance_dispatch_table * dispatch_table,const VkInstanceCreateInfo * info,const VkAllocationCallbacks * alloc)410*61046927SAndroid Build Coastguard Worker vn_instance_base_init(
411*61046927SAndroid Build Coastguard Worker    struct vn_instance_base *instance,
412*61046927SAndroid Build Coastguard Worker    const struct vk_instance_extension_table *supported_extensions,
413*61046927SAndroid Build Coastguard Worker    const struct vk_instance_dispatch_table *dispatch_table,
414*61046927SAndroid Build Coastguard Worker    const VkInstanceCreateInfo *info,
415*61046927SAndroid Build Coastguard Worker    const VkAllocationCallbacks *alloc)
416*61046927SAndroid Build Coastguard Worker {
417*61046927SAndroid Build Coastguard Worker    VkResult result = vk_instance_init(&instance->base, supported_extensions,
418*61046927SAndroid Build Coastguard Worker                                       dispatch_table, info, alloc);
419*61046927SAndroid Build Coastguard Worker    instance->id = vn_get_next_obj_id();
420*61046927SAndroid Build Coastguard Worker    return result;
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker 
423*61046927SAndroid Build Coastguard Worker static inline void
vn_instance_base_fini(struct vn_instance_base * instance)424*61046927SAndroid Build Coastguard Worker vn_instance_base_fini(struct vn_instance_base *instance)
425*61046927SAndroid Build Coastguard Worker {
426*61046927SAndroid Build Coastguard Worker    vk_instance_finish(&instance->base);
427*61046927SAndroid Build Coastguard Worker }
428*61046927SAndroid Build Coastguard Worker 
429*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_physical_device_base_init(struct vn_physical_device_base * physical_dev,struct vn_instance_base * instance,const struct vk_device_extension_table * supported_extensions,const struct vk_physical_device_dispatch_table * dispatch_table)430*61046927SAndroid Build Coastguard Worker vn_physical_device_base_init(
431*61046927SAndroid Build Coastguard Worker    struct vn_physical_device_base *physical_dev,
432*61046927SAndroid Build Coastguard Worker    struct vn_instance_base *instance,
433*61046927SAndroid Build Coastguard Worker    const struct vk_device_extension_table *supported_extensions,
434*61046927SAndroid Build Coastguard Worker    const struct vk_physical_device_dispatch_table *dispatch_table)
435*61046927SAndroid Build Coastguard Worker {
436*61046927SAndroid Build Coastguard Worker    VkResult result = vk_physical_device_init(
437*61046927SAndroid Build Coastguard Worker       &physical_dev->base, &instance->base, supported_extensions, NULL, NULL,
438*61046927SAndroid Build Coastguard Worker       dispatch_table);
439*61046927SAndroid Build Coastguard Worker    physical_dev->id = vn_get_next_obj_id();
440*61046927SAndroid Build Coastguard Worker    return result;
441*61046927SAndroid Build Coastguard Worker }
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker static inline void
vn_physical_device_base_fini(struct vn_physical_device_base * physical_dev)444*61046927SAndroid Build Coastguard Worker vn_physical_device_base_fini(struct vn_physical_device_base *physical_dev)
445*61046927SAndroid Build Coastguard Worker {
446*61046927SAndroid Build Coastguard Worker    vk_physical_device_finish(&physical_dev->base);
447*61046927SAndroid Build Coastguard Worker }
448*61046927SAndroid Build Coastguard Worker 
449*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_device_base_init(struct vn_device_base * dev,struct vn_physical_device_base * physical_dev,const struct vk_device_dispatch_table * dispatch_table,const VkDeviceCreateInfo * info,const VkAllocationCallbacks * alloc)450*61046927SAndroid Build Coastguard Worker vn_device_base_init(struct vn_device_base *dev,
451*61046927SAndroid Build Coastguard Worker                     struct vn_physical_device_base *physical_dev,
452*61046927SAndroid Build Coastguard Worker                     const struct vk_device_dispatch_table *dispatch_table,
453*61046927SAndroid Build Coastguard Worker                     const VkDeviceCreateInfo *info,
454*61046927SAndroid Build Coastguard Worker                     const VkAllocationCallbacks *alloc)
455*61046927SAndroid Build Coastguard Worker {
456*61046927SAndroid Build Coastguard Worker    VkResult result = vk_device_init(&dev->base, &physical_dev->base,
457*61046927SAndroid Build Coastguard Worker                                     dispatch_table, info, alloc);
458*61046927SAndroid Build Coastguard Worker    dev->id = vn_get_next_obj_id();
459*61046927SAndroid Build Coastguard Worker    return result;
460*61046927SAndroid Build Coastguard Worker }
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker static inline void
vn_device_base_fini(struct vn_device_base * dev)463*61046927SAndroid Build Coastguard Worker vn_device_base_fini(struct vn_device_base *dev)
464*61046927SAndroid Build Coastguard Worker {
465*61046927SAndroid Build Coastguard Worker    vk_device_finish(&dev->base);
466*61046927SAndroid Build Coastguard Worker }
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker static inline VkResult
vn_queue_base_init(struct vn_queue_base * queue,struct vn_device_base * dev,const VkDeviceQueueCreateInfo * queue_info,uint32_t queue_index)469*61046927SAndroid Build Coastguard Worker vn_queue_base_init(struct vn_queue_base *queue,
470*61046927SAndroid Build Coastguard Worker                    struct vn_device_base *dev,
471*61046927SAndroid Build Coastguard Worker                    const VkDeviceQueueCreateInfo *queue_info,
472*61046927SAndroid Build Coastguard Worker                    uint32_t queue_index)
473*61046927SAndroid Build Coastguard Worker {
474*61046927SAndroid Build Coastguard Worker    VkResult result =
475*61046927SAndroid Build Coastguard Worker       vk_queue_init(&queue->base, &dev->base, queue_info, queue_index);
476*61046927SAndroid Build Coastguard Worker    queue->id = vn_get_next_obj_id();
477*61046927SAndroid Build Coastguard Worker    return result;
478*61046927SAndroid Build Coastguard Worker }
479*61046927SAndroid Build Coastguard Worker 
480*61046927SAndroid Build Coastguard Worker static inline void
vn_queue_base_fini(struct vn_queue_base * queue)481*61046927SAndroid Build Coastguard Worker vn_queue_base_fini(struct vn_queue_base *queue)
482*61046927SAndroid Build Coastguard Worker {
483*61046927SAndroid Build Coastguard Worker    vk_queue_finish(&queue->base);
484*61046927SAndroid Build Coastguard Worker }
485*61046927SAndroid Build Coastguard Worker 
486*61046927SAndroid Build Coastguard Worker static inline void
vn_object_base_init(struct vn_object_base * obj,VkObjectType type,struct vn_device_base * dev)487*61046927SAndroid Build Coastguard Worker vn_object_base_init(struct vn_object_base *obj,
488*61046927SAndroid Build Coastguard Worker                     VkObjectType type,
489*61046927SAndroid Build Coastguard Worker                     struct vn_device_base *dev)
490*61046927SAndroid Build Coastguard Worker {
491*61046927SAndroid Build Coastguard Worker    vk_object_base_init(&dev->base, &obj->base, type);
492*61046927SAndroid Build Coastguard Worker    obj->id = vn_get_next_obj_id();
493*61046927SAndroid Build Coastguard Worker }
494*61046927SAndroid Build Coastguard Worker 
495*61046927SAndroid Build Coastguard Worker static inline void
vn_object_base_fini(struct vn_object_base * obj)496*61046927SAndroid Build Coastguard Worker vn_object_base_fini(struct vn_object_base *obj)
497*61046927SAndroid Build Coastguard Worker {
498*61046927SAndroid Build Coastguard Worker    vk_object_base_finish(&obj->base);
499*61046927SAndroid Build Coastguard Worker }
500*61046927SAndroid Build Coastguard Worker 
501*61046927SAndroid Build Coastguard Worker static inline void
vn_object_set_id(void * obj,vn_object_id id,VkObjectType type)502*61046927SAndroid Build Coastguard Worker vn_object_set_id(void *obj, vn_object_id id, VkObjectType type)
503*61046927SAndroid Build Coastguard Worker {
504*61046927SAndroid Build Coastguard Worker    assert(((const struct vk_object_base *)obj)->type == type);
505*61046927SAndroid Build Coastguard Worker    switch (type) {
506*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_INSTANCE:
507*61046927SAndroid Build Coastguard Worker       ((struct vn_instance_base *)obj)->id = id;
508*61046927SAndroid Build Coastguard Worker       break;
509*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
510*61046927SAndroid Build Coastguard Worker       ((struct vn_physical_device_base *)obj)->id = id;
511*61046927SAndroid Build Coastguard Worker       break;
512*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE:
513*61046927SAndroid Build Coastguard Worker       ((struct vn_device_base *)obj)->id = id;
514*61046927SAndroid Build Coastguard Worker       break;
515*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_QUEUE:
516*61046927SAndroid Build Coastguard Worker       ((struct vn_queue_base *)obj)->id = id;
517*61046927SAndroid Build Coastguard Worker       break;
518*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE_MEMORY:
519*61046927SAndroid Build Coastguard Worker       ((struct vn_device_memory_base *)obj)->id = id;
520*61046927SAndroid Build Coastguard Worker       break;
521*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_IMAGE:
522*61046927SAndroid Build Coastguard Worker       ((struct vn_image_base *)obj)->id = id;
523*61046927SAndroid Build Coastguard Worker       break;
524*61046927SAndroid Build Coastguard Worker    default:
525*61046927SAndroid Build Coastguard Worker       ((struct vn_object_base *)obj)->id = id;
526*61046927SAndroid Build Coastguard Worker       break;
527*61046927SAndroid Build Coastguard Worker    }
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker 
530*61046927SAndroid Build Coastguard Worker static inline vn_object_id
vn_object_get_id(const void * obj,VkObjectType type)531*61046927SAndroid Build Coastguard Worker vn_object_get_id(const void *obj, VkObjectType type)
532*61046927SAndroid Build Coastguard Worker {
533*61046927SAndroid Build Coastguard Worker    assert(((const struct vk_object_base *)obj)->type == type);
534*61046927SAndroid Build Coastguard Worker    switch (type) {
535*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_INSTANCE:
536*61046927SAndroid Build Coastguard Worker       return ((struct vn_instance_base *)obj)->id;
537*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
538*61046927SAndroid Build Coastguard Worker       return ((struct vn_physical_device_base *)obj)->id;
539*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE:
540*61046927SAndroid Build Coastguard Worker       return ((struct vn_device_base *)obj)->id;
541*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_QUEUE:
542*61046927SAndroid Build Coastguard Worker       return ((struct vn_queue_base *)obj)->id;
543*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_DEVICE_MEMORY:
544*61046927SAndroid Build Coastguard Worker       return ((struct vn_device_memory_base *)obj)->id;
545*61046927SAndroid Build Coastguard Worker    case VK_OBJECT_TYPE_IMAGE:
546*61046927SAndroid Build Coastguard Worker       return ((struct vn_image_base *)obj)->id;
547*61046927SAndroid Build Coastguard Worker    default:
548*61046927SAndroid Build Coastguard Worker       return ((struct vn_object_base *)obj)->id;
549*61046927SAndroid Build Coastguard Worker    }
550*61046927SAndroid Build Coastguard Worker }
551*61046927SAndroid Build Coastguard Worker 
552*61046927SAndroid Build Coastguard Worker static inline pid_t
vn_gettid(void)553*61046927SAndroid Build Coastguard Worker vn_gettid(void)
554*61046927SAndroid Build Coastguard Worker {
555*61046927SAndroid Build Coastguard Worker #if DETECT_OS_ANDROID
556*61046927SAndroid Build Coastguard Worker    return gettid();
557*61046927SAndroid Build Coastguard Worker #else
558*61046927SAndroid Build Coastguard Worker    return syscall(SYS_gettid);
559*61046927SAndroid Build Coastguard Worker #endif
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker 
562*61046927SAndroid Build Coastguard Worker struct vn_tls *
563*61046927SAndroid Build Coastguard Worker vn_tls_get(void);
564*61046927SAndroid Build Coastguard Worker 
565*61046927SAndroid Build Coastguard Worker static inline void
vn_tls_set_async_pipeline_create(void)566*61046927SAndroid Build Coastguard Worker vn_tls_set_async_pipeline_create(void)
567*61046927SAndroid Build Coastguard Worker {
568*61046927SAndroid Build Coastguard Worker    struct vn_tls *tls = vn_tls_get();
569*61046927SAndroid Build Coastguard Worker    if (likely(tls))
570*61046927SAndroid Build Coastguard Worker       tls->async_pipeline_create = true;
571*61046927SAndroid Build Coastguard Worker }
572*61046927SAndroid Build Coastguard Worker 
573*61046927SAndroid Build Coastguard Worker static inline bool
vn_tls_get_async_pipeline_create(void)574*61046927SAndroid Build Coastguard Worker vn_tls_get_async_pipeline_create(void)
575*61046927SAndroid Build Coastguard Worker {
576*61046927SAndroid Build Coastguard Worker    const struct vn_tls *tls = vn_tls_get();
577*61046927SAndroid Build Coastguard Worker    if (likely(tls))
578*61046927SAndroid Build Coastguard Worker       return tls->async_pipeline_create;
579*61046927SAndroid Build Coastguard Worker    return true;
580*61046927SAndroid Build Coastguard Worker }
581*61046927SAndroid Build Coastguard Worker 
582*61046927SAndroid Build Coastguard Worker struct vn_ring *
583*61046927SAndroid Build Coastguard Worker vn_tls_get_ring(struct vn_instance *instance);
584*61046927SAndroid Build Coastguard Worker 
585*61046927SAndroid Build Coastguard Worker void
586*61046927SAndroid Build Coastguard Worker vn_tls_destroy_ring(struct vn_tls_ring *tls_ring);
587*61046927SAndroid Build Coastguard Worker 
588*61046927SAndroid Build Coastguard Worker static inline uint32_t
vn_cache_key_hash_function(const void * key)589*61046927SAndroid Build Coastguard Worker vn_cache_key_hash_function(const void *key)
590*61046927SAndroid Build Coastguard Worker {
591*61046927SAndroid Build Coastguard Worker    return _mesa_hash_data(key, SHA1_DIGEST_LENGTH);
592*61046927SAndroid Build Coastguard Worker }
593*61046927SAndroid Build Coastguard Worker 
594*61046927SAndroid Build Coastguard Worker static inline bool
vn_cache_key_equal_function(const void * key1,const void * key2)595*61046927SAndroid Build Coastguard Worker vn_cache_key_equal_function(const void *key1, const void *key2)
596*61046927SAndroid Build Coastguard Worker {
597*61046927SAndroid Build Coastguard Worker    return memcmp(key1, key2, SHA1_DIGEST_LENGTH) == 0;
598*61046927SAndroid Build Coastguard Worker }
599*61046927SAndroid Build Coastguard Worker 
600*61046927SAndroid Build Coastguard Worker static inline void
vn_cached_storage_init(struct vn_cached_storage * storage,const VkAllocationCallbacks * alloc)601*61046927SAndroid Build Coastguard Worker vn_cached_storage_init(struct vn_cached_storage *storage,
602*61046927SAndroid Build Coastguard Worker                        const VkAllocationCallbacks *alloc)
603*61046927SAndroid Build Coastguard Worker {
604*61046927SAndroid Build Coastguard Worker    storage->alloc = alloc;
605*61046927SAndroid Build Coastguard Worker    storage->size = 0;
606*61046927SAndroid Build Coastguard Worker    storage->data = NULL;
607*61046927SAndroid Build Coastguard Worker }
608*61046927SAndroid Build Coastguard Worker 
609*61046927SAndroid Build Coastguard Worker static inline void *
vn_cached_storage_get(struct vn_cached_storage * storage,size_t size)610*61046927SAndroid Build Coastguard Worker vn_cached_storage_get(struct vn_cached_storage *storage, size_t size)
611*61046927SAndroid Build Coastguard Worker {
612*61046927SAndroid Build Coastguard Worker    if (size > storage->size) {
613*61046927SAndroid Build Coastguard Worker       void *data =
614*61046927SAndroid Build Coastguard Worker          vk_realloc(storage->alloc, storage->data, size, VN_DEFAULT_ALIGN,
615*61046927SAndroid Build Coastguard Worker                     VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
616*61046927SAndroid Build Coastguard Worker       if (!data)
617*61046927SAndroid Build Coastguard Worker          return NULL;
618*61046927SAndroid Build Coastguard Worker 
619*61046927SAndroid Build Coastguard Worker       storage->size = size;
620*61046927SAndroid Build Coastguard Worker       storage->data = data;
621*61046927SAndroid Build Coastguard Worker    }
622*61046927SAndroid Build Coastguard Worker    return storage->data;
623*61046927SAndroid Build Coastguard Worker }
624*61046927SAndroid Build Coastguard Worker 
625*61046927SAndroid Build Coastguard Worker static inline void
vn_cached_storage_fini(struct vn_cached_storage * storage)626*61046927SAndroid Build Coastguard Worker vn_cached_storage_fini(struct vn_cached_storage *storage)
627*61046927SAndroid Build Coastguard Worker {
628*61046927SAndroid Build Coastguard Worker    vk_free(storage->alloc, storage->data);
629*61046927SAndroid Build Coastguard Worker }
630*61046927SAndroid Build Coastguard Worker 
631*61046927SAndroid Build Coastguard Worker #endif /* VN_COMMON_H */
632