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 Workerrender_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 Workerrender_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