virgl: more robust winsys init/cleanup
As a bonus, use_context is no longer exposed.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
diff --git a/src/virglrenderer.c b/src/virglrenderer.c
index 63245a9..277171e 100644
--- a/src/virglrenderer.c
+++ b/src/virglrenderer.c
@@ -49,6 +49,7 @@
bool resource_initialized;
bool context_initialized;
+ bool winsys_initialized;
bool vrend_initialized;
};
@@ -343,9 +344,13 @@
(struct vrend_renderer_resource_info *)info);
info->handle = res_handle;
- return vrend_winsys_get_fourcc_for_texture(info->tex_id,
- info->virgl_format,
- &info->drm_fourcc);
+ if (state.winsys_initialized) {
+ return vrend_winsys_get_fourcc_for_texture(info->tex_id,
+ info->virgl_format,
+ &info->drm_fourcc);
+ }
+
+ return 0;
}
void virgl_renderer_get_cap_set(uint32_t cap_set, uint32_t *max_ver,
@@ -386,7 +391,7 @@
{
struct virgl_renderer_gl_ctx_param vparam;
- if (use_context != CONTEXT_NONE)
+ if (state.winsys_initialized)
return vrend_winsys_create_context(param);
vparam.version = 1;
@@ -398,7 +403,7 @@
static void destroy_gl_context(virgl_renderer_gl_context ctx)
{
- if (use_context != CONTEXT_NONE) {
+ if (state.winsys_initialized) {
vrend_winsys_destroy_context(ctx);
return;
}
@@ -408,7 +413,7 @@
static int make_current(virgl_renderer_gl_context ctx)
{
- if (use_context != CONTEXT_NONE)
+ if (state.winsys_initialized)
return vrend_winsys_make_context_current(ctx);
return state.cbs->make_current(state.cookie, 0, ctx);
@@ -453,14 +458,14 @@
if (state.vrend_initialized)
vrend_renderer_fini();
- vrend_winsys_cleanup();
+ if (state.winsys_initialized)
+ vrend_winsys_cleanup();
memset(&state, 0, sizeof(state));
}
int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks *cbs)
{
- int drm_fd = -1;
int ret;
if (!cookie || !cbs)
@@ -472,15 +477,6 @@
state.cookie = cookie;
state.cbs = cbs;
- if (flags & VIRGL_RENDERER_USE_EGL) {
- if (cbs->version >= 2 && cbs->get_drm_fd) {
- drm_fd = cbs->get_drm_fd(cookie);
- }
- }
- ret = vrend_winsys_init(flags, drm_fd);
- if (ret)
- return ret;
-
if (!state.resource_initialized) {
ret = virgl_resource_table_init(vrend_renderer_get_pipe_callbacks());
if (ret)
@@ -495,6 +491,21 @@
state.context_initialized = true;
}
+ if (!state.winsys_initialized && (flags & (VIRGL_RENDERER_USE_EGL |
+ VIRGL_RENDERER_USE_GLX))) {
+ int drm_fd = -1;
+
+ if (flags & VIRGL_RENDERER_USE_EGL) {
+ if (cbs->version >= 2 && cbs->get_drm_fd)
+ drm_fd = cbs->get_drm_fd(cookie);
+ }
+
+ ret = vrend_winsys_init(flags, drm_fd);
+ if (ret)
+ return ret;
+ state.winsys_initialized = true;
+ }
+
if (!state.vrend_initialized) {
uint32_t renderer_flags = 0;
@@ -514,12 +525,16 @@
int virgl_renderer_get_fd_for_texture(uint32_t tex_id, int *fd)
{
- return vrend_winsys_get_fd_for_texture(tex_id, fd);
+ if (state.winsys_initialized)
+ return vrend_winsys_get_fd_for_texture(tex_id, fd);
+ return -1;
}
int virgl_renderer_get_fd_for_texture2(uint32_t tex_id, int *fd, int *stride, int *offset)
{
- return vrend_winsys_get_fd_for_texture2(tex_id, fd, stride, offset);
+ if (state.winsys_initialized)
+ return vrend_winsys_get_fd_for_texture2(tex_id, fd, stride, offset);
+ return -1;
}
void virgl_renderer_reset(void)
diff --git a/src/vrend_winsys.c b/src/vrend_winsys.c
index 29ef506..4e4bbc1 100644
--- a/src/vrend_winsys.c
+++ b/src/vrend_winsys.c
@@ -30,7 +30,13 @@
#include <stddef.h>
-int use_context = CONTEXT_NONE;
+enum {
+ CONTEXT_NONE,
+ CONTEXT_EGL,
+ CONTEXT_GLX
+};
+
+static int use_context = CONTEXT_NONE;
#ifdef HAVE_EPOXY_EGL_H
struct virgl_egl *egl = NULL;
diff --git a/src/vrend_winsys.h b/src/vrend_winsys.h
index b5b4a5a..24b1e5b 100644
--- a/src/vrend_winsys.h
+++ b/src/vrend_winsys.h
@@ -34,16 +34,8 @@
#include "virglrenderer.h"
-enum {
- CONTEXT_NONE,
- CONTEXT_EGL,
- CONTEXT_GLX
-};
-
struct virgl_gl_ctx_param;
-extern int use_context;
-
#ifdef HAVE_EPOXY_EGL_H
extern struct virgl_egl *egl;
extern struct virgl_gbm *gbm;