evas gl engine - paranoia: check max texture size limits on texture alloc
This commit is contained in:
parent
079c1c6d9b
commit
199fb6523e
|
@ -795,8 +795,10 @@ Eina_Bool evas_gl_common_module_open(void);
|
|||
void evas_gl_common_module_close(void);
|
||||
|
||||
static inline void
|
||||
_tex_sub_2d(int x, int y, int w, int h, int fmt, int type, const void *pix)
|
||||
_tex_sub_2d(Evas_Engine_GL_Context *gc, int x, int y, int w, int h, int fmt, int type, const void *pix)
|
||||
{
|
||||
if ((w > gc->shared->info.max_texture_size) ||
|
||||
(h > gc->shared->info.max_texture_size)) return;
|
||||
glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, w, h, fmt, type, pix);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
}
|
||||
|
|
|
@ -199,28 +199,28 @@ _evas_gl_preload_tile_async(void *data EINA_UNUSED, Eina_Thread t EINA_UNUSED)
|
|||
// +-+
|
||||
// +-+
|
||||
//
|
||||
_tex_sub_2d(async->tex->x, async->tex->y,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x, async->tex->y,
|
||||
async->im->cache_entry.w, async->im->cache_entry.h,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
async->im->image.data);
|
||||
// xxx
|
||||
// xxx
|
||||
// ---
|
||||
_tex_sub_2d(async->tex->x, async->tex->y + async->im->cache_entry.h,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x, async->tex->y + async->im->cache_entry.h,
|
||||
async->im->cache_entry.w, 1,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
async->im->image.data + ((async->im->cache_entry.h - 1) * async->im->cache_entry.w));
|
||||
// xxx
|
||||
// xxx
|
||||
// o
|
||||
_tex_sub_2d(async->tex->x - 1, async->tex->y + async->im->cache_entry.h,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x - 1, async->tex->y + async->im->cache_entry.h,
|
||||
1, 1,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
async->im->image.data + ((async->im->cache_entry.h - 1) * async->im->cache_entry.w));
|
||||
// xxx
|
||||
// xxx
|
||||
// o
|
||||
_tex_sub_2d(async->tex->x + async->im->cache_entry.w, async->tex->y + async->im->cache_entry.h,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x + async->im->cache_entry.w, async->tex->y + async->im->cache_entry.h,
|
||||
1, 1,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
async->im->image.data + ((async->im->cache_entry.h - 1) * async->im->cache_entry.w) + (async->im->cache_entry.w - 1));
|
||||
|
@ -231,14 +231,14 @@ _evas_gl_preload_tile_async(void *data EINA_UNUSED, Eina_Thread t EINA_UNUSED)
|
|||
// |xxx
|
||||
// |xxx
|
||||
//
|
||||
_tex_sub_2d(async->tex->x - 1, async->tex->y,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x - 1, async->tex->y,
|
||||
1, async->im->cache_entry.h,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
async->im->image.data);
|
||||
// xxx|
|
||||
// xxx|
|
||||
//
|
||||
_tex_sub_2d(async->tex->x + async->im->cache_entry.w, async->tex->y,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x + async->im->cache_entry.w, async->tex->y,
|
||||
1, async->im->cache_entry.h,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
async->im->image.data + (async->im->cache_entry.w - 1));
|
||||
|
@ -260,7 +260,7 @@ _evas_gl_preload_tile_async(void *data EINA_UNUSED, Eina_Thread t EINA_UNUSED)
|
|||
// |xxx
|
||||
// |xxx
|
||||
//
|
||||
_tex_sub_2d(async->tex->x - 1, async->tex->y,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x - 1, async->tex->y,
|
||||
1, async->im->cache_entry.h,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
tpix);
|
||||
|
@ -275,7 +275,7 @@ _evas_gl_preload_tile_async(void *data EINA_UNUSED, Eina_Thread t EINA_UNUSED)
|
|||
// xxx|
|
||||
// xxx|
|
||||
//
|
||||
_tex_sub_2d(async->tex->x + async->im->cache_entry.w, async->tex->y,
|
||||
_tex_sub_2d(async->tex->gc, async->tex->x + async->im->cache_entry.w, async->tex->y,
|
||||
1, async->im->cache_entry.h,
|
||||
fmt, async->tex->pt->dataformat,
|
||||
tpix);
|
||||
|
|
|
@ -115,7 +115,7 @@ _tex_round_slot(Evas_Engine_GL_Context *gc, int h)
|
|||
if (!gc->shared->info.tex_npo2)
|
||||
h = _nearest_pow2(h);
|
||||
return (h + gc->shared->info.tune.atlas.slot_size - 1) /
|
||||
gc->shared->info.tune.atlas.slot_size;
|
||||
gc->shared->info.tune.atlas.slot_size;
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -140,9 +140,15 @@ _tex_format_index(GLuint format)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
_tex_2d(int intfmt, int w, int h, int fmt, int type)
|
||||
static Eina_Bool
|
||||
_tex_2d(Evas_Engine_GL_Context *gc, int intfmt, int w, int h, int fmt, int type)
|
||||
{
|
||||
if ((w > gc->shared->info.max_texture_size) ||
|
||||
(h > gc->shared->info.max_texture_size))
|
||||
{
|
||||
ERR("Fail tex too big %ix%i", w, h);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, intfmt, w, h, 0, fmt, type, NULL);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
#ifdef GL_TEXTURE_INTERNAL_FORMAT
|
||||
|
@ -159,6 +165,7 @@ _tex_2d(int intfmt, int w, int h, int fmt, int type)
|
|||
{
|
||||
ERR("Fail tex alloc %ix%i", w, h);
|
||||
// XXX send async err to evas
|
||||
return EINA_FALSE;
|
||||
}
|
||||
}
|
||||
// else
|
||||
|
@ -166,7 +173,8 @@ _tex_2d(int intfmt, int w, int h, int fmt, int type)
|
|||
// ERR("GL_TEXTURE_INTERNAL_FORMAT defined but no symbol loaded.");
|
||||
// }
|
||||
# endif
|
||||
#endif
|
||||
#endif
|
||||
return EINA_TRUE;
|
||||
}
|
||||
|
||||
static Evas_GL_Texture *
|
||||
|
@ -198,7 +206,14 @@ static Evas_GL_Texture_Pool *
|
|||
_pool_tex_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, GLenum format)
|
||||
{
|
||||
Evas_GL_Texture_Pool *pt;
|
||||
Eina_Bool ok;
|
||||
|
||||
if ((w > gc->shared->info.max_texture_size) ||
|
||||
(h > gc->shared->info.max_texture_size))
|
||||
{
|
||||
ERR("Fail tex too big %ix%i", w, h);
|
||||
return NULL;
|
||||
}
|
||||
pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
|
||||
if (!pt) return NULL;
|
||||
h = _tex_round_slot(gc, h) * gc->shared->info.tune.atlas.slot_size;
|
||||
|
@ -211,24 +226,6 @@ _pool_tex_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, GLenum fo
|
|||
pt->dataformat = GL_UNSIGNED_BYTE;
|
||||
pt->references = 0;
|
||||
|
||||
if (format == alpha_fmt)
|
||||
{
|
||||
texinfo.a.num++;
|
||||
texinfo.a.pix += pt->w * pt->h;
|
||||
}
|
||||
else if (format == lum_fmt)
|
||||
{
|
||||
texinfo.v.num++;
|
||||
texinfo.v.pix += pt->w * pt->h;
|
||||
}
|
||||
else
|
||||
{
|
||||
texinfo.c.num++;
|
||||
texinfo.c.pix += pt->w * pt->h;
|
||||
}
|
||||
|
||||
_print_tex_count();
|
||||
|
||||
glGenTextures(1, &(pt->texture));
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(GL_TEXTURE_2D, pt->texture);
|
||||
|
@ -241,9 +238,32 @@ _pool_tex_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, GLenum fo
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(pt->intformat, w, h, pt->format, pt->dataformat);
|
||||
ok = _tex_2d(gc, pt->intformat, w, h, pt->format, pt->dataformat);
|
||||
glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
if (!ok)
|
||||
{
|
||||
glDeleteTextures(1, &(pt->texture));
|
||||
free(pt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (format == alpha_fmt)
|
||||
{
|
||||
texinfo.a.num++;
|
||||
texinfo.a.pix += pt->w * pt->h;
|
||||
}
|
||||
else if (format == lum_fmt)
|
||||
{
|
||||
texinfo.v.num++;
|
||||
texinfo.v.pix += pt->w * pt->h;
|
||||
}
|
||||
else
|
||||
{
|
||||
texinfo.c.num++;
|
||||
texinfo.c.pix += pt->w * pt->h;
|
||||
}
|
||||
_print_tex_count();
|
||||
return pt;
|
||||
}
|
||||
|
||||
|
@ -380,7 +400,14 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
{
|
||||
Evas_GL_Texture_Pool *pt;
|
||||
int fnum;
|
||||
Eina_Bool ok;
|
||||
|
||||
if ((w > gc->shared->info.max_texture_size) ||
|
||||
(h > gc->shared->info.max_texture_size))
|
||||
{
|
||||
ERR("Fail tex too big %ix%i", w, h);
|
||||
return NULL;
|
||||
}
|
||||
pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
|
||||
if (!pt) return NULL;
|
||||
_tex_adjust(gc, &w, &h);
|
||||
|
@ -407,11 +434,6 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
# define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT
|
||||
# endif
|
||||
#endif
|
||||
texinfo.r.num++;
|
||||
texinfo.r.pix += pt->w * pt->h;
|
||||
|
||||
_print_tex_count();
|
||||
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &fnum);
|
||||
glGenTextures(1, &(pt->texture));
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
@ -425,7 +447,7 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(pt->intformat, w, h, pt->format, pt->dataformat);
|
||||
ok = _tex_2d(gc, pt->intformat, w, h, pt->format, pt->dataformat);
|
||||
|
||||
glsym_glGenFramebuffers(1, &(pt->fb));
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
@ -438,6 +460,17 @@ _pool_tex_render_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
|
||||
glBindTexture(GL_TEXTURE_2D, gc->pipe[0].shader.cur_tex);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
||||
if (!ok)
|
||||
{
|
||||
glDeleteTextures(1, &(pt->texture));
|
||||
free(pt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
texinfo.r.num++;
|
||||
texinfo.r.pix += pt->w * pt->h;
|
||||
_print_tex_count();
|
||||
return pt;
|
||||
}
|
||||
|
||||
|
@ -446,6 +479,12 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
{
|
||||
Evas_GL_Texture_Pool *pt;
|
||||
|
||||
if ((w > gc->shared->info.max_texture_size) ||
|
||||
(h > gc->shared->info.max_texture_size))
|
||||
{
|
||||
ERR("Fail tex too big %ix%i", w, h);
|
||||
return NULL;
|
||||
}
|
||||
pt = calloc(1, sizeof(Evas_GL_Texture_Pool));
|
||||
if (!pt) return NULL;
|
||||
pt->gc = gc;
|
||||
|
@ -468,11 +507,6 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
pt->dataformat = GL_UNSIGNED_BYTE;
|
||||
pt->references = 0;
|
||||
pt->native = 1;
|
||||
texinfo.n.num++;
|
||||
texinfo.n.pix += pt->w * pt->h;
|
||||
|
||||
_print_tex_count();
|
||||
|
||||
glGenTextures(1, &(pt->texture));
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(im->native.target, pt->texture);
|
||||
|
@ -499,6 +533,10 @@ _pool_tex_native_new(Evas_Engine_GL_Context *gc, int w, int h, int intformat, in
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(im->native.target, gc->pipe[0].shader.cur_tex);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
||||
texinfo.n.num++;
|
||||
texinfo.n.pix += pt->w * pt->h;
|
||||
_print_tex_count();
|
||||
return pt;
|
||||
}
|
||||
|
||||
|
@ -882,7 +920,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
|||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
||||
_tex_sub_2d(u, tex->ty, EVAS_GL_TILE_SIZE, EVAS_GL_TILE_SIZE, fmt, tex->ptt->dataformat, out);
|
||||
_tex_sub_2d(tex->gc, u, tex->ty, EVAS_GL_TILE_SIZE, EVAS_GL_TILE_SIZE, fmt, tex->ptt->dataformat, out);
|
||||
|
||||
// Switch back to current texture
|
||||
if (tex->ptt->texture != tex->gc->pipe[0].shader.cur_tex)
|
||||
|
@ -932,28 +970,28 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
|||
// +-+
|
||||
// +-+
|
||||
//
|
||||
_tex_sub_2d(tex->x, tex->y,
|
||||
_tex_sub_2d(tex->gc, tex->x, tex->y,
|
||||
im->cache_entry.w, im->cache_entry.h,
|
||||
fmt, tex->pt->dataformat,
|
||||
im->image.data);
|
||||
// xxx
|
||||
// xxx
|
||||
// ---
|
||||
_tex_sub_2d(tex->x, tex->y + im->cache_entry.h,
|
||||
_tex_sub_2d(tex->gc, tex->x, tex->y + im->cache_entry.h,
|
||||
im->cache_entry.w, 1,
|
||||
fmt, tex->pt->dataformat,
|
||||
im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w));
|
||||
// xxx
|
||||
// xxx
|
||||
// o
|
||||
_tex_sub_2d(tex->x - 1, tex->y + im->cache_entry.h,
|
||||
_tex_sub_2d(tex->gc, tex->x - 1, tex->y + im->cache_entry.h,
|
||||
1, 1,
|
||||
fmt, tex->pt->dataformat,
|
||||
im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w));
|
||||
// xxx
|
||||
// xxx
|
||||
// o
|
||||
_tex_sub_2d(tex->x + im->cache_entry.w, tex->y + im->cache_entry.h,
|
||||
_tex_sub_2d(tex->gc, tex->x + im->cache_entry.w, tex->y + im->cache_entry.h,
|
||||
1, 1,
|
||||
fmt, tex->pt->dataformat,
|
||||
im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w) + (im->cache_entry.w - 1));
|
||||
|
@ -964,14 +1002,14 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
|||
// |xxx
|
||||
// |xxx
|
||||
//
|
||||
_tex_sub_2d(tex->x - 1, tex->y,
|
||||
_tex_sub_2d(tex->gc, tex->x - 1, tex->y,
|
||||
1, im->cache_entry.h,
|
||||
fmt, tex->pt->dataformat,
|
||||
im->image.data);
|
||||
// xxx|
|
||||
// xxx|
|
||||
//
|
||||
_tex_sub_2d(tex->x + im->cache_entry.w, tex->y,
|
||||
_tex_sub_2d(tex->gc, tex->x + im->cache_entry.w, tex->y,
|
||||
1, im->cache_entry.h,
|
||||
fmt, tex->pt->dataformat,
|
||||
im->image.data + (im->cache_entry.w - 1));
|
||||
|
@ -993,7 +1031,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
|||
// |xxx
|
||||
// |xxx
|
||||
//
|
||||
_tex_sub_2d(tex->x - 1, tex->y,
|
||||
_tex_sub_2d(tex->gc, tex->x - 1, tex->y,
|
||||
1, im->cache_entry.h,
|
||||
fmt, tex->pt->dataformat,
|
||||
tpix);
|
||||
|
@ -1008,7 +1046,7 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im)
|
|||
// xxx|
|
||||
// xxx|
|
||||
//
|
||||
_tex_sub_2d(tex->x + im->cache_entry.w, tex->y,
|
||||
_tex_sub_2d(tex->gc, tex->x + im->cache_entry.w, tex->y,
|
||||
1, im->cache_entry.h,
|
||||
fmt, tex->pt->dataformat,
|
||||
tpix);
|
||||
|
@ -1104,8 +1142,8 @@ evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels,
|
|||
}
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_sub_2d(tex->x, tex->y, w, h, tex->pt->format, tex->pt->dataformat,
|
||||
pixels);
|
||||
_tex_sub_2d(tex->gc, tex->x, tex->y, w, h, tex->pt->format,
|
||||
tex->pt->dataformat, pixels);
|
||||
if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex)
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex);
|
||||
|
@ -1173,20 +1211,23 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat);
|
||||
_tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat))
|
||||
return;
|
||||
_tex_sub_2d(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptu->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat);
|
||||
_tex_sub_2d(0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
|
||||
if (!_tex_2d(tex->gc, tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat))
|
||||
return;
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptv->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + (h / 2) + 1] - rows[h + (h / 2)]);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat);
|
||||
_tex_sub_2d(0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
|
||||
if (!_tex_2d(tex->gc, tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat))
|
||||
return;
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1196,35 +1237,38 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat))
|
||||
return;
|
||||
if ((rows[1] - rows[0]) == (int)w)
|
||||
_tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
else
|
||||
{
|
||||
for (y = 0; y < h; y++)
|
||||
_tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptu->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->ptu->intformat, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat))
|
||||
return;
|
||||
if ((rows[h + 1] - rows[h]) == (int)(w / 2))
|
||||
_tex_sub_2d(0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h / 2, tex->ptu->format, tex->ptu->dataformat, rows[h]);
|
||||
else
|
||||
{
|
||||
for (y = 0; y < (h / 2); y++)
|
||||
_tex_sub_2d(0, y, w / 2, 1, tex->ptu->format, tex->ptu->dataformat, rows[h + y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w / 2, 1, tex->ptu->format, tex->ptu->dataformat, rows[h + y]);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptv->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->ptv->intformat, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat))
|
||||
return;
|
||||
if ((rows[h + (h / 2) + 1] - rows[h + (h / 2)]) == (int)(w / 2))
|
||||
_tex_sub_2d(0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h / 2, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2)]);
|
||||
else
|
||||
{
|
||||
for (y = 0; y < (h / 2); y++)
|
||||
_tex_sub_2d(0, y, w / 2, 1, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2) + y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w / 2, 1, tex->ptv->format, tex->ptv->dataformat, rows[h + (h / 2) + y]);
|
||||
}
|
||||
}
|
||||
if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex)
|
||||
|
@ -1374,30 +1418,32 @@ evas_gl_common_texture_yuy2_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat))
|
||||
return;
|
||||
if ((rows[1] - rows[0]) == (int)w * 4)
|
||||
_tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
else
|
||||
{
|
||||
for (y = 0; y < h; y++)
|
||||
_tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptuv->intformat, w / 2, h, tex->ptuv->format, tex->ptuv->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->ptuv->intformat, w / 2, h, tex->ptuv->format, tex->ptuv->dataformat))
|
||||
return;
|
||||
#if 0
|
||||
/*
|
||||
FIXME: this piece of code doesn't work anymore since texture width
|
||||
is not anymore exactly w / 2. I don't understand why.
|
||||
*/
|
||||
if ((rows[1] - rows[0]) == (int)(w * 2))
|
||||
_tex_sub_2d(0, 0, w / 2, h, tex->ptuv->format, tex->ptuv->dataformat, rows[0]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h, tex->ptuv->format, tex->ptuv->dataformat, rows[0]);
|
||||
else
|
||||
#endif
|
||||
{
|
||||
for (y = 0; y < h; y++)
|
||||
_tex_sub_2d(0, y, w / 2, 1, tex->ptuv->format, tex->ptuv->dataformat, rows[y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w / 2, 1, tex->ptuv->format, tex->ptuv->dataformat, rows[y]);
|
||||
}
|
||||
|
||||
if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex)
|
||||
|
@ -1425,14 +1471,16 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat);
|
||||
_tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat))
|
||||
return;
|
||||
_tex_sub_2d(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[h + 1] - rows[h]);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat);
|
||||
_tex_sub_2d(0, 0, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, rows[h]);
|
||||
if (!_tex_2d(tex->gc, tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat))
|
||||
return;
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, rows[h]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1442,24 +1490,26 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
glBindTexture(GL_TEXTURE_2D, tex->pt->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat))
|
||||
return;
|
||||
if ((rows[1] - rows[0]) == (int)w)
|
||||
_tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]);
|
||||
else
|
||||
{
|
||||
for (y = 0; y < h; y++)
|
||||
_tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
_tex_2d(tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->ptuv->intformat, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat))
|
||||
return;
|
||||
if ((rows[h + 1] - rows[h]) == (int)(w / 2))
|
||||
_tex_sub_2d(0, 0, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, rows[h]);
|
||||
_tex_sub_2d(tex->gc, 0, 0, w / 2, h / 2, tex->ptuv->format, tex->ptuv->dataformat, rows[h]);
|
||||
else
|
||||
{
|
||||
for (y = 0; y < (h / 2); y++)
|
||||
_tex_sub_2d(0, y, w / 2, 1, tex->ptuv->format, tex->ptuv->dataformat, rows[h + y]);
|
||||
_tex_sub_2d(tex->gc, 0, y, w / 2, 1, tex->ptuv->format, tex->ptuv->dataformat, rows[h + y]);
|
||||
}
|
||||
}
|
||||
if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex)
|
||||
|
@ -1630,7 +1680,8 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
|
|||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
||||
// We are telling the driver to not swizzle back the buffer as we are going to replace all pixel
|
||||
_tex_2d(tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->pt->intformat, w, h, tex->pt->format, tex->pt->dataformat))
|
||||
return;
|
||||
|
||||
/* Iterate each Y macroblock like we do in evas_convert_yuv.c */
|
||||
for (mb_y = 0; mb_y < (mb_h >> 1); mb_y++)
|
||||
|
@ -1646,7 +1697,7 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
|
|||
|
||||
for (mb_x = 0; mb_x < mb_w * 2; mb_x++, rmb_x += 64 * 32)
|
||||
{
|
||||
_tex_sub_2d(x, ry[offset], 64, 32, tex->pt->format, tex->pt->dataformat, rows[mb_y] + rmb_x);
|
||||
_tex_sub_2d(tex->gc, x, ry[offset], 64, 32, tex->pt->format, tex->pt->dataformat, rows[mb_y] + rmb_x);
|
||||
|
||||
step++;
|
||||
if ((step & 0x3) == 0)
|
||||
|
@ -1670,13 +1721,14 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
|
|||
ry = mb_y * 2 * 32;
|
||||
|
||||
for (mb_x = 0; mb_x < mb_w; mb_x++, x += 64, rmb_x += 64 * 32)
|
||||
_tex_sub_2d(x, ry, 64, 32, tex->pt->format, tex->pt->dataformat, rows[mb_y] + rmb_x);
|
||||
_tex_sub_2d(tex->gc, x, ry, 64, 32, tex->pt->format, tex->pt->dataformat, rows[mb_y] + rmb_x);
|
||||
}
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, tex->ptuv->texture);
|
||||
GLERR(__FUNCTION__, __FILE__, __LINE__, "");
|
||||
|
||||
_tex_2d(tex->ptuv->intformat, w, h, tex->ptuv->format, tex->ptuv->dataformat);
|
||||
if (!_tex_2d(tex->gc, tex->ptuv->intformat, w, h, tex->ptuv->format, tex->ptuv->dataformat))
|
||||
return;
|
||||
|
||||
/* Iterate each UV macroblock like we do in evas_convert_yuv.c */
|
||||
base_h = (mb_h >> 1) + (mb_h & 0x1);
|
||||
|
@ -1701,7 +1753,7 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
|
|||
|
||||
for (mb_x = 0; mb_x < mb_w * 2; mb_x++, rmb_x += 64 * 32)
|
||||
{
|
||||
_tex_sub_2d(x, ry[offset], 32, 32,
|
||||
_tex_sub_2d(tex->gc, x, ry[offset], 32, 32,
|
||||
tex->ptuv->format, tex->ptuv->dataformat,
|
||||
rows[mb_y + base_h] + rmb_x);
|
||||
step++;
|
||||
|
@ -1726,6 +1778,6 @@ evas_gl_common_texture_nv12tiled_update(Evas_GL_Texture *tex, DATA8 **rows, unsi
|
|||
ry = mb_y * 2 * 32;
|
||||
|
||||
for (mb_x = 0; mb_x < mb_w; mb_x++, x += 32, rmb_x += 64 * 32)
|
||||
_tex_sub_2d(x, ry, 64, 32, tex->ptuv->format, tex->ptuv->dataformat, rows[mb_y + base_h] + rmb_x);
|
||||
_tex_sub_2d(tex->gc, x, ry, 64, 32, tex->ptuv->format, tex->ptuv->dataformat, rows[mb_y + base_h] + rmb_x);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue