xref: /aosp_15_r20/external/virglrenderer/server/render_virgl.h (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /*
2*bbecb9d1SAndroid Build Coastguard Worker  * Copyright 2021 Google LLC
3*bbecb9d1SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*bbecb9d1SAndroid Build Coastguard Worker  */
5*bbecb9d1SAndroid Build Coastguard Worker 
6*bbecb9d1SAndroid Build Coastguard Worker #ifndef RENDER_VIRGL_H
7*bbecb9d1SAndroid Build Coastguard Worker #define RENDER_VIRGL_H
8*bbecb9d1SAndroid Build Coastguard Worker 
9*bbecb9d1SAndroid Build Coastguard Worker #include "render_common.h"
10*bbecb9d1SAndroid Build Coastguard Worker 
11*bbecb9d1SAndroid Build Coastguard Worker #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD
12*bbecb9d1SAndroid Build Coastguard Worker #include "c11/threads.h"
13*bbecb9d1SAndroid Build Coastguard Worker #endif
14*bbecb9d1SAndroid Build Coastguard Worker 
15*bbecb9d1SAndroid Build Coastguard Worker /* Workers call into virglrenderer.  When they are processes, not much care is
16*bbecb9d1SAndroid Build Coastguard Worker  * required.  We just want to be careful that the server process might have
17*bbecb9d1SAndroid Build Coastguard Worker  * initialized viglrenderer before workers are forked.
18*bbecb9d1SAndroid Build Coastguard Worker  *
19*bbecb9d1SAndroid Build Coastguard Worker  * But when workers are threads, we need to grab a lock to protect
20*bbecb9d1SAndroid Build Coastguard Worker  * virglrenderer.
21*bbecb9d1SAndroid Build Coastguard Worker  *
22*bbecb9d1SAndroid Build Coastguard Worker  * TODO skip virglrenderer.h and go straight to vkr_renderer.h.  That allows
23*bbecb9d1SAndroid Build Coastguard Worker  * us to remove this file.
24*bbecb9d1SAndroid Build Coastguard Worker  */
25*bbecb9d1SAndroid Build Coastguard Worker struct render_virgl {
26*bbecb9d1SAndroid Build Coastguard Worker #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD
27*bbecb9d1SAndroid Build Coastguard Worker    /* this protects the struct */
28*bbecb9d1SAndroid Build Coastguard Worker    mtx_t struct_mutex;
29*bbecb9d1SAndroid Build Coastguard Worker    /* this protects virglrenderer */
30*bbecb9d1SAndroid Build Coastguard Worker    mtx_t dispatch_mutex;
31*bbecb9d1SAndroid Build Coastguard Worker #endif
32*bbecb9d1SAndroid Build Coastguard Worker 
33*bbecb9d1SAndroid Build Coastguard Worker    /* for nested initialization */
34*bbecb9d1SAndroid Build Coastguard Worker    int init_count;
35*bbecb9d1SAndroid Build Coastguard Worker    uint32_t init_flags;
36*bbecb9d1SAndroid Build Coastguard Worker 
37*bbecb9d1SAndroid Build Coastguard Worker    struct list_head contexts;
38*bbecb9d1SAndroid Build Coastguard Worker };
39*bbecb9d1SAndroid Build Coastguard Worker 
40*bbecb9d1SAndroid Build Coastguard Worker extern struct render_virgl render_virgl_internal;
41*bbecb9d1SAndroid Build Coastguard Worker 
42*bbecb9d1SAndroid Build Coastguard Worker bool
43*bbecb9d1SAndroid Build Coastguard Worker render_virgl_init(uint32_t init_flags);
44*bbecb9d1SAndroid Build Coastguard Worker 
45*bbecb9d1SAndroid Build Coastguard Worker void
46*bbecb9d1SAndroid Build Coastguard Worker render_virgl_fini(void);
47*bbecb9d1SAndroid Build Coastguard Worker 
48*bbecb9d1SAndroid Build Coastguard Worker void
49*bbecb9d1SAndroid Build Coastguard Worker render_virgl_add_context(struct render_context *ctx);
50*bbecb9d1SAndroid Build Coastguard Worker 
51*bbecb9d1SAndroid Build Coastguard Worker void
52*bbecb9d1SAndroid Build Coastguard Worker render_virgl_remove_context(struct render_context *ctx);
53*bbecb9d1SAndroid Build Coastguard Worker 
54*bbecb9d1SAndroid Build Coastguard Worker static inline void
render_virgl_lock_dispatch(void)55*bbecb9d1SAndroid Build Coastguard Worker render_virgl_lock_dispatch(void)
56*bbecb9d1SAndroid Build Coastguard Worker {
57*bbecb9d1SAndroid Build Coastguard Worker #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD
58*bbecb9d1SAndroid Build Coastguard Worker    mtx_lock(&render_virgl_internal.dispatch_mutex);
59*bbecb9d1SAndroid Build Coastguard Worker #endif
60*bbecb9d1SAndroid Build Coastguard Worker }
61*bbecb9d1SAndroid Build Coastguard Worker 
62*bbecb9d1SAndroid Build Coastguard Worker static inline void
render_virgl_unlock_dispatch(void)63*bbecb9d1SAndroid Build Coastguard Worker render_virgl_unlock_dispatch(void)
64*bbecb9d1SAndroid Build Coastguard Worker {
65*bbecb9d1SAndroid Build Coastguard Worker #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD
66*bbecb9d1SAndroid Build Coastguard Worker    mtx_unlock(&render_virgl_internal.dispatch_mutex);
67*bbecb9d1SAndroid Build Coastguard Worker #endif
68*bbecb9d1SAndroid Build Coastguard Worker }
69*bbecb9d1SAndroid Build Coastguard Worker 
70*bbecb9d1SAndroid Build Coastguard Worker #endif /* RENDER_VIRGL_H */
71