aboutsummaryrefslogtreecommitdiff
path: root/src/vrend_winsys.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vrend_winsys.c')
-rw-r--r--src/vrend_winsys.c46
1 files changed, 39 insertions, 7 deletions
diff --git a/src/vrend_winsys.c b/src/vrend_winsys.c
index 669af818..6a73b7fd 100644
--- a/src/vrend_winsys.c
+++ b/src/vrend_winsys.c
@@ -33,7 +33,8 @@
enum {
CONTEXT_NONE,
CONTEXT_EGL,
- CONTEXT_GLX
+ CONTEXT_GLX,
+ CONTEXT_EGL_EXTERNAL
};
static int use_context = CONTEXT_NONE;
@@ -102,6 +103,10 @@ void vrend_winsys_cleanup(void)
virgl_gbm_fini(gbm);
gbm = NULL;
}
+ } else if (use_context == CONTEXT_EGL_EXTERNAL) {
+ free(egl);
+ egl = NULL;
+ use_context = CONTEXT_NONE;
}
#endif
#ifdef HAVE_EPOXY_GLX_H
@@ -113,6 +118,23 @@ void vrend_winsys_cleanup(void)
#endif
}
+int vrend_winsys_init_external(void *egl_display)
+{
+#ifdef HAVE_EPOXY_EGL_H
+ egl = virgl_egl_init_external(egl_display);
+ if (!egl)
+ return -1;
+
+ use_context = CONTEXT_EGL_EXTERNAL;
+#else
+ (void)egl_display;
+ vrend_printf( "EGL is not supported on this platform\n");
+ return -1;
+#endif
+
+ return 0;
+}
+
virgl_renderer_gl_context vrend_winsys_create_context(struct virgl_gl_ctx_param *param)
{
#ifdef HAVE_EPOXY_EGL_H
@@ -144,15 +166,24 @@ void vrend_winsys_destroy_context(virgl_renderer_gl_context ctx)
int vrend_winsys_make_context_current(virgl_renderer_gl_context ctx)
{
+ int ret = -1;
#ifdef HAVE_EPOXY_EGL_H
- if (use_context == CONTEXT_EGL)
- return virgl_egl_make_context_current(egl, ctx);
+ if (use_context == CONTEXT_EGL) {
+ ret = virgl_egl_make_context_current(egl, ctx);
+ if (ret)
+ vrend_printf("%s: Error switching context: %s\n",
+ __func__, virgl_egl_error_string(eglGetError()));
+ }
#endif
#ifdef HAVE_EPOXY_GLX_H
- if (use_context == CONTEXT_GLX)
- return virgl_glx_make_context_current(glx_info, ctx);
+ if (use_context == CONTEXT_GLX) {
+ ret = virgl_glx_make_context_current(glx_info, ctx);
+ if (ret)
+ vrend_printf("%s: Error switching context\n", __func__);
+ }
#endif
- return -1;
+ assert(!ret && "Failed to switch GL context");
+ return ret;
}
int vrend_winsys_has_gl_colorspace(void)
@@ -164,7 +195,8 @@ int vrend_winsys_has_gl_colorspace(void)
#endif
return use_context == CONTEXT_NONE ||
use_context == CONTEXT_GLX ||
- (use_context == CONTEXT_EGL && egl_colorspace);
+ (use_context == CONTEXT_EGL && egl_colorspace) ||
+ (use_context == CONTEXT_EGL_EXTERNAL && egl_colorspace);
}
int vrend_winsys_get_fourcc_for_texture(uint32_t tex_id, uint32_t format, int *fourcc)