| /* |
| * Copyright 2021 Google LLC |
| * SPDX-License-Identifier: MIT |
| */ |
| |
| #ifndef RENDER_VIRGL_H |
| #define RENDER_VIRGL_H |
| |
| #include "render_common.h" |
| |
| #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD |
| #include "c11/threads.h" |
| #endif |
| |
| /* Workers call into virglrenderer. When they are processes, not much care is |
| * required. We just want to be careful that the server process might have |
| * initialized viglrenderer before workers are forked. |
| * |
| * But when workers are threads, we need to grab a lock to protect |
| * virglrenderer. |
| * |
| * TODO skip virglrenderer.h and go straight to vkr_renderer.h. That allows |
| * us to remove this file. |
| */ |
| struct render_virgl { |
| #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD |
| /* this protects the struct */ |
| mtx_t struct_mutex; |
| /* this protects virglrenderer */ |
| mtx_t dispatch_mutex; |
| #endif |
| |
| /* for nested initialization */ |
| int init_count; |
| uint32_t init_flags; |
| |
| struct list_head contexts; |
| }; |
| |
| extern struct render_virgl render_virgl_internal; |
| |
| bool |
| render_virgl_init(uint32_t init_flags); |
| |
| void |
| render_virgl_fini(void); |
| |
| void |
| render_virgl_add_context(struct render_context *ctx); |
| |
| void |
| render_virgl_remove_context(struct render_context *ctx); |
| |
| static inline void |
| render_virgl_lock_dispatch(void) |
| { |
| #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD |
| mtx_lock(&render_virgl_internal.dispatch_mutex); |
| #endif |
| } |
| |
| static inline void |
| render_virgl_unlock_dispatch(void) |
| { |
| #ifdef ENABLE_RENDER_SERVER_WORKER_THREAD |
| mtx_unlock(&render_virgl_internal.dispatch_mutex); |
| #endif |
| } |
| |
| #endif /* RENDER_VIRGL_H */ |