From 3728c603115e00bce734f967825250d2662c692a Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 15 Mar 2013 13:05:39 +0900 Subject: [PATCH] Fix opengl-es 2.0 engine support to only use GL_UNPACK_ROW_LENGTH if the correct gles extension exists. --- ChangeLog | 5 + NEWS | 1 + .../evas/engines/gl_common/evas_gl_common.h | 4 + .../evas/engines/gl_common/evas_gl_context.c | 8 + .../evas/engines/gl_common/evas_gl_texture.c | 253 +++++++++--------- 5 files changed, 149 insertions(+), 122 deletions(-) diff --git a/ChangeLog b/ChangeLog index 76f31dda2d..e5d7c72aaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-03-15 Carsten Haitzler (The Rasterman) + + * Fix opengl-es 2.0 engine support to only use GL_UNPACK_ROW_LENGTH + if the correct gles extension exists. + 2013-03-14 Mike Blumenkrantz * fix use of ecore_con_*_flush functions with unconnected objects diff --git a/NEWS b/NEWS index a33b5215b7..fd7325c34f 100644 --- a/NEWS +++ b/NEWS @@ -201,3 +201,4 @@ Fixes: * fix bug not check data value when get deiconify message * fix use of ecore_con_*_flush functions with unconnected objects * fix setting of write flags on ecore-con servers during connect + * fix gles support to only use GL_UNPACK_ROW_LENGTH if extension exists diff --git a/src/modules/evas/engines/gl_common/evas_gl_common.h b/src/modules/evas/engines/gl_common/evas_gl_common.h index 01f06c2b78..f059dd5a72 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_common.h +++ b/src/modules/evas/engines/gl_common/evas_gl_common.h @@ -42,6 +42,9 @@ #ifndef GL_BGRA # define GL_BGRA 0x80E1 #endif +#ifndef GL_UNPACK_ROW_LENGTH_EXT +# define GL_UNPACK_ROW_LENGTH_EXT 0x0cf2 +#endif #ifndef EGL_NO_CONTEXT # define EGL_NO_CONTEXT 0 @@ -222,6 +225,7 @@ struct _Evas_GL_Shared Eina_Bool tex_rect : 1; Eina_Bool sec_image_map : 1; Eina_Bool bin_program : 1; + Eina_Bool unpack_row_length : 1; // tuning params - per gpu/cpu combo? #define MAX_CUTOUT 512 #define DEF_CUTOUT 512 diff --git a/src/modules/evas/engines/gl_common/evas_gl_context.c b/src/modules/evas/engines/gl_common/evas_gl_context.c index 11d4e0a707..d682a1b2e8 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_context.c +++ b/src/modules/evas/engines/gl_common/evas_gl_context.c @@ -578,6 +578,14 @@ evas_gl_common_context_new(void) shared->info.bin_program = 1; else glsym_glGetProgramBinary = NULL; +#ifdef GL_UNPACK_ROW_LENGTH + shared->info.unpack_row_length = 1; +# ifdef GL_GLES + if (!strstr((char *)ext, "_unpack_subimage")) + shared->info.unpack_row_length = 0; +# endif +#endif + #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT if ((strstr((char *)ext, "GL_EXT_texture_filter_anisotropic"))) glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, diff --git a/src/modules/evas/engines/gl_common/evas_gl_texture.c b/src/modules/evas/engines/gl_common/evas_gl_texture.c index 633c8b643a..52388d047f 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_texture.c +++ b/src/modules/evas/engines/gl_common/evas_gl_texture.c @@ -860,10 +860,11 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) fmt = tex->pt->format; glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); -#ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); -#endif + if (tex->gc->shared->info.unpack_row_length) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } glPixelStorei(GL_UNPACK_ALIGNMENT, 4); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); @@ -896,24 +897,26 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) 1, 1, fmt, tex->pt->dataformat, im->image.data + ((im->cache_entry.h - 1) * im->cache_entry.w) + (im->cache_entry.w - 1)); -#ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, im->cache_entry.w); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - // |xxx - // |xxx - // - _tex_sub_2d(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, - 1, im->cache_entry.h, - fmt, tex->pt->dataformat, - im->image.data + (im->cache_entry.w - 1)); -#else + if (tex->gc->shared->info.unpack_row_length) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, im->cache_entry.w); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + // |xxx + // |xxx + // + _tex_sub_2d(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, + 1, im->cache_entry.h, + fmt, tex->pt->dataformat, + im->image.data + (im->cache_entry.w - 1)); + } + else { DATA32 *tpix, *ps, *pd; int i; @@ -950,7 +953,6 @@ evas_gl_common_texture_update(Evas_GL_Texture *tex, RGBA_Image *im) fmt, tex->pt->dataformat, tpix); } -#endif if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); @@ -1045,10 +1047,11 @@ evas_gl_common_texture_alpha_update(Evas_GL_Texture *tex, DATA8 *pixels, if (!tex->pt) return; glBindTexture(GL_TEXTURE_2D, tex->pt->texture); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); -#ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); -#endif + if (tex->gc->shared->info.unpack_row_length) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + } glPixelStorei(GL_UNPACK_ALIGNMENT, 4); GLERR(__FUNCTION__, __FILE__, __LINE__, ""); _tex_sub_2d(tex->x, tex->y, w, h, tex->pt->format, tex->pt->dataformat, @@ -1121,65 +1124,68 @@ evas_gl_common_texture_yuv_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned i { if (!tex->pt) return; // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2 -#ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - 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]); - 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]); - 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)]); -#else - unsigned int y; - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - 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 ((rows[1] - rows[0]) == (int)w) - _tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]); + if (tex->gc->shared->info.unpack_row_length) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + 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]); + 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]); + 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)]); + } else { - for (y = 0; y < h; y++) - _tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]); + unsigned int y; + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + 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 ((rows[1] - rows[0]) == (int)w) + _tex_sub_2d(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]); + } + + 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 ((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]); + 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]); + } + + 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 ((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)]); + 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]); + } } - - 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 ((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]); - 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]); - } - - 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 ((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)]); - 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]); - } -#endif if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex); @@ -1376,48 +1382,51 @@ evas_gl_common_texture_nv12_update(Evas_GL_Texture *tex, DATA8 **rows, unsigned tex->ptuv = tex->double_buffer.ptuv[tex->double_buffer.source]; // FIXME: works on lowest size 4 pixel high buffers. must also be multiple of 2 -#ifdef GL_UNPACK_ROW_LENGTH - glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); - GLERR(__FUNCTION__, __FILE__, __LINE__, ""); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - 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]); - 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]); -#else - unsigned int y; - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - 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 ((rows[1] - rows[0]) == (int)w) - _tex_sub_2d(0, 0, w, h, tex->pt->format, tex->pt->dataformat, rows[0]); + if (tex->gc->shared->info.unpack_row_length) + { + glPixelStorei(GL_UNPACK_ROW_LENGTH, rows[1] - rows[0]); + GLERR(__FUNCTION__, __FILE__, __LINE__, ""); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + 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]); + 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]); + } else { - for (y = 0; y < h; y++) - _tex_sub_2d(0, y, w, 1, tex->pt->format, tex->pt->dataformat, rows[y]); + unsigned int y; + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + 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 ((rows[1] - rows[0]) == (int)w) + _tex_sub_2d(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]); + } + + 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 ((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]); + 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]); + } } - - 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 ((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]); - 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]); - } -#endif if (tex->pt->texture != tex->gc->pipe[0].shader.cur_tex) { glBindTexture(GL_TEXTURE_2D, tex->gc->pipe[0].shader.cur_tex);