forked from enlightenment/efl
was playing with ansiotropic filtering - with mipmap stuff it looks nicer.
stillnot perfect. xrender engine detects "same source data pointer" and shares nicely now :) SVN revision: 17224
This commit is contained in:
parent
58443f1f4a
commit
e08ff34ee1
|
@ -65,10 +65,6 @@ evas_gl_common_context_use(Evas_GL_Context *gc)
|
|||
{
|
||||
if (strstr(ext, "GL_SGIS_generate_mipmap")) gc->ext.sgis_generate_mipmap = 1;
|
||||
if (strstr(ext, "GL_NV_texture_rectangle")) gc->ext.nv_texture_rectangle = 1;
|
||||
/* technically this should work, as its a compatible */
|
||||
/* implementation of the nvidia texture_rectangle extension */
|
||||
/* since the #define value is the same as is the description */
|
||||
/* it was fixed in the latest (3.2.5) fglrx drivers */
|
||||
if (strstr(ext, "GL_EXT_texture_rectangle")) gc->ext.nv_texture_rectangle = 1;
|
||||
printf("GL EXT supported: GL_SGIS_generate_mipmap = %x\n", gc->ext.sgis_generate_mipmap);
|
||||
printf("GL EXT supported: GL_NV_texture_rectangle = %x\n", gc->ext.nv_texture_rectangle);
|
||||
|
|
|
@ -172,7 +172,8 @@ evas_gl_common_image_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Im
|
|||
oh = (dh * im->tex->th) / sh;
|
||||
evas_gl_common_context_texture_set(gc, im->tex, smooth, ow, oh);
|
||||
if ((!im->tex->have_mipmaps) && (smooth) &&
|
||||
((im->tex->uw < im->tex->tw) || (im->tex->uh < im->tex->th)))
|
||||
((im->tex->uw < im->tex->tw) || (im->tex->uh < im->tex->th)) &&
|
||||
(!gc->ext.sgis_generate_mipmap))
|
||||
evas_gl_common_texture_mipmaps_build(im->tex, im->im, smooth);
|
||||
|
||||
if (im->tex->not_power_of_two)
|
||||
|
@ -204,9 +205,19 @@ evas_gl_common_image_draw(Evas_GL_Context *gc, RGBA_Draw_Context *dc, Evas_GL_Im
|
|||
evas_gl_common_context_write_buf_set(gc, GL_BACK);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2d(tx1, ty1); glVertex2i(dx , dy );
|
||||
glTexCoord2d(tx2, ty1); glVertex2i(dx + dw, dy );
|
||||
glTexCoord2d(tx2, ty2); glVertex2i(dx + dw, dy + dh);
|
||||
glTexCoord2d(tx1, ty2); glVertex2i(dx , dy + dh);
|
||||
if (im->tex->not_power_of_two)
|
||||
{
|
||||
glTexCoord2d(tx1, ty1); glVertex2i(dx , dy );
|
||||
glTexCoord2d(tx2, ty1); glVertex2i(dx + dw, dy );
|
||||
glTexCoord2d(tx2, ty2); glVertex2i(dx + dw, dy + dh);
|
||||
glTexCoord2d(tx1, ty2); glVertex2i(dx , dy + dh);
|
||||
}
|
||||
else
|
||||
{
|
||||
glTexCoord2d(tx1, ty1); glVertex2f(dx , dy );
|
||||
glTexCoord2d(tx2, ty1); glVertex2f(dx + dw + 0.5, dy );
|
||||
glTexCoord2d(tx2, ty2); glVertex2f(dx + dw + 0.5, dy + dh + 0.5);
|
||||
glTexCoord2d(tx1, ty2); glVertex2f(dx , dy + dh + 0.5);
|
||||
}
|
||||
glEnd();
|
||||
}
|
||||
|
|
|
@ -68,12 +68,13 @@ evas_gl_common_texture_new(Evas_GL_Context *gc, RGBA_Image *im, int smooth)
|
|||
glEnable(GL_TEXTURE_2D);
|
||||
glGenTextures(1, &(tex->texture));
|
||||
glBindTexture(GL_TEXTURE_2D, tex->texture);
|
||||
|
||||
if (gc->texture) gc->texture->references--;
|
||||
gc->texture = tex;
|
||||
gc->change.texture = 1;
|
||||
tex->references++;
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
|
|
@ -772,14 +772,22 @@ evas_engine_xrender_x11_image_data_put(void *data, void *image, DATA32 *image_da
|
|||
XR_Image *old_image;
|
||||
|
||||
old_image = (XR_Image *)image;
|
||||
image = _xre_image_new_from_data(old_image->xinf, old_image->w, old_image->h, image_data);
|
||||
if (image)
|
||||
image = _xre_image_data_find(image_data);
|
||||
if (!image)
|
||||
{
|
||||
((XR_Image *)image)->alpha = old_image->alpha;
|
||||
_xre_image_free(old_image);
|
||||
image = _xre_image_new_from_data(old_image->xinf, old_image->w, old_image->h, image_data);
|
||||
if (image)
|
||||
{
|
||||
((XR_Image *)image)->alpha = old_image->alpha;
|
||||
_xre_image_free(old_image);
|
||||
}
|
||||
else
|
||||
image = old_image;
|
||||
}
|
||||
else
|
||||
image = old_image;
|
||||
{
|
||||
_xre_image_free(old_image);
|
||||
}
|
||||
}
|
||||
return image;
|
||||
}
|
||||
|
|
|
@ -111,6 +111,7 @@ void _xre_image_region_dirty(XR_Image *im, int x, int y, int w, int h);
|
|||
void _xre_image_dirty(XR_Image *im);
|
||||
XR_Image *_xre_image_copy(XR_Image *im);
|
||||
void *_xre_image_data_get(XR_Image *im);
|
||||
XR_Image *_xre_image_data_find(void *data);
|
||||
void _xre_image_data_put(XR_Image *im, void *data);
|
||||
void _xre_image_alpha_set(XR_Image *im, int alpha);
|
||||
int _xre_image_alpha_get(XR_Image *im);
|
||||
|
|
|
@ -8,6 +8,36 @@ static Evas_Hash *_xr_image_hash = NULL;
|
|||
static int _xr_image_cache_size = 0;
|
||||
static int _xr_image_cache_usage = 0;
|
||||
static Evas_List *_xr_image_cache = NULL;
|
||||
static Evas_Hash *_xr_image_dirty_hash = NULL;
|
||||
|
||||
static void
|
||||
__xre_image_dirty_hash_add(XR_Image *im)
|
||||
{
|
||||
char buf[64];
|
||||
|
||||
if (!im->data) return;
|
||||
snprintf(buf, sizeof(buf), "%p", im->data);
|
||||
_xr_image_dirty_hash = evas_hash_add(_xr_image_dirty_hash, buf, im);
|
||||
}
|
||||
|
||||
static void
|
||||
__xre_image_dirty_hash_del(XR_Image *im)
|
||||
{
|
||||
char buf[64];
|
||||
|
||||
if (!im->data) return;
|
||||
snprintf(buf, sizeof(buf), "%p", im->data);
|
||||
_xr_image_dirty_hash = evas_hash_del(_xr_image_dirty_hash, buf, im);
|
||||
}
|
||||
|
||||
static XR_Image *
|
||||
__xre_image_dirty_hash_find(void *data)
|
||||
{
|
||||
char buf[64];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%p", data);
|
||||
return evas_hash_find(_xr_image_dirty_hash, buf);
|
||||
}
|
||||
|
||||
static XR_Image *
|
||||
__xre_image_find(char *fkey)
|
||||
|
@ -91,6 +121,7 @@ _xre_image_new_from_data(Ximage_Info *xinf, int w, int h, void *data)
|
|||
im->data = data;
|
||||
im->alpha = 1;
|
||||
im->dirty = 1;
|
||||
__xre_image_dirty_hash_add(im);
|
||||
return im;
|
||||
}
|
||||
|
||||
|
@ -99,6 +130,39 @@ _xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data)
|
|||
{
|
||||
XR_Image *im;
|
||||
|
||||
im = calloc(1, sizeof(XR_Image));
|
||||
if (!im) return NULL;
|
||||
im->data = malloc(w * h * 4);
|
||||
if (!im->data)
|
||||
{
|
||||
free(im);
|
||||
return NULL;
|
||||
}
|
||||
if (data)
|
||||
{
|
||||
Gfx_Func_Blend_Src_Dst func;
|
||||
|
||||
func = evas_common_draw_func_copy_get(w * h, 0);
|
||||
if (func) func(data, im->data, w * h);
|
||||
evas_common_cpu_end_opt();
|
||||
}
|
||||
im->w = w;
|
||||
im->h = h;
|
||||
im->references = 1;
|
||||
im->xinf = xinf;
|
||||
im->xinf->references++;
|
||||
im->free_data = 1;
|
||||
im->alpha = 1;
|
||||
im->dirty = 1;
|
||||
__xre_image_dirty_hash_add(im);
|
||||
return im;
|
||||
}
|
||||
|
||||
XR_Image *
|
||||
_xre_image_new(Ximage_Info *xinf, int w, int h)
|
||||
{
|
||||
XR_Image *im;
|
||||
|
||||
im = calloc(1, sizeof(XR_Image));
|
||||
if (!im) return NULL;
|
||||
im->data = malloc(w * h * 4);
|
||||
|
@ -113,42 +177,9 @@ _xre_image_new_from_copied_data(Ximage_Info *xinf, int w, int h, void *data)
|
|||
im->xinf = xinf;
|
||||
im->xinf->references++;
|
||||
im->free_data = 1;
|
||||
|
||||
if (data)
|
||||
{
|
||||
Gfx_Func_Blend_Src_Dst func;
|
||||
|
||||
func = evas_common_draw_func_copy_get(w * h, 0);
|
||||
if (func) func(data, im->data, w * h);
|
||||
evas_common_cpu_end_opt();
|
||||
}
|
||||
|
||||
im->alpha = 1;
|
||||
im->dirty = 1;
|
||||
return im;
|
||||
}
|
||||
|
||||
XR_Image *
|
||||
_xre_image_new(Ximage_Info *xinf, int w, int h)
|
||||
{
|
||||
XR_Image *im;
|
||||
|
||||
im = calloc(1, sizeof(XR_Image));
|
||||
if (!im) return NULL;
|
||||
im->xinf = xinf;
|
||||
im->xinf->references++;
|
||||
im->w = w;
|
||||
im->h = h;
|
||||
im->references = 1;
|
||||
im->data = malloc(w * h * 4);
|
||||
if (!im->data)
|
||||
{
|
||||
im->xinf->references--;
|
||||
free(im);
|
||||
}
|
||||
im->free_data = 1;
|
||||
im->alpha = 1;
|
||||
im->dirty = 1;
|
||||
__xre_image_dirty_hash_add(im);
|
||||
return im;
|
||||
}
|
||||
|
||||
|
@ -159,6 +190,7 @@ __xre_image_real_free(XR_Image *im)
|
|||
if (im->key) free(im->key);
|
||||
if (im->fkey) free(im->fkey);
|
||||
if (im->im) evas_common_image_unref(im->im);
|
||||
if ((im->data) && (im->dirty)) __xre_image_dirty_hash_del(im);
|
||||
if ((im->free_data) && (im->data)) free(im->data);
|
||||
if (im->surface) _xr_render_surface_free(im->surface);
|
||||
if (im->format) free(im->format);
|
||||
|
@ -283,8 +315,10 @@ _xre_image_resize(XR_Image *im, int w, int h)
|
|||
}
|
||||
evas_common_cpu_end_opt();
|
||||
}
|
||||
__xre_image_dirty_hash_del(im);
|
||||
free(im->data);
|
||||
im->data = data;
|
||||
__xre_image_dirty_hash_add(im);
|
||||
}
|
||||
else if (im->im)
|
||||
{
|
||||
|
@ -312,12 +346,19 @@ _xre_image_resize(XR_Image *im, int w, int h)
|
|||
evas_common_blit_rectangle(im_old, im->im, 0, 0, ww, hh, 0, 0);
|
||||
evas_common_cpu_end_opt();
|
||||
}
|
||||
im->free_data = 1;
|
||||
im->data = im->im->image->data;
|
||||
im->im->image->data = NULL;
|
||||
evas_common_image_unref(im->im);
|
||||
im->im = NULL;
|
||||
evas_common_image_unref(im_old);
|
||||
__xre_image_dirty_hash_add(im);
|
||||
}
|
||||
else
|
||||
{
|
||||
im->data = malloc(w * h * 4);
|
||||
im->free_data = 1;
|
||||
__xre_image_dirty_hash_add(im);
|
||||
}
|
||||
im->w = w;
|
||||
im->h = h;
|
||||
|
@ -341,6 +382,16 @@ _xre_image_data_get(XR_Image *im)
|
|||
return data;
|
||||
}
|
||||
|
||||
XR_Image *
|
||||
_xre_image_data_find(void *data)
|
||||
{
|
||||
XR_Image *im;
|
||||
|
||||
im = __xre_image_dirty_hash_find(data);
|
||||
if (im) im->references++;
|
||||
return im;
|
||||
}
|
||||
|
||||
void
|
||||
_xre_image_data_put(XR_Image *im, void *data)
|
||||
{
|
||||
|
@ -351,6 +402,7 @@ _xre_image_data_put(XR_Image *im, void *data)
|
|||
{
|
||||
imdata = im->data;
|
||||
if (data == imdata) return;
|
||||
__xre_image_dirty_hash_del(im);
|
||||
if (im->free_data) free(im->data);
|
||||
}
|
||||
else
|
||||
|
@ -364,6 +416,7 @@ _xre_image_data_put(XR_Image *im, void *data)
|
|||
}
|
||||
}
|
||||
im->data = data;
|
||||
__xre_image_dirty_hash_add(im);
|
||||
im->free_data = 0;
|
||||
if (im->surface)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue