{
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)
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))
{
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
{
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)
{
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); */