discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=ae6416c27c33af877ec9ad6f860987414e4cf1e1
commit ae6416c27c33af877ec9ad6f860987414e4cf1e1 Author: Mike Blumenkrantz <zm...@osg.samsung.com> Date: Mon Nov 2 16:23:20 2015 -0500 add wayland egl client support definitely not a feature, I promiseā¢ --- src/bin/e_comp_wl.c | 47 +++++++++++++++++++++++++++++++++++++++++++---- src/bin/e_comp_wl.h | 11 ++++++----- src/bin/e_pixmap.c | 47 ++++++++++++++++++++++------------------------- 3 files changed, 71 insertions(+), 34 deletions(-) diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 8e774db..5fef8a8 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -11,6 +11,13 @@ E_API int E_EVENT_WAYLAND_GLOBAL_ADD = -1; #include "session-recovery-server-protocol.h" +#ifndef EGL_HEIGHT +# define EGL_HEIGHT 0x3056 +#endif +#ifndef EGL_WIDTH +# define EGL_WIDTH 0x3057 +#endif + /* Resource Data Mapping: (wl_resource_get_user_data) * * wl_surface == e_pixmap @@ -2638,6 +2645,20 @@ _e_comp_wl_desklock_hide(void) e_comp_ungrab_input(1, 1); } +static void +_e_comp_wl_gl_init(void *d EINA_UNUSED) +{ + e_comp_wl->wl.gl = evas_gl_new(e_comp->evas); + e_comp->gl = !!e_comp_wl->wl.gl; + if (!e_comp->gl) return; + e_comp_wl->wl.glctx = evas_gl_context_create(e_comp_wl->wl.gl, NULL); + e_comp_wl->wl.glcfg = evas_gl_config_new(); + e_comp_wl->wl.glsfc = evas_gl_surface_create(e_comp_wl->wl.gl, e_comp_wl->wl.glcfg, 1, 1); + evas_gl_make_current(e_comp_wl->wl.gl, e_comp_wl->wl.glsfc, e_comp_wl->wl.glctx); + e_comp_wl->wl.glapi = evas_gl_context_api_get(e_comp_wl->wl.gl, e_comp_wl->wl.glctx); + e_comp_wl->wl.glapi->evasglBindWaylandDisplay(e_comp_wl->wl.gl, e_comp_wl->wl.disp); +} + /* public functions */ /** @@ -2682,6 +2703,8 @@ e_comp_wl_init(void) elm_config_preferred_engine_set("wayland_shm"); } e_util_env_set("ELM_DISPLAY", "wl"); + if (e_comp_gl_get()) + ecore_job_add(_e_comp_wl_gl_init, NULL); E_LIST_HANDLER_APPEND(handlers, E_EVENT_RANDR_CHANGE, _e_comp_wl_cb_randr_change, NULL); @@ -2751,6 +2774,14 @@ e_comp_wl_shutdown(void) free(global); } if (e_comp_wl->wl.shm) wl_shm_destroy(e_comp_wl->wl.shm); + if (e_comp->gl) + { + e_comp_wl->wl.glapi->evasglUnbindWaylandDisplay(e_comp_wl->wl.gl, e_comp_wl->wl.disp); + evas_gl_surface_destroy(e_comp_wl->wl.gl, e_comp_wl->wl.glsfc); + evas_gl_context_destroy(e_comp_wl->wl.gl, e_comp_wl->wl.glctx); + evas_gl_free(e_comp_wl->wl.gl); + evas_gl_config_free(e_comp_wl->wl.glcfg); + } /* shutdown ecore_wayland */ ecore_wl_shutdown(); @@ -2902,11 +2933,19 @@ e_comp_wl_buffer_get(struct wl_resource *resource) if (listener) return container_of(listener, E_Comp_Wl_Buffer, destroy_listener); - if (!(shmbuff = wl_shm_buffer_get(resource))) return NULL; if (!(buffer = E_NEW(E_Comp_Wl_Buffer, 1))) return NULL; - - buffer->w = wl_shm_buffer_get_width(shmbuff); - buffer->h = wl_shm_buffer_get_height(shmbuff); + shmbuff = wl_shm_buffer_get(resource); + if (shmbuff) + { + buffer->w = wl_shm_buffer_get_width(shmbuff); + buffer->h = wl_shm_buffer_get_height(shmbuff); + } + else if (e_comp->gl) + { + e_comp_wl->wl.glapi->evasglQueryWaylandBuffer(e_comp_wl->wl.gl, resource, EGL_WIDTH, &buffer->w); + e_comp_wl->wl.glapi->evasglQueryWaylandBuffer(e_comp_wl->wl.gl, resource, EGL_HEIGHT, &buffer->h); + } + buffer->shm_buffer = shmbuff; buffer->resource = resource; wl_signal_init(&buffer->destroy_signal); diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index 0a6b738..7142f4d 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -55,11 +55,7 @@ struct _E_Comp_Wl_Buffer struct wl_resource *resource; struct wl_signal destroy_signal; struct wl_listener destroy_listener; - union - { - struct wl_shm_buffer *shm_buffer; - void *legacy_buffer; - }; + struct wl_shm_buffer *shm_buffer; int32_t w, h; uint32_t busy; }; @@ -109,6 +105,11 @@ struct _E_Comp_Wl_Data struct wl_event_loop *loop; Eina_Inlist *globals; // only used for nested wl compositors struct wl_shm *shm; // only used for nested wl compositors + Evas_GL *gl; + Evas_GL_Config *glcfg; + Evas_GL_Context *glctx; + Evas_GL_Surface *glsfc; + Evas_GL_API *glapi; } wl; struct diff --git a/src/bin/e_pixmap.c b/src/bin/e_pixmap.c index 178c00c..8837bce 100644 --- a/src/bin/e_pixmap.c +++ b/src/bin/e_pixmap.c @@ -2,6 +2,12 @@ #ifdef HAVE_WAYLAND # include "e_comp_wl.h" +# ifndef EGL_TEXTURE_FORMAT +# define EGL_TEXTURE_FORMAT 0x3080 +# endif +# ifndef EGL_TEXTURE_RGBA +# define EGL_TEXTURE_RGBA 0x305E +# endif #endif #ifndef HAVE_WAYLAND_ONLY # include "e_comp_x.h" @@ -404,25 +410,25 @@ e_pixmap_refresh(E_Pixmap *cp) { E_Comp_Wl_Buffer *buffer = cp->buffer; struct wl_shm_buffer *shm_buffer; + int format; cp->w = cp->h = 0; cp->image_argb = EINA_FALSE; if (!buffer) return EINA_FALSE; - shm_buffer = wl_shm_buffer_get(buffer->resource); - if (!shm_buffer) - { - WRN("Cannot get shm buffer from buffer resource"); - return EINA_FALSE; - } - + shm_buffer = buffer->shm_buffer; cp->w = buffer->w; cp->h = buffer->h; - switch (wl_shm_buffer_get_format(shm_buffer)) + if (shm_buffer) + format = wl_shm_buffer_get_format(shm_buffer); + else + e_comp_wl->wl.glapi->evasglQueryWaylandBuffer(e_comp_wl->wl.gl, buffer->resource, EGL_TEXTURE_FORMAT, &format); + switch (format) { case WL_SHM_FORMAT_ARGB8888: + case EGL_TEXTURE_RGBA: cp->image_argb = EINA_TRUE; break; default: @@ -574,15 +580,10 @@ e_pixmap_native_surface_init(E_Pixmap *cp, Evas_Native_Surface *ns) break; case E_PIXMAP_TYPE_WL: #ifdef HAVE_WAYLAND - ns->type = EVAS_NATIVE_SURFACE_OPENGL; + ns->type = EVAS_NATIVE_SURFACE_WL; ns->version = EVAS_NATIVE_SURFACE_VERSION; - ns->data.opengl.texture_id = 0; - ns->data.opengl.framebuffer_id = 0; - ns->data.opengl.x = 0; - ns->data.opengl.y = 0; - ns->data.opengl.w = cp->w; - ns->data.opengl.h = cp->h; - ret = EINA_TRUE; + ns->data.wl.legacy_buffer = cp->buffer->resource; + ret = !cp->buffer->shm_buffer; #endif break; default: @@ -690,12 +691,7 @@ e_pixmap_image_refresh(E_Pixmap *cp) E_Comp_Wl_Buffer *buffer = cp->buffer; struct wl_shm_buffer *shm_buffer; - shm_buffer = wl_shm_buffer_get(buffer->resource); - if (!shm_buffer) - { - WRN("Cannot get shm buffer from buffer resource"); - return EINA_FALSE; - } + shm_buffer = buffer->shm_buffer; if (cp->buffer_ref.buffer && (cp->buffer_ref.buffer != buffer)) { /* FIXME: wtf? */ @@ -711,7 +707,8 @@ e_pixmap_image_refresh(E_Pixmap *cp) cp->buffer_destroy_listener.notify = _e_pixmap_cb_buffer_destroy; wl_signal_add(&buffer->destroy_signal, &cp->buffer_destroy_listener); - cp->data = wl_shm_buffer_get_data(shm_buffer); + if (shm_buffer) + cp->data = wl_shm_buffer_get_data(shm_buffer); return EINA_TRUE; } #endif @@ -733,7 +730,7 @@ e_pixmap_image_exists(const E_Pixmap *cp) return !!cp->image; #endif #ifdef HAVE_WAYLAND - return !!cp->data; /* FIXME: egl */ + return (!!cp->data) || (e_comp->gl && (!cp->buffer->shm_buffer)); #endif return EINA_FALSE; @@ -811,7 +808,7 @@ e_pixmap_image_data_argb_convert(E_Pixmap *cp, void *pix, void *ipix, Eina_Recta int i, x, y; unsigned int *src, *dst; - shm_buffer = wl_shm_buffer_get(cp->buffer_ref.buffer->resource); + shm_buffer = cp->buffer_ref.buffer->shm_buffer; if (!shm_buffer) return EINA_FALSE; format = wl_shm_buffer_get_format(shm_buffer); --