jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=7d6bb7fe5af6ea8efb88ed9438a6d4e1a2b67ef8

commit 7d6bb7fe5af6ea8efb88ed9438a6d4e1a2b67ef8
Author: Jean-Philippe Andre <jp.an...@samsung.com>
Date:   Thu Feb 5 22:27:27 2015 +0900

    Evas masking: Fix GL masking with maps and stuff
    
    This fixes an issue spotted after the previous fix.
    Passing the Y-invert flag is necessary because in the usual
    case a map is rendered with Y-invert (OpenGL coords vs. Evas coords)
    but in case a map is rendered in an FBO (another map's surface)
    then Y-invert must be unset.
---
 .../evas/engines/gl_common/evas_gl_context.c       | 43 +++++++++++++++++++---
 .../engines/gl_common/shader/evas_gl_shaders.x     |  8 ++--
 .../gl_common/shader/map_mask_bgra_vert.shd        |  9 +++--
 3 files changed, 48 insertions(+), 12 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 9736d57..55118ea 100644
--- a/src/modules/evas/engines/gl_common/evas_gl_context.c
+++ b/src/modules/evas/engines/gl_common/evas_gl_context.c
@@ -2706,6 +2706,7 @@ 
evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
    gc->pipe[pn].array.use_texuv2 = (utexture || uvtexture) ? 1 : 0;
    gc->pipe[pn].array.use_texuv3 = (utexture) ? 1 : 0;
    gc->pipe[pn].array.use_texm = !!mtex;
+   gc->pipe[pn].array.use_texa = !!mtex;
    gc->pipe[pn].array.use_texsam = gc->pipe[pn].array.use_texm;
 
    pipe_region_expand(gc, pn, x, y, w, h);
@@ -2768,17 +2769,27 @@ 
evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
 
    if (mtex)
      {
-        GLfloat glmdx = 0.f, glmdy = 0.f, glmdw = 1.f, glmdh = 1.f;
+        GLfloat glmdx = 0.f, glmdy = 0.f, glmdw = 1.f, glmdh = 1.f, yinv = 
-1.f;
+        GLfloat gw = gc->w, gh = gc->h;
 
         // Note: I couldn't write any test case where it was necessary
         // to know the mask position in its texture. Thus these unused vars.
         (void) mx; (void) my; (void) mw; (void) mh;
 
-        if (gc->w) glmdx = (GLfloat) mdx / (GLfloat) gc->w;
-        if (gc->h) glmdy = (GLfloat) mdy / (GLfloat) gc->h;
-        if (mdw) glmdw = (GLfloat) gc->w / (GLfloat) mdw;
-        if (mdh) glmdh = (GLfloat) gc->h / (GLfloat) mdh ;
+        if (!((gc->pipe[0].shader.surface == gc->def_surface) ||
+              (!gc->pipe[0].shader.surface)))
+          {
+             gw = gc->pipe[0].shader.surface->w;
+             gh = gc->pipe[0].shader.surface->h;
+             yinv = 1.f;
+          }
 
+        if (gw) glmdx = (GLfloat) mdx / (GLfloat) gw;
+        if (gh) glmdy = (GLfloat) mdy / (GLfloat) gh;
+        if (mdw) glmdw = (GLfloat) gw / (GLfloat) mdw;
+        if (mdh) glmdh = (GLfloat) gh / (GLfloat) mdh;
+
+        // FIXME!!!
         // We seriously need uniforms here. Abusing tex_coordm for storage.
         // Passing mask x,y (on canvas) to the fragment shader
         PUSH_TEXM(pn, glmdx, glmdy);
@@ -2796,6 +2807,14 @@ 
evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
         PUSH_TEXSAM(pn, glmdw, glmdh);
         PUSH_TEXSAM(pn, glmdw, glmdh);
 
+        // Abusing tex_coorda to pass Y-invert flag
+        PUSH_TEXA(pn, 1.f, yinv);
+        PUSH_TEXA(pn, 1.f, yinv);
+        PUSH_TEXA(pn, 1.f, yinv);
+        PUSH_TEXA(pn, 1.f, yinv);
+        PUSH_TEXA(pn, 1.f, yinv);
+        PUSH_TEXA(pn, 1.f, yinv);
+
         //DBG("Orig %d,%d - %dx%d --> %f,%f - %f x %f", mdx, mdy, mdw, mdh,
         //    glmdx, glmdy, glmdw, glmdh);
      }
@@ -3284,7 +3303,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
                }
 
              /* Alpha plane */
-             if (gc->pipe[i].array.use_texa)
+             if (gc->pipe[i].array.use_texa && (gc->pipe[i].region.type != 
RTYPE_MAP))
                 {
                    glEnableVertexAttribArray(SHAD_TEXA);
                    GLERR(__FUNCTION__, __FILE__, __LINE__, "");
@@ -3324,6 +3343,18 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
 
                    MASK_TEXTURE += 1;
                }
+             else if (gc->pipe[i].region.type == RTYPE_MAP)
+               {
+                  /* FIXME:
+                   * This is a workaround as we hijack some tex ids
+                   * (namely tex_coordm, tex_coorda and tex_sample) for map 
masking.
+                   * These masking shaders should definitely use uniforms.
+                   */
+                  glEnableVertexAttribArray(SHAD_TEXA);
+                  GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+                  glVertexAttribPointer(SHAD_TEXA, 2, GL_FLOAT, GL_FALSE, 0, 
(void *)texa_ptr);
+                  GLERR(__FUNCTION__, __FILE__, __LINE__, "");
+               }
              else
                {
                   glDisableVertexAttribArray(SHAD_TEXA);
diff --git a/src/modules/evas/engines/gl_common/shader/evas_gl_shaders.x 
b/src/modules/evas/engines/gl_common/shader/evas_gl_shaders.x
index cffc70b..3a32e09 100644
--- a/src/modules/evas/engines/gl_common/shader/evas_gl_shaders.x
+++ b/src/modules/evas/engines/gl_common/shader/evas_gl_shaders.x
@@ -2833,7 +2833,7 @@ static const char const map_mask_bgra_vert_glsl[] =
    "precision highp float;\n"
    "#endif\n"
    "attribute vec4 vertex, color;\n"
-   "attribute vec2 tex_coord, tex_coordm, tex_sample;\n"
+   "attribute vec2 tex_coord, tex_coordm, tex_sample, tex_coorda;\n"
    "uniform mat4 mvp;\n"
    "varying vec2 tex_c;\n"
    "varying vec4 mask_Position, col, mask_Absolute;\n"
@@ -2842,8 +2842,10 @@ static const char const map_mask_bgra_vert_glsl[] =
    "   gl_Position = mvp * vertex;\n"
    "   tex_c = tex_coord;\n"
    "   col = color;\n"
-   "   // Assume Y-invert on mask, normalize (screen to texture mode 
coordinates)\n"
-   "   mask_Position = mvp * vertex * vec4(0.5, -0.5, 0.5, 0.5) + vec4(0.5, 
0.5, 0, 0);\n"
+   "   // tex_coorda contains the Y-invert flag\n"
+   "   // tex_coordm contains the X,Y position of the mask\n"
+   "   // tex_sample contains the W,H size of the mask (inverted)\n"
+   "   mask_Position = mvp * vertex * vec4(tex_coorda.x * 0.5, tex_coorda.y * 
0.5, 0.5, 0.5) + vec4(0.5, 0.5, 0, 0);\n"
    "   mask_Absolute = vec4(tex_coordm, tex_sample); // x, y, 1/w, 1/h on 
canvas in GL coords\n"
    "}\n";
 Evas_GL_Program_Source shader_map_mask_bgra_vert_src =
diff --git a/src/modules/evas/engines/gl_common/shader/map_mask_bgra_vert.shd 
b/src/modules/evas/engines/gl_common/shader/map_mask_bgra_vert.shd
index a7a537d..7b0c968 100644
--- a/src/modules/evas/engines/gl_common/shader/map_mask_bgra_vert.shd
+++ b/src/modules/evas/engines/gl_common/shader/map_mask_bgra_vert.shd
@@ -2,7 +2,7 @@
 precision highp float;
 #endif
 attribute vec4 vertex, color;
-attribute vec2 tex_coord, tex_coordm, tex_sample;
+attribute vec2 tex_coord, tex_coordm, tex_sample, tex_coorda;
 uniform mat4 mvp;
 varying vec2 tex_c;
 varying vec4 mask_Position, col, mask_Absolute;
@@ -12,7 +12,10 @@ void main()
    tex_c = tex_coord;
    col = color;
 
-   // Assume Y-invert on mask, normalize (screen to texture mode coordinates)
-   mask_Position = mvp * vertex * vec4(0.5, -0.5, 0.5, 0.5) + vec4(0.5, 0.5, 
0, 0);
+   // tex_coorda contains the Y-invert flag
+   // tex_coordm contains the X,Y position of the mask
+   // tex_sample contains the W,H size of the mask (inverted)
+
+   mask_Position = mvp * vertex * vec4(tex_coorda.x * 0.5, tex_coorda.y * 0.5, 
0.5, 0.5) + vec4(0.5, 0.5, 0, 0);
    mask_Absolute = vec4(tex_coordm, tex_sample); // x, y, 1/w, 1/h on canvas 
in GL coords
 }

-- 


Reply via email to