diff options
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_engine.c | 88 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_engine.h | 7 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_x11/evas_x_main.c | 34 |
3 files changed, 93 insertions, 36 deletions
diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index 75a389205d..0d12b744cd 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -158,6 +158,65 @@ evgl_eng_evas_surface_get(void *data) return NULL; } +#ifdef GL_GLES +static EGLDisplay main_dpy = EGL_NO_DISPLAY; +static EGLSurface main_draw = EGL_NO_SURFACE; +static EGLSurface main_read = EGL_NO_SURFACE; +static EGLContext main_ctx = EGL_NO_CONTEXT; + +EGLContext +evas_eglGetCurrentContext(void) +{ + if (eina_main_loop_is()) + return main_ctx; + else + return eglGetCurrentContext(); +} + +EGLSurface +evas_eglGetCurrentSurface(EGLint readdraw) +{ + if (eina_main_loop_is()) + return (readdraw == EGL_READ) ? main_read : main_draw; + else + return eglGetCurrentSurface(readdraw); +} + +EGLDisplay +evas_eglGetCurrentDisplay(void) +{ + if (eina_main_loop_is()) + return main_dpy; + else + return eglGetCurrentDisplay(); +} + +EGLBoolean +evas_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) +{ + if (eina_main_loop_is()) + { + EGLBoolean ret; + + if ((dpy == main_dpy) && (draw == main_draw) && + (read == main_read) && (ctx == main_ctx)) + return 1; + + ret = eglMakeCurrent(dpy, draw, read, ctx); + if (ret) + { + main_dpy = dpy; + main_draw = draw; + main_read = read; + main_ctx = ctx; + } + return ret; + } + else + return eglMakeCurrent(dpy, draw, read, ctx); +} +#endif + static int evgl_eng_make_current(void *data, void *surface, void *context, int flush) { @@ -172,7 +231,6 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush) return 0; } - #ifdef GL_GLES EGLContext ctx = (EGLContext)context; EGLSurface sfc = (EGLSurface)surface; @@ -180,25 +238,21 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush) if ((!context) && (!surface)) { - if (!eglGetCurrentContext() && - !eglGetCurrentSurface(EGL_READ) && - !eglGetCurrentSurface(EGL_DRAW)) - return 1; - ret = eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + ret = evas_eglMakeCurrent(dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (!ret) { int err = eglGetError(); glsym_evas_gl_common_error_set(err - EGL_SUCCESS); - ERR("eglMakeCurrent() failed! Error Code=%#x", err); + ERR("evas_eglMakeCurrent() failed! Error Code=%#x", err); return 0; } return 1; } // FIXME: Check (eglGetCurrentDisplay() != dpy) ? - if ((eglGetCurrentContext() != ctx) || - (eglGetCurrentSurface(EGL_READ) != sfc) || - (eglGetCurrentSurface(EGL_DRAW) != sfc) ) + if ((evas_eglGetCurrentContext() != ctx) || + (evas_eglGetCurrentSurface(EGL_READ) != sfc) || + (evas_eglGetCurrentSurface(EGL_DRAW) != sfc) ) { //!!!! Does it need to be flushed with it's set to NULL above?? @@ -206,13 +260,13 @@ evgl_eng_make_current(void *data, void *surface, void *context, int flush) if (flush) eng_window_use(NULL); // Do a make current - ret = eglMakeCurrent(dpy, sfc, sfc, ctx); + ret = evas_eglMakeCurrent(dpy, sfc, sfc, ctx); if (!ret) { int err = eglGetError(); glsym_evas_gl_common_error_set(err - EGL_SUCCESS); - ERR("eglMakeCurrent() failed! Error Code=%#x", err); + ERR("evas_eglMakeCurrent() failed! Error Code=%#x", err); return 0; } } @@ -662,7 +716,7 @@ evgl_eng_pbuffer_surface_create(void *data, EVGL_Surface *sfc, config_attrs[i++] = EGL_PBUFFER_BIT; config_attrs[i++] = EGL_NONE; #else - // It looks like eglMakeCurrent might fail if we use a different config from + // It looks like evas_eglMakeCurrent might fail if we use a different config from // the actual display surface. This is weird. i = 0; config_attrs[i++] = EGL_CONFIG_ID; @@ -1121,7 +1175,7 @@ evgl_eng_gles_context_create(void *data, if (!sfc || !sfc->indirect_sfc_config) { - ERR("Surface is not set! Creating context anyways but eglMakeCurrent " + ERR("Surface is not set! Creating context anyways but evas_eglMakeCurrent " "might very well fail with EGL_BAD_MATCH (0x3009)"); config = eng_get_ob(re)->egl_config; } @@ -1833,7 +1887,7 @@ eng_preload_make_current(void *data, void *doit) if (doit) { #ifdef GL_GLES - if (!eglMakeCurrent(ob->egl_disp, ob->egl_surface[0], ob->egl_surface[0], ob->egl_context[0])) + if (!evas_eglMakeCurrent(ob->egl_disp, ob->egl_surface[0], ob->egl_surface[0], ob->egl_context[0])) return EINA_FALSE; #else if (!__glXMakeContextCurrent(ob->info->info.display, ob->glxwin, ob->context)) @@ -1848,7 +1902,7 @@ eng_preload_make_current(void *data, void *doit) else { #ifdef GL_GLES - if (!eglMakeCurrent(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) + if (!evas_eglMakeCurrent(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) return EINA_FALSE; #else if (!__glXMakeContextCurrent(ob->info->info.display, 0, NULL)) @@ -1895,7 +1949,7 @@ eng_gl_current_context_get(void *data EINA_UNUSED) context = glsym_evgl_current_native_context_get(ctx); #ifdef GL_GLES - if (eglGetCurrentContext() == context) + if (evas_eglGetCurrentContext() == context) return ctx; #else if (glXGetCurrentContext() == context) diff --git a/src/modules/evas/engines/gl_x11/evas_engine.h b/src/modules/evas/engines/gl_x11/evas_engine.h index 3ef4054e10..f84313b16f 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.h +++ b/src/modules/evas/engines/gl_x11/evas_engine.h @@ -214,7 +214,12 @@ _re_wincheck(Outbuf *ob) return 0; } -#ifndef GL_GLES +#ifdef GL_GLES +EGLBoolean evas_eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +EGLContext evas_eglGetCurrentContext(void); +EGLSurface evas_eglGetCurrentSurface(EGLint readdraw); +EGLDisplay evas_eglGetCurrentDisplay(void); +#else Eina_Bool __glXMakeContextCurrent(Display *disp, GLXDrawable glxwin, GLXContext context); #endif diff --git a/src/modules/evas/engines/gl_x11/evas_x_main.c b/src/modules/evas/engines/gl_x11/evas_x_main.c index d6073aad8e..8ee32d2dde 100644 --- a/src/modules/evas/engines/gl_x11/evas_x_main.c +++ b/src/modules/evas/engines/gl_x11/evas_x_main.c @@ -276,12 +276,12 @@ try_gles2: _tls_context_set(gw->egl_context[0]); SET_RESTORE_CONTEXT(); - if (eglMakeCurrent(gw->egl_disp, + if (evas_eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0]) == EGL_FALSE) { - ERR("eglMakeCurrent() fail. code=%#x", eglGetError()); + ERR("evas_eglMakeCurrent() fail. code=%#x", eglGetError()); eng_window_free(gw); return NULL; } @@ -591,7 +591,7 @@ eng_window_free(Outbuf *gw) } #ifdef GL_GLES SET_RESTORE_CONTEXT(); - eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + evas_eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (gw->egl_surface[0] != EGL_NO_SURFACE) eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); if (gw->egl_surface[1] != EGL_NO_SURFACE) @@ -632,12 +632,12 @@ eng_window_make_current(void *data, void *doit) SET_RESTORE_CONTEXT(); if (doit) { - if (!eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0])) + if (!evas_eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0])) return EINA_FALSE; } else { - if (!eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) + if (!evas_eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) return EINA_FALSE; } #else @@ -670,15 +670,13 @@ eng_window_use(Outbuf *gw) #ifdef GL_GLES if (xwin) { - if ((eglGetCurrentDisplay() != - xwin->egl_disp) || - (eglGetCurrentContext() != - xwin->egl_context[0]) + if ((evas_eglGetCurrentDisplay() != xwin->egl_disp) || + (evas_eglGetCurrentContext() != xwin->egl_context[0]) #if 0 // FIXME: Figure out what that offscreen thing was about... - || (eglGetCurrentSurface(EGL_READ) != + || (evas_eglGetCurrentSurface(EGL_READ) != xwin->egl_surface[xwin->offscreen]) - || (eglGetCurrentSurface(EGL_DRAW) != + || (evas_eglGetCurrentSurface(EGL_DRAW) != xwin->egl_surface[xwin->offscreen]) #endif ) @@ -706,12 +704,12 @@ eng_window_use(Outbuf *gw) if (gw->egl_surface[0] != EGL_NO_SURFACE) { SET_RESTORE_CONTEXT(); - if (eglMakeCurrent(gw->egl_disp, + if (evas_eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0]) == EGL_FALSE) { - ERR("eglMakeCurrent() failed!"); + ERR("evas_eglMakeCurrent() failed!"); } } // GLX @@ -742,7 +740,7 @@ eng_window_unsurf(Outbuf *gw) if (xwin == gw) { SET_RESTORE_CONTEXT(); - eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + evas_eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); if (gw->egl_surface[0] != EGL_NO_SURFACE) eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); gw->egl_surface[0] = EGL_NO_SURFACE; @@ -777,12 +775,12 @@ eng_window_resurf(Outbuf *gw) return; } SET_RESTORE_CONTEXT(); - if (eglMakeCurrent(gw->egl_disp, + if (evas_eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0]) == EGL_FALSE) { - ERR("eglMakeCurrent() failed!"); + ERR("evas_eglMakeCurrent() failed!"); } #else Evas_GL_X11_Visual *evis; @@ -1332,10 +1330,10 @@ eng_gl_context_use(Context_3D *ctx) { #if GL_GLES SET_RESTORE_CONTEXT(); - if (eglMakeCurrent(ctx->display, ctx->surface, + if (evas_eglMakeCurrent(ctx->display, ctx->surface, ctx->surface, ctx->context) == EGL_FALSE) { - ERR("eglMakeCurrent() failed."); + ERR("evas_eglMakeCurrent() failed."); } #else if (!__glXMakeContextCurrent(ctx->display, ctx->glxwin, ctx->context)) |