diff --git a/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c b/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c index 7dc158b5ed..7288c6689f 100644 --- a/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c +++ b/legacy/evas/src/modules/engines/wayland_egl/evas_engine.c @@ -600,6 +600,7 @@ eng_setup(Evas *e, void *in) { Render_Engine *re; Evas_Engine_Info_Wayland_Egl *info; + Evas_GL_Wl_Window *new_win = NULL; info = (Evas_Engine_Info_Wayland_Egl *)in; if (!e->engine.data.output) @@ -679,28 +680,36 @@ eng_setup(Evas *e, void *in) return 0; } - if (re->win) - { - re->win->gl_context->references++; - eng_window_free(re->win); - inc = 1; - gl_wins--; - } - re->w = e->output.w; - re->h = e->output.h; - re->win = eng_window_new(re->info->info.display, + new_win = eng_window_new(re->info->info.display, re->info->info.surface, re->info->info.screen, re->info->info.depth, - re->w, re->h, + e->output.w, e->output.h, re->info->indirect, re->info->info.destination_alpha, re->info->info.rotation); - eng_window_use(re->win); - if (re->win) gl_wins++; - if ((re->win) && (inc)) - re->win->gl_context->references--; - } + + if (new_win) + { + // free old win + if (re->win) + { + re->win->gl_context->references++; + eng_window_free(re->win); + inc = 1; + gl_wins--; + } + + re->win = new_win; + re->w = e->output.w; + re->h = e->output.h; + + eng_window_use(re->win); + if (re->win) gl_wins++; + if ((re->win) && (inc)) + re->win->gl_context->references--; + } + } else if ((re->win->w != e->output.w) || (re->win->h != e->output.h)) { diff --git a/legacy/evas/src/modules/engines/wayland_egl/evas_wl_main.c b/legacy/evas/src/modules/engines/wayland_egl/evas_wl_main.c index 58ab1c3abb..c5f9721e9b 100644 --- a/legacy/evas/src/modules/engines/wayland_egl/evas_wl_main.c +++ b/legacy/evas/src/modules/engines/wayland_egl/evas_wl_main.c @@ -2,7 +2,7 @@ static Evas_GL_Wl_Window *_evas_gl_wl_window = NULL; -static EGLContext context = EGL_NO_CONTEXT; +static EGLContext share_context = EGL_NO_CONTEXT; // fixme: something is up/wrong here - dont know what tho... //#define NEWGL 1 @@ -146,21 +146,22 @@ eng_window_new(struct wl_display *disp, struct wl_surface *surface, int screen, { ERR("eglCreateWindowSurface() fail for %p. code=%#x", gw->win, eglGetError()); - eng_window_free(gw); + eng_window_free(gw); return NULL; } - if (context == EGL_NO_CONTEXT) - context = eglCreateContext(gw->egl_disp, gw->egl_config, NULL, - context_attrs); - gw->egl_context[0] = context; + gw->egl_context[0] = eglCreateContext(gw->egl_disp, gw->egl_config, share_context, context_attrs); + if (gw->egl_context[0] == EGL_NO_CONTEXT) { ERR("eglCreateContext() fail. code=%#x", eglGetError()); - eng_window_free(gw); + eng_window_free(gw); return NULL; } + if (share_context == EGL_NO_CONTEXT) + share_context = gw->egl_context[0]; + if (eglMakeCurrent(gw->egl_disp, gw->egl_surface[0], gw->egl_surface[0], gw->egl_context[0]) == EGL_FALSE) { @@ -213,10 +214,12 @@ eng_window_free(Evas_GL_Wl_Window *gw) if (gw->egl_surface[0] != EGL_NO_SURFACE) eglDestroySurface(gw->egl_disp, gw->egl_surface[0]); eglMakeCurrent(gw->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (gw->egl_context[0] != EGL_NO_CONTEXT && gw->egl_context[0] != share_context) + eglDestroyContext(gw->egl_disp, gw->egl_context[0]); + if (ref == 0) { - if (context) eglDestroyContext(gw->egl_disp, context); - context = EGL_NO_CONTEXT; /* NB: This is causing an unknown hang when we run elm apps as * wayland clients inside the weston compositor */ /* eglTerminate(gw->egl_disp); */