Evas gl: Fix texture allocation (missing Y offset)
I saw some GL error messages (with the GLERR() macro activated), that were caused by GL_INVALID_VALUE. For some (many) textures, tex->y was 0 but since we now use a 2D atlas (rectangle allocator), the first row of pixels should be repeated. This caused uploads to Y = tex->y - 1 = -1, which is invalid.
This commit is contained in:
parent
a2de0a0bc9
commit
b0f353cc38
|
@ -435,7 +435,7 @@ evas_gl_common_texture_new(Evas_Engine_GL_Context *gc, RGBA_Image *im)
|
||||||
{
|
{
|
||||||
Evas_GL_Texture *tex;
|
Evas_GL_Texture *tex;
|
||||||
GLsizei w, h;
|
GLsizei w, h;
|
||||||
int u = 0, v = 0, yoffset = 0;
|
int u = 0, v = 0, xoffset = 1, yoffset = 1;
|
||||||
int lformat;
|
int lformat;
|
||||||
|
|
||||||
lformat = _evas_gl_texture_search_format(im->cache_entry.flags.alpha, gc->shared->info.bgra, im->cache_entry.space);
|
lformat = _evas_gl_texture_search_format(im->cache_entry.flags.alpha, gc->shared->info.bgra, im->cache_entry.space);
|
||||||
|
@ -444,9 +444,6 @@ evas_gl_common_texture_new(Evas_Engine_GL_Context *gc, RGBA_Image *im)
|
||||||
tex = evas_gl_common_texture_alloc(gc, im->cache_entry.w, im->cache_entry.h, im->cache_entry.flags.alpha);
|
tex = evas_gl_common_texture_alloc(gc, im->cache_entry.w, im->cache_entry.h, im->cache_entry.flags.alpha);
|
||||||
if (!tex) return NULL;
|
if (!tex) return NULL;
|
||||||
|
|
||||||
#define TEX_HREP 1
|
|
||||||
#define TEX_VREP 1
|
|
||||||
|
|
||||||
switch (im->cache_entry.space)
|
switch (im->cache_entry.space)
|
||||||
{
|
{
|
||||||
case EVAS_COLORSPACE_ETC1:
|
case EVAS_COLORSPACE_ETC1:
|
||||||
|
@ -456,13 +453,14 @@ evas_gl_common_texture_new(Evas_Engine_GL_Context *gc, RGBA_Image *im)
|
||||||
w = im->cache_entry.w + im->cache_entry.borders.l + im->cache_entry.borders.r;
|
w = im->cache_entry.w + im->cache_entry.borders.l + im->cache_entry.borders.r;
|
||||||
h = im->cache_entry.h + im->cache_entry.borders.t + im->cache_entry.borders.b;
|
h = im->cache_entry.h + im->cache_entry.borders.t + im->cache_entry.borders.b;
|
||||||
EINA_SAFETY_ON_FALSE_RETURN_VAL(!(w & 0x3) && !(h & 0x3), NULL);
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(!(w & 0x3) && !(h & 0x3), NULL);
|
||||||
yoffset = 1;
|
xoffset = im->cache_entry.borders.l;
|
||||||
|
yoffset = im->cache_entry.borders.t;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* This need to be adjusted if we do something else than strip allocation */
|
// One pixel gap and two pixels for duplicated borders
|
||||||
w = im->cache_entry.w + TEX_HREP + 2; /* one pixel stop gap and two pixels for the border */
|
w = im->cache_entry.w + 3;
|
||||||
h = im->cache_entry.h + TEX_VREP + 2; /* only one added border for security down */
|
h = im->cache_entry.h + 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +474,7 @@ evas_gl_common_texture_new(Evas_Engine_GL_Context *gc, RGBA_Image *im)
|
||||||
evas_gl_common_texture_light_free(tex);
|
evas_gl_common_texture_light_free(tex);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
tex->x = u + 1;
|
tex->x = u + xoffset;
|
||||||
tex->y = v + yoffset;
|
tex->y = v + yoffset;
|
||||||
|
|
||||||
tex->pt->references++;
|
tex->pt->references++;
|
||||||
|
|
Loading…
Reference in New Issue