summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2015-03-01 20:36:21 +0100
committerCedric BAIL <cedric@osg.samsung.com>2015-03-01 20:36:21 +0100
commit05cbcec8c3dc15d91b5c64ac60baebd4828794da (patch)
tree3f5a05a350dae4dec31fe7a2d6c447659a7b47d1
parent2d7e4dbd608abc1929fc71f19a3ad47045a04398 (diff)
downloadefl-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.c72
-rw-r--r--src/lib/evas/include/evas_private.h4
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d.c21
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_common.h3
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_private.h1
-rw-r--r--src/modules/evas/engines/gl_common/evas_gl_3d_renderer.c2
-rw-r--r--src/modules/evas/engines/gl_generic/evas_engine.c11
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);