diff options
Diffstat (limited to 'src/vrend_winsys.c')
-rw-r--r-- | src/vrend_winsys.c | 46 |
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) |