From e3b9fbaed8e5e5f3730d3a8aa406873f8df60744 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Mon, 14 Aug 2017 17:07:31 -0500 Subject: [PATCH] wayland: Put Ecore_Wl2_Win instead of wl_surface into the engines We'll need to track some state in a common way, so attaching it to the window seems like a good idea. --- .../engines/wayland/ecore_evas_wayland_common.c | 10 +++++----- .../engines/wayland_common/Evas_Engine_Wayland.h | 2 +- src/modules/evas/engines/wayland_egl/evas_engine.c | 12 ++++++++---- src/modules/evas/engines/wayland_egl/evas_engine.h | 2 +- src/modules/evas/engines/wayland_egl/evas_wl_main.c | 9 ++++++--- src/modules/evas/engines/wayland_shm/evas_dmabuf.c | 2 +- src/modules/evas/engines/wayland_shm/evas_engine.c | 6 ++++-- src/modules/evas/engines/wayland_shm/evas_outbuf.c | 5 ++++- src/modules/evas/engines/wayland_shm/evas_shm.c | 2 +- 9 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index ad307edd51..51a55e417b 100644 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -136,7 +136,7 @@ _ee_display_unset(Ecore_Evas *ee) if (!einfo) return; einfo->info.wl_display = NULL; - einfo->info.wl_surface = NULL; + einfo->info.wl2_win = NULL; wdata = ee->engine.data; if (!strcmp(ee->driver, "wayland_egl")) @@ -1663,7 +1663,7 @@ _ecore_evas_wl_common_render_flush_pre(void *data, Evas *evas, void *event EINA_ einfo = (Evas_Engine_Info_Wayland *)evas_engine_info_get(evas); if (!einfo) return; - surf = einfo->info.wl_surface; + surf = ecore_wl2_window_surface_get(einfo->info.wl2_win); if (!surf) return; wdata = ee->engine.data; @@ -2018,7 +2018,7 @@ _ecore_evas_wl_common_show(Ecore_Evas *ee) einfo = (Evas_Engine_Info_Wayland *)evas_engine_info_get(ee->evas); if (einfo) { - einfo->info.wl_surface = ecore_wl2_window_surface_get(wdata->win); + einfo->info.wl2_win = wdata->win; einfo->info.hidden = wdata->win->pending.configure; //EINA_FALSE; einfo->www_avail = !!wdata->win->www_surface; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) @@ -2147,7 +2147,7 @@ _ee_cb_sync_done(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) ecore_wl2_display_compositor_version_get(wdata->display); einfo->info.destination_alpha = EINA_TRUE; einfo->info.rotation = ee->rotation; - einfo->info.wl_surface = ecore_wl2_window_surface_get(wdata->win); + einfo->info.wl2_win = wdata->win; if (wdata->reset_pending) { @@ -2447,7 +2447,7 @@ _ecore_evas_wl_common_new_internal(const char *disp_name, unsigned int parent, i einfo->info.destination_alpha = EINA_TRUE; einfo->info.rotation = ee->rotation; einfo->info.depth = 32; - einfo->info.wl_surface = ecore_wl2_window_surface_get(wdata->win); + einfo->info.wl2_win = wdata->win; einfo->info.wl_dmabuf = ecore_wl2_display_dmabuf_get(ewd); einfo->info.wl_shm = ecore_wl2_display_shm_get(ewd); einfo->info.compositor_version = diff --git a/src/modules/evas/engines/wayland_common/Evas_Engine_Wayland.h b/src/modules/evas/engines/wayland_common/Evas_Engine_Wayland.h index 4a3ca6b690..7be7e2e9c9 100644 --- a/src/modules/evas/engines/wayland_common/Evas_Engine_Wayland.h +++ b/src/modules/evas/engines/wayland_common/Evas_Engine_Wayland.h @@ -18,7 +18,7 @@ struct _Evas_Engine_Info_Wayland struct wl_shm *wl_shm; struct zwp_linux_dmabuf_v1 *wl_dmabuf; struct wl_display *wl_display; - struct wl_surface *wl_surface; + Ecore_Wl2_Window *wl2_win; int depth, rotation, edges; int compositor_version; Eina_Bool destination_alpha : 1; diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c b/src/modules/evas/engines/wayland_egl/evas_engine.c index 02766aaf1d..1e329836d4 100644 --- a/src/modules/evas/engines/wayland_egl/evas_engine.c +++ b/src/modules/evas/engines/wayland_egl/evas_engine.c @@ -279,11 +279,13 @@ evgl_eng_native_window_create(void *data) Render_Engine *re; Outbuf *ob; struct wl_egl_window *win; + struct wl_surface *wls; if (!(re = (Render_Engine *)data)) return NULL; if (!(ob = eng_get_ob(re))) return NULL; - if (!(win = wl_egl_window_create(ob->info->info.wl_surface, 1, 1))) + wls = ecore_wl2_window_surface_get(ob->info->info.wl2_win); + if (!(win = wl_egl_window_create(wls, 1, 1))) { ERR("Could not create wl_egl window"); return NULL; @@ -671,6 +673,7 @@ static int eng_update(void *engine EINA_UNUSED, void *data, void *info, unsigned int w, unsigned int h) { Evas_Engine_Info_Wayland *inf = info; + struct wl_surface *wls; Render_Engine *re = data; Outbuf *ob; @@ -689,13 +692,14 @@ eng_update(void *engine EINA_UNUSED, void *data, void *info, unsigned int w, uns return 1; } - if (!inf->info.wl_surface && (ob->egl_surface != EGL_NO_SURFACE)) + wls = ecore_wl2_window_surface_get(inf->info.wl2_win); + if (!wls && (ob->egl_surface != EGL_NO_SURFACE)) { eglDestroySurface(ob->egl_disp, ob->egl_surface); eglMakeCurrent(ob->egl_disp, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); ob->egl_surface = EGL_NO_SURFACE; - ob->surface = NULL; + ob->wl2_win = NULL; evas_render_engine_software_generic_update(&re->generic.software, NULL, w, h); return 1; @@ -705,7 +709,7 @@ eng_update(void *engine EINA_UNUSED, void *data, void *info, unsigned int w, uns { ob->info = inf; if ((ob->info->info.wl_display != ob->disp) || - (ob->info->info.wl_surface != ob->surface) || + (ob->info->info.wl2_win != ob->wl2_win) || /* FIXME: comment out below line. * since there is no place set the info->info.win for now, * it causes renew the window unnecessarily. diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.h b/src/modules/evas/engines/wayland_egl/evas_engine.h index 3d88285b1e..c25e072bce 100644 --- a/src/modules/evas/engines/wayland_egl/evas_engine.h +++ b/src/modules/evas/engines/wayland_egl/evas_engine.h @@ -57,7 +57,7 @@ struct _Outbuf { struct wl_display *disp; struct wl_egl_window *win; - struct wl_surface *surface; + Ecore_Wl2_Window *wl2_win; int w, h; int depth, screen, rot, alpha; diff --git a/src/modules/evas/engines/wayland_egl/evas_wl_main.c b/src/modules/evas/engines/wayland_egl/evas_wl_main.c index 90f3d403bf..9cfd52bba2 100644 --- a/src/modules/evas/engines/wayland_egl/evas_wl_main.c +++ b/src/modules/evas/engines/wayland_egl/evas_wl_main.c @@ -29,10 +29,10 @@ eng_window_new(Evas_Engine_Info_Wayland *einfo, int w, int h, Render_Engine_Swap gw->h = h; gw->swap_mode = swap_mode; gw->disp = einfo->info.wl_display; + gw->wl2_win = einfo->info.wl2_win; if (display && (display != gw->disp)) context = EGL_NO_CONTEXT; display = gw->disp; - gw->surface = einfo->info.wl_surface; gw->depth = einfo->info.depth; gw->alpha = einfo->info.destination_alpha; gw->rot = einfo->info.rotation; @@ -277,15 +277,18 @@ eng_window_unsurf(Outbuf *gw) void eng_window_resurf(Outbuf *gw) { + struct wl_surface *wls; + if (gw->surf) return; if (getenv("EVAS_GL_INFO")) printf("resurf %p\n", gw); if ((!gw->w) || (!gw->h)) return; if (!gw->win) { + wls = ecore_wl2_window_surface_get(gw->wl2_win); if ((gw->rot == 0) || (gw->rot == 180)) - gw->win = wl_egl_window_create(gw->surface, gw->w, gw->h); + gw->win = wl_egl_window_create(wls, gw->w, gw->h); else if ((gw->rot == 90) || (gw->rot == 270)) - gw->win = wl_egl_window_create(gw->surface, gw->h, gw->w); + gw->win = wl_egl_window_create(wls, gw->h, gw->w); } gw->egl_surface = diff --git a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c b/src/modules/evas/engines/wayland_shm/evas_dmabuf.c index ca253ce609..2bc5e7ba4a 100644 --- a/src/modules/evas/engines/wayland_shm/evas_dmabuf.c +++ b/src/modules/evas/engines/wayland_shm/evas_dmabuf.c @@ -788,7 +788,7 @@ _evas_dmabuf_surface_create(Surface *s, int w, int h, int num_buff) surf->surface = s; surf->wl_display = s->info->info.wl_display; surf->dmabuf = s->info->info.wl_dmabuf; - surf->wl_surface = s->info->info.wl_surface; + surf->wl_surface = ecore_wl2_window_surface_get(s->info->info.wl2_win); surf->alpha = s->info->info.destination_alpha; surf->compositor_version = s->info->info.compositor_version; diff --git a/src/modules/evas/engines/wayland_shm/evas_engine.c b/src/modules/evas/engines/wayland_shm/evas_engine.c index a5f72c50db..14c1ede348 100644 --- a/src/modules/evas/engines/wayland_shm/evas_engine.c +++ b/src/modules/evas/engines/wayland_shm/evas_engine.c @@ -175,10 +175,12 @@ eng_update(void *engine, void *data, void *info, unsigned int w, unsigned int h) { Evas_Engine_Info_Wayland *einfo = info; Render_Engine *re = data; + struct wl_surface *surf; - if (!einfo->info.wl_surface) return 0; + surf = ecore_wl2_window_surface_get(einfo->info.wl2_win); + if (!surf) return 0; - _evas_outbuf_surface_set(re->generic.ob, einfo->info.wl_shm, einfo->info.wl_dmabuf, einfo->info.wl_surface); + _evas_outbuf_surface_set(re->generic.ob, einfo->info.wl_shm, einfo->info.wl_dmabuf, surf); eng_output_resize(engine, data, w, h); diff --git a/src/modules/evas/engines/wayland_shm/evas_outbuf.c b/src/modules/evas/engines/wayland_shm/evas_outbuf.c index b76efadca1..7aed71f450 100644 --- a/src/modules/evas/engines/wayland_shm/evas_outbuf.c +++ b/src/modules/evas/engines/wayland_shm/evas_outbuf.c @@ -639,8 +639,11 @@ _evas_outbuf_update_region_free(Outbuf *ob EINA_UNUSED, RGBA_Image *update EINA_ void _evas_outbuf_redraws_clear(Outbuf *ob) { + struct wl_surface *wls; + if (!ob->priv.rect_count) return; - if (ob->info->info.wl_surface) + wls = ecore_wl2_window_surface_get(ob->info->info.wl2_win); + if (wls) ob->surface->funcs.post(ob->surface, ob->priv.rects, ob->priv.rect_count, ob->hidden); free(ob->priv.rects); ob->priv.rect_count = 0; diff --git a/src/modules/evas/engines/wayland_shm/evas_shm.c b/src/modules/evas/engines/wayland_shm/evas_shm.c index 28feb3fdbd..df08f90dfa 100644 --- a/src/modules/evas/engines/wayland_shm/evas_shm.c +++ b/src/modules/evas/engines/wayland_shm/evas_shm.c @@ -596,7 +596,7 @@ _evas_shm_surface_create(Surface *s, int w, int h, int num_buff) surf->h = h; surf->disp = s->info->info.wl_display; surf->shm = s->info->info.wl_shm; - surf->surface = s->info->info.wl_surface; + surf->surface = ecore_wl2_window_surface_get(s->info->info.wl2_win); surf->num_buff = num_buff; surf->alpha = s->info->info.destination_alpha; surf->compositor_version = s->info->info.compositor_version;