evas - gl - dont allocate image and/or texture until needed on native unset

This commit is contained in:
Carsten Haitzler 2013-10-16 17:20:14 +09:00
parent ed0e8b8df1
commit 7d7f548afc
6 changed files with 38 additions and 2 deletions

View File

@ -453,6 +453,7 @@ eng_image_alpha_set(void *data, void *image, int has_alpha)
if (!im->im->image.data)
evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
im_new = evas_gl_common_image_new_from_copied_data
(im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
im->im->image.data,
@ -523,6 +524,7 @@ eng_image_colorspace_set(void *data, void *image, int cspace)
/* FIXME: can move to gl_common */
if (im->cs.space == cspace) return;
eng_window_use(re->win);
evas_gl_common_image_alloc_ensure(im);
evas_cache_image_colorspace(&im->im->cache_entry, cspace);
switch (cspace)
{
@ -676,7 +678,8 @@ eng_image_size_set(void *data, void *image, int w, int h)
w &= ~0x1;
break;
}
evas_gl_common_image_alloc_ensure(im_old);
if ((im_old->im) &&
((int)im_old->im->cache_entry.w == w) &&
((int)im_old->im->cache_entry.h == h))
@ -744,6 +747,7 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i
}
eng_window_use(re->win);
error = evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
switch (im->cs.space)
{
case EVAS_COLORSPACE_ARGB8888:
@ -795,6 +799,7 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data)
im = image;
if (im->native.data) return image;
eng_window_use(re->win);
evas_gl_common_image_alloc_ensure(im);
if ((im->tex) && (im->tex->pt) && (im->tex->pt->dyn.data))
{
if (im->tex->pt->dyn.data == image_data)

View File

@ -715,6 +715,7 @@ void evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8
Evas_GL_Texture *evas_gl_common_texture_nv12tiled_new(Evas_Engine_GL_Context *gc, DATA8 **rows, unsigned int w, unsigned int h);
void evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **row, unsigned int w, unsigned int h);
void evas_gl_common_image_alloc_ensure(Evas_GL_Image *im);
void evas_gl_common_image_all_unload(Evas_Engine_GL_Context *gc);
void evas_gl_common_image_ref(Evas_GL_Image *im);

View File

@ -1,5 +1,13 @@
#include "evas_gl_private.h"
void
evas_gl_common_image_alloc_ensure(Evas_GL_Image *im)
{
if (!im->im) return;
im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry,
im->w, im->h);
}
void
evas_gl_common_image_all_unload(Evas_Engine_GL_Context *gc)
{
@ -332,6 +340,7 @@ evas_gl_common_image_alpha_set(Evas_GL_Image *im, int alpha)
if (im->alpha == alpha) return im;
im->alpha = alpha;
if (!im->im) return im;
evas_gl_common_image_alloc_ensure(im);
evas_cache_image_load_data(&im->im->cache_entry);
im->im->cache_entry.flags.alpha = alpha ? 1 : 0;
@ -395,14 +404,15 @@ evas_gl_common_image_native_disable(Evas_GL_Image *im)
im->tex = NULL;
}
im->tex_only = 0;
im->im = (RGBA_Image *)evas_cache_image_empty(evas_common_image_cache_get());
im->im->cache_entry.flags.alpha = im->alpha;
im->cs.space = EVAS_COLORSPACE_ARGB8888;
evas_cache_image_colorspace(&im->im->cache_entry, im->cs.space);
/*
im->im = (RGBA_Image *)evas_cache_image_size_set(&im->im->cache_entry, im->w, im->h);
if (!im->tex)
im->tex = evas_gl_common_texture_new(im->gc, im->im);
*/
}
void
@ -538,6 +548,7 @@ evas_gl_common_image_dirty(Evas_GL_Image *im, unsigned int x, unsigned int y, un
}
if (im->im)
{
evas_gl_common_image_alloc_ensure(im);
im->im = (RGBA_Image *)evas_cache_image_dirty(&im->im->cache_entry, x, y, w, h);
}
im->dirty = 1;
@ -549,6 +560,7 @@ evas_gl_common_image_update(Evas_Engine_GL_Context *gc, Evas_GL_Image *im)
Image_Entry *ie;
if (!im->im) return;
ie = (Image_Entry *)(im->im);
evas_gl_common_image_alloc_ensure(im);
/*
if ((im->cs.space == EVAS_COLORSPACE_YCBCR422P601_PL) ||
(im->cs.space == EVAS_COLORSPACE_YCBCR422P709_PL))
@ -716,6 +728,7 @@ evas_gl_common_image_push(Evas_Engine_GL_Context *gc, Evas_GL_Image *im,
RECTS_CLIP_TO_RECT(nx, ny, nw, nh,
cx, cy, cw, ch);
if ((nw < 1) || (nh < 1)) return;
if (!im->tex) return;
if ((nx == dx) && (ny == dy) && (nw == dw) && (nh == dh))
{
if (yuv)

View File

@ -365,6 +365,7 @@ eng_image_alpha_set(void *data EINA_UNUSED, void *image, int has_alpha)
if (!im->im->image.data)
evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
im_new = evas_gl_common_image_new_from_copied_data(im->gc, im->im->cache_entry.w, im->im->cache_entry.h, im->im->image.data,
eng_image_alpha_get(data, image),
eng_image_colorspace_get(data, image));
@ -414,6 +415,7 @@ eng_image_colorspace_set(void *data EINA_UNUSED, void *image, int cspace)
if (im->native.data) return;
/* FIXME: can move to gl_common */
if (im->cs.space == cspace) return;
evas_gl_common_image_alloc_ensure(im);
evas_cache_image_colorspace(&im->im->cache_entry, cspace);
switch (cspace)
{
@ -566,6 +568,7 @@ eng_image_size_set(void *data, void *image, int w, int h)
break;
}
evas_gl_common_image_alloc_ensure(im_old);
if ((im_old->im) &&
((int)im_old->im->cache_entry.w == w) &&
((int)im_old->im->cache_entry.h == h))
@ -621,6 +624,7 @@ eng_image_data_get(void *data EINA_UNUSED, void *image, int to_write, DATA32 **i
return im;
}
error = evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
switch (im->cs.space)
{
case EVAS_COLORSPACE_ARGB8888:
@ -670,6 +674,7 @@ eng_image_data_put(void *data EINA_UNUSED, void *image, DATA32 *image_data)
if (!image) return NULL;
im = image;
if (im->native.data) return image;
evas_gl_common_image_alloc_ensure(im);
switch (im->cs.space)
{
case EVAS_COLORSPACE_ARGB8888:

View File

@ -1817,6 +1817,7 @@ eng_image_alpha_set(void *data, void *image, int has_alpha)
if (!im->im->image.data)
evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
im_new = evas_gl_common_image_new_from_copied_data
(im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
im->im->image.data,
@ -1888,6 +1889,7 @@ eng_image_colorspace_set(void *data, void *image, int cspace)
/* FIXME: can move to gl_common */
if (im->cs.space == cspace) return;
eng_window_use(re->win);
evas_gl_common_image_alloc_ensure(im);
evas_cache_image_colorspace(&im->im->cache_entry, cspace);
switch (cspace)
{
@ -2633,6 +2635,7 @@ eng_image_size_set(void *data, void *image, int w, int h)
break;
}
evas_gl_common_image_alloc_ensure(im_old);
if ((im_old->im) &&
((int)im_old->im->cache_entry.w == w) &&
((int)im_old->im->cache_entry.h == h))
@ -2743,6 +2746,7 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i
}
error = evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
switch (im->cs.space)
{
case EVAS_COLORSPACE_ARGB8888:
@ -2797,6 +2801,7 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data)
im = image;
if (im->native.data) return image;
eng_window_use(re->win);
evas_gl_common_image_alloc_ensure(im);
if ((im->tex) && (im->tex->pt)
&& (im->tex->pt->dyn.data)
&& (im->cs.space == EVAS_COLORSPACE_ARGB8888))
@ -3357,6 +3362,7 @@ eng_pixel_alpha_get(void *image, int x, int y, DATA8 *alpha, int src_region_x, i
return EINA_FALSE;
}
evas_gl_common_image_alloc_ensure(im);
src_w = im->im->cache_entry.w;
src_h = im->im->cache_entry.h;
if ((src_w == 0) || (src_h == 0))

View File

@ -1681,6 +1681,7 @@ eng_image_size_set(void *data, void *image, int w, int h)
break;
}
evas_gl_common_image_alloc_ensure(im);
if ((im_old->im) &&
((int)im_old->im->cache_entry.w == w) &&
((int)im_old->im->cache_entry.h == h))
@ -1778,6 +1779,7 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data, i
}
error = evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
switch (im->cs.space)
{
case EVAS_COLORSPACE_ARGB8888:
@ -1832,6 +1834,7 @@ eng_image_data_put(void *data, void *image, DATA32 *image_data)
if (!(im = image)) return NULL;
if (im->native.data) return image;
eng_window_use(re->win);
evas_gl_common_image_alloc_ensure(im);
if ((im->tex) && (im->tex->pt)
&& (im->tex->pt->dyn.data)
&& (im->cs.space == EVAS_COLORSPACE_ARGB8888))
@ -1959,6 +1962,7 @@ eng_image_alpha_set(void *data, void *image, int has_alpha)
if (!im->im->image.data)
evas_cache_image_load_data(&im->im->cache_entry);
evas_gl_common_image_alloc_ensure(im);
im_new = evas_gl_common_image_new_from_copied_data
(im->gc, im->im->cache_entry.w, im->im->cache_entry.h,
im->im->image.data,
@ -2071,6 +2075,7 @@ eng_image_colorspace_set(void *data, void *image, int cspace)
/* FIXME: can move to gl_common */
if (im->cs.space == cspace) return;
eng_window_use(re->win);
evas_gl_common_image_alloc_ensure(im);
evas_cache_image_colorspace(&im->im->cache_entry, cspace);
switch (cspace)
{
@ -2516,6 +2521,7 @@ eng_pixel_alpha_get(void *image, int x, int y, DATA8 *alpha, int src_region_x, i
return EINA_FALSE;
}
evas_gl_common_image_alloc_ensure(im);
src_w = im->im->cache_entry.w;
src_h = im->im->cache_entry.h;
if ((src_w == 0) || (src_h == 0))