evas: add native surface with TBM Surface for wayland_shm engine

Summary: @feature  add evas object image's native surface with TBM surface for wayland_shm

Test Plan: Making tbm test sample and testing on Tizen Device/Emulator

Reviewers: raster, cedric, spacegrapher, jpeg

Reviewed By: spacegrapher

Subscribers: mer.kim, JoogabYun, scholb.kim, dkdk

Differential Revision: https://phab.enlightenment.org/D3618

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
Wonsik Jung 2016-02-05 07:50:22 +01:00 committed by Cedric BAIL
parent d576c4f3e8
commit 02d724e716
1 changed files with 91 additions and 0 deletions

View File

@ -5,6 +5,11 @@
#endif
#include "evas_engine.h"
#include "../software_generic/evas_native_common.h"
#ifdef HAVE_DLSYM
# include <dlfcn.h>
#endif
/* logging domain variable */
int _evas_engine_way_shm_log_dom = -1;
@ -12,6 +17,8 @@ int _evas_engine_way_shm_log_dom = -1;
/* evas function tables - filled in later (func and parent func) */
static Evas_Func func, pfunc;
Evas_Native_Tbm_Surface_Image_Set_Call glsym_evas_native_tbm_surface_image_set = NULL;
/* engine structure data */
typedef struct _Render_Engine Render_Engine;
struct _Render_Engine
@ -77,6 +84,22 @@ err:
return NULL;
}
static void
_symbols(void)
{
static int done = 0;
if (done) return;
#define LINK2GENERIC(sym) \
glsym_##sym = dlsym(RTLD_DEFAULT, #sym);
// Get function pointer to native_common that is now provided through the link of SW_Generic.
LINK2GENERIC(evas_native_tbm_surface_image_set);
done = 1;
}
/* ENGINE API FUNCTIONS WE PROVIDE */
static void *
eng_info(Evas *eo_evas EINA_UNUSED)
@ -242,6 +265,71 @@ eng_output_resize(void *data, int w, int h)
re->generic.h = h;
}
static void *
eng_image_native_set(void *data EINA_UNUSED, void *image, void *native)
{
Evas_Native_Surface *ns = native;
Image_Entry *ie = image;
RGBA_Image *im = image, *im2;
if (!im || !ns) return im;
if (ns->type == EVAS_NATIVE_SURFACE_TBM)
{
if (im->native.data)
{
//image have native surface already
Evas_Native_Surface *ens = im->native.data;
if ((ens->type == ns->type) &&
(ens->data.tbm.buffer == ns->data.tbm.buffer))
return im;
}
}
if ((ns->type == EVAS_NATIVE_SURFACE_OPENGL) &&
(ns->version == EVAS_NATIVE_SURFACE_VERSION))
im2 = evas_cache_image_data(evas_common_image_cache_get(),
ie->w, ie->h,
ns->data.x11.visual, 1,
EVAS_COLORSPACE_ARGB8888);
else
im2 = evas_cache_image_data(evas_common_image_cache_get(),
ie->w, ie->h,
NULL, 1,
EVAS_COLORSPACE_ARGB8888);
if (im->native.data)
{
if (im->native.func.free)
im->native.func.free(im->native.func.data, im);
}
#ifdef EVAS_CSERVE2
if (evas_cserve2_use_get() && evas_cache2_image_cached(ie))
evas_cache2_image_close(ie);
else
#endif
evas_cache_image_drop(ie);
im = im2;
if (ns->type == EVAS_NATIVE_SURFACE_TBM)
return glsym_evas_native_tbm_surface_image_set(NULL, im, ns);
return im;
}
static void *
eng_image_native_get(void *data EINA_UNUSED, void *image)
{
RGBA_Image *im = image;
Native *n;
if (!im) return NULL;
n = im->native.data;
if (!n) return NULL;
return &(n->ns);
}
/* EVAS MODULE FUNCTIONS */
static int
module_open(Evas_Module *em)
@ -273,7 +361,10 @@ module_open(Evas_Module *em)
ORD(setup);
ORD(output_free);
ORD(output_resize);
ORD(image_native_set);
ORD(image_native_get);
_symbols();
/* advertise our own engine functions */
em->functions = (void *)(&func);