jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=676c10b1538f6dbc96cdb871261b8846104e421a
commit 676c10b1538f6dbc96cdb871261b8846104e421a Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Fri Apr 3 15:37:09 2015 +0900 Evas GL common: Fix GL masking with 12,21,22 sampling This is a new feature introduced by the shaders refactoring: even masking shaders now support smooth sampling of the masked image using the special 12,21,22 shaders. Also, refactor the list of texture bindings so that it's automatically generated by the script, as opposed to being a manual list... --- .../evas/engines/gl_common/evas_gl_context.c | 98 ++++++---------------- .../evas/engines/gl_common/shader/evas_gl_enum.x | 83 ++++++++++++++++++ .../evas/engines/gl_common/shader/gen_shaders.sh | 28 ++++++- 3 files changed, 137 insertions(+), 72 deletions(-) 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 83f350d..0795440 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_context.c +++ b/src/modules/evas/engines/gl_common/evas_gl_context.c @@ -1,3 +1,4 @@ +#define _EVAS_GL_CONTEXT_C #include "evas_gl_private.h" #ifdef HAVE_DLSYM @@ -632,6 +633,7 @@ evas_gl_common_context_new(void) if (!shared) { const char *ext; + int shd; shared = calloc(1, sizeof(Evas_GL_Shared)); ext = (const char *) glGetString(GL_EXTENSIONS); @@ -880,68 +882,14 @@ evas_gl_common_context_new(void) if (!evas_gl_common_shader_program_init(shared)) goto error; -#define SHADER_TEXTURE_ADD(Shared, Shader, Name) \ - glUseProgram(Shared->shader[SHADER_##Shader].prog); \ - glUniform1i(glGetUniformLocation(Shared->shader[SHADER_##Shader].prog, #Name), Shared->shader[SHADER_##Shader].tex_count++); - - SHADER_TEXTURE_ADD(shared, YUV, tex); - SHADER_TEXTURE_ADD(shared, YUV, texu); - SHADER_TEXTURE_ADD(shared, YUV, texv); - - SHADER_TEXTURE_ADD(shared, YUV_MASK, tex); - SHADER_TEXTURE_ADD(shared, YUV_MASK, texu); - SHADER_TEXTURE_ADD(shared, YUV_MASK, texv); - SHADER_TEXTURE_ADD(shared, YUV_MASK, texm); - - SHADER_TEXTURE_ADD(shared, YUY2, tex); - SHADER_TEXTURE_ADD(shared, YUY2, texuv); - - SHADER_TEXTURE_ADD(shared, YUY2_MASK, tex); - SHADER_TEXTURE_ADD(shared, YUY2_MASK, texuv); - SHADER_TEXTURE_ADD(shared, YUY2_MASK, texm); - - SHADER_TEXTURE_ADD(shared, NV12, tex); - SHADER_TEXTURE_ADD(shared, NV12, texuv); - - SHADER_TEXTURE_ADD(shared, NV12_MASK, tex); - SHADER_TEXTURE_ADD(shared, NV12_MASK, texuv); - SHADER_TEXTURE_ADD(shared, NV12_MASK, texm); - - SHADER_TEXTURE_ADD(shared, YUV_NOMUL, tex); - SHADER_TEXTURE_ADD(shared, YUV_NOMUL, texu); - SHADER_TEXTURE_ADD(shared, YUV_NOMUL, texv); - - SHADER_TEXTURE_ADD(shared, YUY2_NOMUL, tex); - SHADER_TEXTURE_ADD(shared, YUY2_NOMUL, texuv); - - SHADER_TEXTURE_ADD(shared, NV12_NOMUL, tex); - SHADER_TEXTURE_ADD(shared, NV12_NOMUL, texuv); - - // Note: there is no nomul version for YUV,YUY2,NV12,RGB+A with MASK - - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR, tex); - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR, texa); - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR_NOMUL, tex); - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR_NOMUL, texa); - - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR_MASK, tex); - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR_MASK, texa); - SHADER_TEXTURE_ADD(shared, RGB_A_PAIR_MASK, texm); - - SHADER_TEXTURE_ADD(shared, IMG_MASK, tex); - SHADER_TEXTURE_ADD(shared, IMG_MASK, texm); - SHADER_TEXTURE_ADD(shared, IMG_MASK_NOMUL, tex); - SHADER_TEXTURE_ADD(shared, IMG_MASK_NOMUL, texm); - - SHADER_TEXTURE_ADD(shared, IMG_BGRA_MASK, tex); - SHADER_TEXTURE_ADD(shared, IMG_BGRA_MASK, texm); - SHADER_TEXTURE_ADD(shared, IMG_BGRA_MASK_NOMUL, tex); - SHADER_TEXTURE_ADD(shared, IMG_BGRA_MASK_NOMUL, texm); - - SHADER_TEXTURE_ADD(shared, FONT_MASK, tex); - SHADER_TEXTURE_ADD(shared, FONT_MASK, texm); - - SHADER_TEXTURE_ADD(shared, RECT_MASK, texm); + /* Bind textures */ + for (shd = 0; _shaders_textures[shd].id != SHADER_LAST; shd++) + { + GLuint loc; + glUseProgram(shared->shader[_shaders_textures[shd].id].prog); + loc = glGetUniformLocation(shared->shader[_shaders_textures[shd].id].prog, _shaders_textures[shd].tname); + glUniform1i(loc, shared->shader[_shaders_textures[shd].id].tex_count++); + } if (gc->state.current.cur_prog == PRG_INVALID) glUseProgram(shared->shader[0].prog); @@ -1550,16 +1498,19 @@ evas_gl_common_shader_select(Evas_Engine_GL_Context *gc, } // color mul - if ((a == 255) && (r == 255) && (g == 255) && (b == 255) && p) + if ((a == 255) && (r == 255) && (g == 255) && (b == 255)) { - for (k = 0; k < npoints; k++) - if (p[k].col != 0xffffffff) - { - nomul = 0; - break; - } + if (p) + { + for (k = 0; k < npoints; k++) + if (p[k].col != 0xffffffff) + { + nomul = 0; + break; + } + } } - else if (!p) + else nomul = 0; // bgra @@ -3363,6 +3314,10 @@ shader_array_flush(Evas_Engine_GL_Context *gc) gc->state.current.id = gc->pipe[i].shader.id; gc->state.current.cur_prog = gc->pipe[i].shader.cur_prog; gc->state.current.cur_tex = gc->pipe[i].shader.cur_tex; + gc->state.current.cur_texm = gc->pipe[i].shader.cur_texm; + gc->state.current.cur_texa = gc->pipe[i].shader.cur_texa; + gc->state.current.cur_texu = gc->pipe[i].shader.cur_texu; + gc->state.current.cur_texv = gc->pipe[i].shader.cur_texv; gc->state.current.render_op = gc->pipe[i].shader.render_op; // gc->state.current.cx = gc->pipe[i].shader.cx; // gc->state.current.cy = gc->pipe[i].shader.cy; @@ -3391,13 +3346,14 @@ shader_array_flush(Evas_Engine_GL_Context *gc) gc->pipe[i].array.use_texa = 0; gc->pipe[i].array.use_texsam = 0; gc->pipe[i].array.use_mask = 0; + gc->pipe[i].array.anti_alias = 0; gc->pipe[i].array.vertex = NULL; gc->pipe[i].array.color = NULL; gc->pipe[i].array.texuv = NULL; - gc->pipe[i].array.texa = NULL; gc->pipe[i].array.texuv2 = NULL; gc->pipe[i].array.texuv3 = NULL; + gc->pipe[i].array.texa = NULL; gc->pipe[i].array.texsam = NULL; gc->pipe[i].array.mask = NULL; diff --git a/src/modules/evas/engines/gl_common/shader/evas_gl_enum.x b/src/modules/evas/engines/gl_common/shader/evas_gl_enum.x index 4db60a5..5c523fc 100644 --- a/src/modules/evas/engines/gl_common/shader/evas_gl_enum.x +++ b/src/modules/evas/engines/gl_common/shader/evas_gl_enum.x @@ -78,3 +78,86 @@ typedef enum { SHADER_NV12_MASK_NOMUL, SHADER_LAST } Evas_GL_Shader; + +#ifdef _EVAS_GL_CONTEXT_C + +static struct { + Evas_GL_Shader id; + const char *tname; +} _shaders_textures[] = { + { SHADER_FONT_MASK, "tex" }, + { SHADER_FONT_MASK, "texm" }, + { SHADER_IMG_MASK, "tex" }, + { SHADER_IMG_MASK, "texm" }, + { SHADER_IMG_BGRA_MASK, "tex" }, + { SHADER_IMG_BGRA_MASK, "texm" }, + { SHADER_IMG_12_MASK, "tex" }, + { SHADER_IMG_12_MASK, "texm" }, + { SHADER_IMG_21_MASK, "tex" }, + { SHADER_IMG_21_MASK, "texm" }, + { SHADER_IMG_22_MASK, "tex" }, + { SHADER_IMG_22_MASK, "texm" }, + { SHADER_IMG_12_BGRA_MASK, "tex" }, + { SHADER_IMG_12_BGRA_MASK, "texm" }, + { SHADER_IMG_21_BGRA_MASK, "tex" }, + { SHADER_IMG_21_BGRA_MASK, "texm" }, + { SHADER_IMG_22_BGRA_MASK, "tex" }, + { SHADER_IMG_22_BGRA_MASK, "texm" }, + { SHADER_IMG_MASK_NOMUL, "tex" }, + { SHADER_IMG_MASK_NOMUL, "texm" }, + { SHADER_IMG_BGRA_MASK_NOMUL, "tex" }, + { SHADER_IMG_BGRA_MASK_NOMUL, "texm" }, + { SHADER_IMG_12_MASK_NOMUL, "tex" }, + { SHADER_IMG_12_MASK_NOMUL, "texm" }, + { SHADER_IMG_21_MASK_NOMUL, "tex" }, + { SHADER_IMG_21_MASK_NOMUL, "texm" }, + { SHADER_IMG_22_MASK_NOMUL, "tex" }, + { SHADER_IMG_22_MASK_NOMUL, "texm" }, + { SHADER_IMG_12_BGRA_MASK_NOMUL, "tex" }, + { SHADER_IMG_12_BGRA_MASK_NOMUL, "texm" }, + { SHADER_IMG_21_BGRA_MASK_NOMUL, "tex" }, + { SHADER_IMG_21_BGRA_MASK_NOMUL, "texm" }, + { SHADER_IMG_22_BGRA_MASK_NOMUL, "tex" }, + { SHADER_IMG_22_BGRA_MASK_NOMUL, "texm" }, + { SHADER_RGB_A_PAIR_MASK, "texa" }, + { SHADER_RGB_A_PAIR_MASK, "texm" }, + { SHADER_RGB_A_PAIR_MASK_NOMUL, "texa" }, + { SHADER_RGB_A_PAIR_MASK_NOMUL, "texm" }, + { SHADER_YUV, "tex" }, + { SHADER_YUV, "texu" }, + { SHADER_YUV, "texv" }, + { SHADER_YUV_NOMUL, "tex" }, + { SHADER_YUV_NOMUL, "texu" }, + { SHADER_YUV_NOMUL, "texv" }, + { SHADER_YUV_MASK, "tex" }, + { SHADER_YUV_MASK, "texu" }, + { SHADER_YUV_MASK, "texv" }, + { SHADER_YUV_MASK, "texm" }, + { SHADER_YUV_MASK_NOMUL, "tex" }, + { SHADER_YUV_MASK_NOMUL, "texu" }, + { SHADER_YUV_MASK_NOMUL, "texv" }, + { SHADER_YUV_MASK_NOMUL, "texm" }, + { SHADER_YUY2, "tex" }, + { SHADER_YUY2, "texuv" }, + { SHADER_YUY2_NOMUL, "tex" }, + { SHADER_YUY2_NOMUL, "texuv" }, + { SHADER_YUY2_MASK, "tex" }, + { SHADER_YUY2_MASK, "texuv" }, + { SHADER_YUY2_MASK, "texm" }, + { SHADER_YUY2_MASK_NOMUL, "tex" }, + { SHADER_YUY2_MASK_NOMUL, "texuv" }, + { SHADER_YUY2_MASK_NOMUL, "texm" }, + { SHADER_NV12, "tex" }, + { SHADER_NV12, "texuv" }, + { SHADER_NV12_NOMUL, "tex" }, + { SHADER_NV12_NOMUL, "texuv" }, + { SHADER_NV12_MASK, "tex" }, + { SHADER_NV12_MASK, "texuv" }, + { SHADER_NV12_MASK, "texm" }, + { SHADER_NV12_MASK_NOMUL, "tex" }, + { SHADER_NV12_MASK_NOMUL, "texuv" }, + { SHADER_NV12_MASK_NOMUL, "texm" }, + { SHADER_LAST, NULL } +}; + +#endif // _EVAS_GL_CONTEXT_C diff --git a/src/modules/evas/engines/gl_common/shader/gen_shaders.sh b/src/modules/evas/engines/gl_common/shader/gen_shaders.sh index 7d6d21c..815ef57 100755 --- a/src/modules/evas/engines/gl_common/shader/gen_shaders.sh +++ b/src/modules/evas/engines/gl_common/shader/gen_shaders.sh @@ -59,6 +59,7 @@ printf "#include \"../evas_gl_private.h\"\n\n" >> ${OUTPUT} shaders_source="" shaders_enum="" shaders_type=(frag vert) +shaders_textures="" # Generate SHD files LIST="" @@ -79,6 +80,7 @@ for (( i = 0; i < ${#SHADERS[@]} ; i++ )) ; do nomul=0 afill=0 sam="SAM11" + tex="" # Urgh. Some fixups case $TYPE in @@ -91,8 +93,13 @@ for (( i = 0; i < ${#SHADERS[@]} ; i++ )) ; do UP=`upper $opt` OPTS="$OPTS -DSHD_${UP}" case $opt in + tex) tex="${tex}tex ";; + mask) tex="${tex}texm " ; mask=1;; + texa) tex="${tex}texa ";; + yuv) tex="${tex}texu texv ";; + nv12) tex="${tex}texuv ";; + yuy2) tex="${tex}texuv ";; bgra) bgra=1;; - mask) mask=1;; nomul) nomul=1;; afill) afill=1;; external) FGM=${FGM_HEADER_OES};; @@ -131,6 +138,14 @@ for (( i = 0; i < ${#SHADERS[@]} ; i++ )) ; do shaders_source="${shaders_source} { SHADER_${UNAME}, &(shader_${name}_vert_src), &(shader_${name}_frag_src), \"${name}\", SHD_${TYPE}, SHD_${sam}, ${bgra}, ${mask}, ${nomul}, ${afill} },\n" shaders_enum="${shaders_enum} SHADER_${UNAME},\n" + + # Bind textures to the programs. Only if there is more than 1 texture. + textures=(${tex}) + if [ ${#textures[@]} -ge 2 ] ; then + for tname in ${tex} ; do + shaders_textures="${shaders_textures} { SHADER_${UNAME}, \"${tname}\" },\n" + done + fi done printf " @@ -154,6 +169,17 @@ printf "/* DO NOT MODIFY THIS FILE AS IT IS AUTO-GENERATED\n * See: $0 */ typedef enum { ${shaders_enum} SHADER_LAST } Evas_GL_Shader; + +#ifdef _EVAS_GL_CONTEXT_C + +static struct { + Evas_GL_Shader id; + const char *tname; +} _shaders_textures[] = { +${shaders_textures} { SHADER_LAST, NULL } +}; + +#endif // _EVAS_GL_CONTEXT_C " >| ${OUTPUT_ENUM} # You can remove the files now --