diff options
author | Cedric BAIL <cedric@osg.samsung.com> | 2015-03-01 20:36:21 +0100 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2015-03-01 20:36:21 +0100 |
commit | 05cbcec8c3dc15d91b5c64ac60baebd4828794da (patch) | |
tree | 3f5a05a350dae4dec31fe7a2d6c447659a7b47d1 | |
parent | 2d7e4dbd608abc1929fc71f19a3ad47045a04398 (diff) | |
download | efl-devs/cedric/evas3d.tar.gz |
evas: remove the intermediate Evas_GL_Image.devs/cedric/evas3d
There is still an issue, as the image are loaded from a texture atlas, their
x, y coordinate need to be taken into account. It is not the case in this patch.
-rw-r--r-- | src/lib/evas/canvas/evas_3d_texture.c | 72 | ||||
-rw-r--r-- | src/lib/evas/include/evas_private.h | 4 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_3d.c | 21 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_3d_common.h | 3 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_3d_private.h | 1 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/gl_generic/evas_engine.c | 11 |
7 files changed, 47 insertions, 67 deletions
diff --git a/src/lib/evas/canvas/evas_3d_texture.c b/src/lib/evas/canvas/evas_3d_texture.c index efb845a9e7..ca08bcccf5 100644 --- a/src/lib/evas/canvas/evas_3d_texture.c +++ b/src/lib/evas/canvas/evas_3d_texture.c @@ -4,30 +4,6 @@ #define MY_CLASS EVAS_3D_TEXTURE_CLASS static inline void -_put_image_to_surface(Evas_Public_Data *e, Evas_3D_Texture_Data *pd, int w, int h, void *image) -{ - void *ctx = NULL; - if (pd->surface) - { - e->engine.func->image_map_surface_free(e->engine.data.output, - pd->surface); - pd->surface = NULL; - } - - pd->surface = e->engine.func->image_map_surface_new(e->engine.data.output, w, h, 1); - if (!pd->surface) - { - ERR("Can't create new surface"); - return; - } - ctx = e->engine.func->context_new(e->engine.data.output); - e->engine.func->image_draw(e->engine.data.output, ctx, - pd->surface, image, - 0, 0, w, h, 0, 0, w, h, 0, EINA_FALSE); - e->engine.func->context_free(e->engine.data.output, ctx); -} - -static inline void _texture_proxy_set(Evas_3D_Texture *texture, Evas_Object *eo_src, Evas_Object_Protected_Data *src) { Evas_3D_Texture_Data *pd = eo_data_scope_get(texture, MY_CLASS); @@ -77,12 +53,6 @@ _texture_unset(Evas_3D_Texture *obj) EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_src); pd->source = NULL; } - if (pd->surface) - { - e->engine.func->image_map_surface_free(e->engine.data.output, - pd->surface); - pd->surface = NULL; - } e->engine.func->texture_free(e->engine.data.output, pd->engine_data); pd->engine_data = NULL; } @@ -195,16 +165,13 @@ _texture_proxy_subrender(Evas_3D_Texture *obj) static void _texture_fini(Evas_3D_Texture *obj) { - Eo *evas = NULL; int i = 0; Eina_Iterator *it = NULL; void *data = NULL; Evas_3D_Material_Data *material = NULL; Evas_3D_Texture_Data *pd; - eo_do(obj, evas = evas_common_evas_get()); pd = eo_data_scope_get(obj, MY_CLASS); - if (pd->materials) { it = eina_hash_iterator_key_new(pd->materials); @@ -336,11 +303,11 @@ _evas_3d_texture_eo_base_destructor(Eo *obj, Evas_3D_Texture_Data *pd EINA_UNUS } EOLIAN static void -_evas_3d_texture_data_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_Colorspace color_format, +_evas_3d_texture_data_set(Eo *obj, Evas_3D_Texture_Data *pd, + Evas_Colorspace color_format, int w, int h, const void *data) { Eo *evas = NULL; - void *ctx = NULL; void *image = NULL; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); @@ -352,26 +319,19 @@ _evas_3d_texture_data_set(Eo *obj, Evas_3D_Texture_Data *pd, Evas_Colorspace col ERR("Failure, image data is empty"); return; } - else - image = e->engine.func->image_new_from_data(e->engine.data.output, w, h, (DATA32 *)data, EINA_TRUE, color_format); + image = e->engine.func->image_new_from_data(e->engine.data.output, w, h, (DATA32 *)data, EINA_TRUE, color_format); if (!image) { ERR("Can't load image from data"); return; } - _put_image_to_surface(e, pd, w, h, image); - if (e->engine.func->texture_image_set) e->engine.func->texture_image_set(e->engine.data.output, pd->engine_data, - pd->surface); - if (image) - { - e->engine.func->image_free(e->engine.data.output, image); - } - + image); + e->engine.func->image_free(e->engine.data.output, image); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); } @@ -382,9 +342,7 @@ _evas_3d_texture_file_set(Eo *obj, Evas_3D_Texture_Data *pd, const char *file, c Evas_Image_Load_Opts lo; int load_error; Eo *evas = NULL; - void *ctx; void *image; - int imagew, imageh; eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); @@ -400,19 +358,13 @@ _evas_3d_texture_file_set(Eo *obj, Evas_3D_Texture_Data *pd, const char *file, c ERR("Can't load image from file"); return; } - e->engine.func->image_size_get(e->engine.data.output, image, - &imagew, &imageh); - - _put_image_to_surface(e, pd, imagew, imageh, image); if (e->engine.func->texture_image_set) e->engine.func->texture_image_set(e->engine.data.output, pd->engine_data, - pd->surface); - if (image) - { - e->engine.func->image_free(e->engine.data.output, image); - } + image); + + e->engine.func->image_free(e->engine.data.output, image); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_TEXTURE_DATA, NULL)); } @@ -500,9 +452,13 @@ _evas_3d_texture_color_format_get(Eo *obj EINA_UNUSED, Evas_3D_Texture_Data *pd) eo_do(obj, evas = evas_common_evas_get()); Evas_Public_Data *e = eo_data_scope_get(evas, EVAS_CANVAS_CLASS); - if (pd->surface && e->engine.func->image_colorspace_get) + if (e->engine.func->image_colorspace_get && + e->engine.func->texture_image_get) { - format = e->engine.func->image_colorspace_get(e->engine.data.output, pd->surface); + void *image; + + image = e->engine.func->texture_image_get(e->engine.data.output, pd->engine_data); + format = e->engine.func->image_colorspace_get(e->engine.data.output, image); } return format; diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index ed90c1b390..af719cb521 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -359,9 +359,6 @@ struct _Evas_3D_Texture /* Proxy data. */ Evas_Object *source; - /* Evas_GL_Image */ - void *surface; - /* Engine-side object. */ void *engine_data; }; @@ -1352,6 +1349,7 @@ struct _Evas_Func void (*texture_filter_set) (void *data, void *texture, Evas_3D_Texture_Filter min, Evas_3D_Texture_Filter mag); void (*texture_filter_get) (void *data, void *texture, Evas_3D_Texture_Filter *min, Evas_3D_Texture_Filter *mag); void (*texture_image_set) (void *data, void *texture, void *image); + void *(*texture_image_get) (void *data, void *texture); }; struct _Evas_Image_Save_Func diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d.c b/src/modules/evas/engines/gl_common/evas_gl_3d.c index 82317d0dac..80802b1cd1 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c @@ -67,6 +67,11 @@ e3d_texture_new(void) void e3d_texture_free(E3D_Texture *texture) { + if (texture) + { + if (texture->surface) + evas_gl_common_image_unref(texture->surface); + } free(texture); } @@ -78,12 +83,26 @@ e3d_texture_size_get(const E3D_Texture *texture, int *w, int *h) } void -e3d_texture_set(E3D_Texture *texture, Evas_GL_Image *im) +e3d_texture_set(Evas_Engine_GL_Context *gc, + E3D_Texture *texture, + Evas_GL_Image *im) { texture->surface = im; + evas_gl_common_image_ref(im); + + evas_gl_common_image_update(gc, im); + texture->tex = im->tex->pt->texture; texture->w = im->w; texture->h = im->h; + texture->x = im->tex->x; + texture->y = im->tex->y; +} + +Evas_GL_Image * +e3d_texture_get(E3D_Texture *texture) +{ + return texture ? texture->surface : NULL; } static inline GLenum diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_common.h b/src/modules/evas/engines/gl_common/evas_gl_3d_common.h index 2e6d668691..8331316dad 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_common.h @@ -11,7 +11,8 @@ E3D_Texture *e3d_texture_new(void); void e3d_texture_free(E3D_Texture *texture); void e3d_texture_size_get(const E3D_Texture *texture, int *w, int *h); -void e3d_texture_set(E3D_Texture *texture, Evas_GL_Image *im); +void e3d_texture_set(Evas_Engine_GL_Context *gc, E3D_Texture *texture, Evas_GL_Image *im); +Evas_GL_Image *e3d_texture_get(E3D_Texture *texture); void e3d_texture_import(E3D_Texture *texture, GLuint tex); Eina_Bool e3d_texture_is_imported_get(const E3D_Texture *texture); diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_private.h b/src/modules/evas/engines/gl_common/evas_gl_3d_private.h index 2331060201..0968cab3f5 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_private.h +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_private.h @@ -106,6 +106,7 @@ struct _E3D_Draw_Data struct _E3D_Texture { + int x, y; int w, h; Evas_GL_Image *surface; diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c b/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c index f5228819fb..6d735322a0 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c @@ -285,7 +285,7 @@ e3d_renderer_draw(E3D_Renderer *renderer, E3D_Draw_Data *data) _renderer_program_use(renderer, program); e3d_program_uniform_upload(program, data); if (data->mode != EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER) - _renderer_texture_bind(renderer, data); + _renderer_texture_bind(renderer, data); /* Set up vertex attrib pointers. */ index = 0; diff --git a/src/modules/evas/engines/gl_generic/evas_engine.c b/src/modules/evas/engines/gl_generic/evas_engine.c index a590c55208..c3288ab51c 100644 --- a/src/modules/evas/engines/gl_generic/evas_engine.c +++ b/src/modules/evas/engines/gl_generic/evas_engine.c @@ -1975,10 +1975,14 @@ eng_texture_image_set(void *data, void *texture, void *image) re->window_use(re->software.ob); gl_context = re->window_gl_context_get(re->software.ob); - evas_gl_common_context_flush(gl_context); - eng_context_3d_use(data); - e3d_texture_set((E3D_Texture *)texture, (Evas_GL_Image *)image); + e3d_texture_set(gl_context, (E3D_Texture *)texture, (Evas_GL_Image *)image); +} + +static void * +eng_texture_image_get(void *data EINA_UNUSED, void *texture) +{ + return e3d_texture_get((E3D_Texture *)texture); } static Evas_Func func, pfunc; @@ -2115,6 +2119,7 @@ module_open(Evas_Module *em) ORD(texture_filter_set); ORD(texture_filter_get); ORD(texture_image_set); + ORD(texture_image_get); /* now advertise out own api */ em->functions = (void *)(&func); |