diff options
Diffstat (limited to 'src/modules/evas')
9 files changed, 248 insertions, 11 deletions
diff --git a/src/modules/evas/engines/gl_drm/evas_engine.c b/src/modules/evas/engines/gl_drm/evas_engine.c index a8261448fc..3973a5f326 100644 --- a/src/modules/evas/engines/gl_drm/evas_engine.c +++ b/src/modules/evas/engines/gl_drm/evas_engine.c @@ -1012,6 +1012,34 @@ eng_output_dump(void *data) _re_winfree(re); } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { + case EVAS_NATIVE_SURFACE_OPENGL: + case EVAS_NATIVE_SURFACE_WL: + return 1; + default: + ERR("Native surface type %d not supported!", type); + return 0; + } +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { + case EVAS_NATIVE_SURFACE_OPENGL: + case EVAS_NATIVE_SURFACE_WL: + return; + default: + ERR("Native surface type %d not supported!", type); + return; + } +} + static void * eng_image_native_set(void *data, void *image, void *native) { @@ -1270,6 +1298,8 @@ module_open(Evas_Module *em) EVAS_API_OVERRIDE(output_free, &func, eng_); EVAS_API_OVERRIDE(output_dump, &func, eng_); EVAS_API_OVERRIDE(image_native_set, &func, eng_); + EVAS_API_OVERRIDE(image_native_init, &func, eng_); + EVAS_API_OVERRIDE(image_native_shutdown, &func, eng_); /* Mesa's EGL driver loads wayland egl by default. (called by eglGetProcaddr() ) * implicit env set (EGL_PLATFORM=drm) prevent that. */ diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index d296cf660e..11f9581ac7 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -373,6 +373,32 @@ _native_free_cb(void *data, void *image) free(n); } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { + case EVAS_NATIVE_SURFACE_OPENGL: + return 1; + default: + ERR("Native surface type %d not supported!", type); + return 0; + } +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { + case EVAS_NATIVE_SURFACE_OPENGL: + return; + default: + ERR("Native surface type %d not supported!", type); + return; + } +} + static void * eng_image_native_set(void *data, void *image, void *native) { @@ -2816,6 +2842,8 @@ module_open(Evas_Module *em) ORD(image_colorspace_get); ORD(image_file_colorspace_get); ORD(image_can_region_get); + ORD(image_native_init); + ORD(image_native_shutdown); ORD(image_native_set); ORD(image_native_get); diff --git a/src/modules/evas/engines/gl_x11/evas_engine.c b/src/modules/evas/engines/gl_x11/evas_engine.c index 8524d495fe..e48dea03a0 100644 --- a/src/modules/evas/engines/gl_x11/evas_engine.c +++ b/src/modules/evas/engines/gl_x11/evas_engine.c @@ -2309,6 +2309,52 @@ _native_yinvert_cb(void *data, void *image) return yinvert; } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { +#ifdef GL_GLES + case EVAS_NATIVE_SURFACE_TBM: + return _evas_native_tbm_init(); +#endif + case EVAS_NATIVE_SURFACE_X11: + case EVAS_NATIVE_SURFACE_OPENGL: + case EVAS_NATIVE_SURFACE_EVASGL: + return 1; +#if defined(GL_GLES) && defined(HAVE_WAYLAND) + case EVAS_NATIVE_SURFACE_WL: + return (glsym_eglQueryWaylandBufferWL != NULL) ? 1 : 0; +#endif + default: + ERR("Native surface type %d not supported!", type); + return 0; + } +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { +#ifdef GL_GLES + case EVAS_NATIVE_SURFACE_TBM: + _evas_native_tbm_shutdown(); + return; +#endif + case EVAS_NATIVE_SURFACE_X11: + case EVAS_NATIVE_SURFACE_OPENGL: + case EVAS_NATIVE_SURFACE_EVASGL: +#if defined(GL_GLES) && defined(HAVE_WAYLAND) + case EVAS_NATIVE_SURFACE_WL: +#endif + return; + default: + ERR("Native surface type %d not supported!", type); + return; + } +} + static void * eng_image_native_set(void *data, void *image, void *native) { @@ -3015,6 +3061,8 @@ module_open(Evas_Module *em) ORD(output_free); ORD(output_dump); + ORD(image_native_init); + ORD(image_native_shutdown); ORD(image_native_set); ORD(gl_error_get); diff --git a/src/modules/evas/engines/software_generic/evas_engine.c b/src/modules/evas/engines/software_generic/evas_engine.c index f2018a626b..c28872cf0b 100644 --- a/src/modules/evas/engines/software_generic/evas_engine.c +++ b/src/modules/evas/engines/software_generic/evas_engine.c @@ -26,6 +26,7 @@ #endif #include "Evas_Engine_Software_Generic.h" +#include "evas_native_common.h" #ifdef EVAS_GL //----------------------------------// @@ -1113,6 +1114,25 @@ eng_image_colorspace_set(void *data EINA_UNUSED, void *image, Evas_Colorspace cs evas_cache_image_colorspace(im, cspace); } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + if (type == EVAS_NATIVE_SURFACE_TBM) + return _evas_native_tbm_init(); + + ERR("Native surface type %d not supported!", type); + return 0; +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + if (type == EVAS_NATIVE_SURFACE_TBM) + _evas_native_tbm_shutdown(); + else + ERR("Native surface type %d not supported!", type); +} + static void * eng_image_native_set(void *data EINA_UNUSED, void *image, void *native) { @@ -4124,6 +4144,8 @@ static Evas_Func func = eng_image_colorspace_get, eng_image_file_colorspace_get, eng_image_can_region_get, + eng_image_native_init, + eng_image_native_shutdown, eng_image_native_set, eng_image_native_get, /* image cache funcs */ diff --git a/src/modules/evas/engines/software_generic/evas_native_common.h b/src/modules/evas/engines/software_generic/evas_native_common.h index 0ff0b7437d..0ea2b66862 100644 --- a/src/modules/evas/engines/software_generic/evas_native_common.h +++ b/src/modules/evas/engines/software_generic/evas_native_common.h @@ -75,7 +75,9 @@ struct _Native } ns_data; /**< Choose one union data according to your surface in Evas Engine. */ }; -EAPI void * evas_native_tbm_surface_image_set(void *data, void *image, void *native); +EAPI void *_evas_native_tbm_surface_image_set(void *data, void *image, void *native); +EAPI int _evas_native_tbm_init(void); +EAPI void _evas_native_tbm_shutdown(void); typedef void *(*Evas_Native_Tbm_Surface_Image_Set_Call)(void *data, void *image, void *native); diff --git a/src/modules/evas/engines/software_generic/evas_native_tbm.c b/src/modules/evas/engines/software_generic/evas_native_tbm.c index b6931a99f3..c046422a7d 100644 --- a/src/modules/evas/engines/software_generic/evas_native_tbm.c +++ b/src/modules/evas/engines/software_generic/evas_native_tbm.c @@ -67,13 +67,13 @@ typedef struct _tbm_surface_info static int (*sym_tbm_surface_map) (tbm_surface_h surface, int opt, tbm_surface_info_s *info) = NULL; static int (*sym_tbm_surface_unmap) (tbm_surface_h surface) = NULL; -static Eina_Bool -tbm_init(void) +EAPI int +_evas_native_tbm_init(void) { if (tbm_lib) { tbm_ref++; - return EINA_TRUE; + return tbm_ref; } const char *tbm_libs[] = @@ -108,14 +108,14 @@ tbm_init(void) else break; } } - if (!tbm_lib) return EINA_FALSE; + if (!tbm_lib) return 0; tbm_ref++; - return EINA_TRUE; + return tbm_ref; } -static void -tbm_shutdown(void) +EAPI void +_evas_native_tbm_shutdown(void) { if (tbm_ref > 0) { @@ -254,11 +254,11 @@ _native_free_cb(void *data EINA_UNUSED, void *image) free(n); - tbm_shutdown(); + _evas_native_tbm_shutdown(); } EAPI void * -evas_native_tbm_surface_image_set(void *data EINA_UNUSED, void *image, void *native) +_evas_native_tbm_surface_image_set(void *data EINA_UNUSED, void *image, void *native) { Evas_Native_Surface *ns = native; RGBA_Image *im = image; @@ -279,7 +279,7 @@ evas_native_tbm_surface_image_set(void *data EINA_UNUSED, void *image, void *nat tbm_surf = ns->data.tbm.buffer; - if (!tbm_init()) + if (!_evas_native_tbm_init()) { ERR("Could not initialize TBM!"); return NULL; diff --git a/src/modules/evas/engines/software_x11/evas_engine.c b/src/modules/evas/engines/software_x11/evas_engine.c index b6dc615f48..8f68d43f6e 100644 --- a/src/modules/evas/engines/software_x11/evas_engine.c +++ b/src/modules/evas/engines/software_x11/evas_engine.c @@ -671,6 +671,43 @@ _native_evasgl_free(void *data EINA_UNUSED, void *image) free(n); } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { +#ifdef GL_GLES + case EVAS_NATIVE_SURFACE_TBM: + return _evas_native_tbm_init(); +#endif + case EVAS_NATIVE_SURFACE_X11: + case EVAS_NATIVE_SURFACE_EVASGL: + return 1; + default: + ERR("Native surface type %d not supported!", type); + return 0; + } +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { +#ifdef GL_GLES + case EVAS_NATIVE_SURFACE_TBM: + _evas_native_tbm_shutdown(); + return; +#endif + case EVAS_NATIVE_SURFACE_X11: + case EVAS_NATIVE_SURFACE_OPENGL: + return; + default: + ERR("Native surface type %d not supported!", type); + return; + } +} + static void * eng_image_native_set(void *data EINA_UNUSED, void *image, void *native) { @@ -817,6 +854,8 @@ module_open(Evas_Module *em) ORD(setup); ORD(canvas_alpha_get); ORD(output_free); + ORD(image_native_init); + ORD(image_native_shutdown); ORD(image_native_set); ORD(image_native_get); diff --git a/src/modules/evas/engines/wayland_egl/evas_engine.c b/src/modules/evas/engines/wayland_egl/evas_engine.c index 4e7674d2ee..a33c904095 100644 --- a/src/modules/evas/engines/wayland_egl/evas_engine.c +++ b/src/modules/evas/engines/wayland_egl/evas_engine.c @@ -992,6 +992,45 @@ _native_cb_yinvert(void *data EINA_UNUSED, void *image) return yinvert; } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { +#ifdef GL_GLES + case EVAS_NATIVE_SURFACE_TBM: + return _evas_native_tbm_init(); +#endif + case EVAS_NATIVE_SURFACE_EVASGL: + case EVAS_NATIVE_SURFACE_OPENGL: + case EVAS_NATIVE_SURFACE_WL: + return 1; + default: + ERR("Native surface type %d not supported!", type); + return 0; + } +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { +#ifdef GL_GLES + case EVAS_NATIVE_SURFACE_TBM: + _evas_native_tbm_shutdown(); + return; +#endif + case EVAS_NATIVE_SURFACE_EVASGL: + case EVAS_NATIVE_SURFACE_OPENGL: + case EVAS_NATIVE_SURFACE_WL: + return; + default: + ERR("Native surface type %d not supported!", type); + return; + } +} + static void * eng_image_native_set(void *data, void *image, void *native) { diff --git a/src/modules/evas/engines/wayland_shm/evas_engine.c b/src/modules/evas/engines/wayland_shm/evas_engine.c index 5f1f78aab9..adf33f68b0 100644 --- a/src/modules/evas/engines/wayland_shm/evas_engine.c +++ b/src/modules/evas/engines/wayland_shm/evas_engine.c @@ -265,6 +265,33 @@ eng_output_resize(void *data, int w, int h) re->generic.h = h; } +static int +eng_image_native_init(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { + case EVAS_NATIVE_SURFACE_TBM: + return _evas_native_tbm_init(); + default: + ERR("Native surface type %d not supported!", type); + return 0; + } +} + +static void +eng_image_native_shutdown(void *data EINA_UNUSED, Evas_Native_Surface_Type type) +{ + switch (type) + { + case EVAS_NATIVE_SURFACE_TBM: + _evas_native_tbm_shutdown(); + return; + default: + ERR("Native surface type %d not supported!", type); + return; + } +} + static void * eng_image_native_set(void *data EINA_UNUSED, void *image, void *native) { @@ -287,6 +314,8 @@ eng_image_native_set(void *data EINA_UNUSED, void *image, void *native) } } + /* FIXME: WTF is this? OPENGL supported here? uh? and x11.visual used??? + * It looks like this code needs to fail and return NULL. */ if ((ns->type == EVAS_NATIVE_SURFACE_OPENGL) && (ns->version == EVAS_NATIVE_SURFACE_VERSION)) im2 = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), |