Evas masking: Use mask_smooth to differentiate "shaders"

If mask_smooth changes, it should trigger a flush of
the pipeline (and call glDrawArrays).

This may or may not fix some potential bugs with masking.
This commit is contained in:
Jean-Philippe Andre 2015-03-02 20:38:41 +09:00
parent df5f9f7c55
commit 21051d3252
2 changed files with 35 additions and 25 deletions

View File

@ -468,6 +468,7 @@ struct _Evas_Engine_GL_Context
int cx, cy, cw, ch;
int smooth;
int blend;
int mask_smooth;
int clip;
} shader;
struct {
@ -490,7 +491,6 @@ struct _Evas_Engine_GL_Context
Eina_Bool use_texsam : 1;
Eina_Bool use_texm : 1;
Eina_Bool anti_alias : 1;
Eina_Bool mask_smooth : 1;
Evas_GL_Image *im;
GLuint buffer;
int buffer_alloc;

View File

@ -1480,7 +1480,8 @@ _evas_gl_common_context_push(int rtype,
Eina_Bool blend,
Eina_Bool smooth,
Eina_Bool clip,
int cx, int cy, int cw, int ch)
int cx, int cy, int cw, int ch,
Eina_Bool mask_smooth)
{
GLuint current_tex = 0;
int pn = 0;
@ -1503,7 +1504,8 @@ _evas_gl_common_context_push(int rtype,
{
if ((gc->pipe[i].region.type == rtype)
&& (!tex || gc->pipe[i].shader.cur_tex == current_tex)
&& (!texm || gc->pipe[i].shader.cur_texm == texm->pt->texture)
&& (!texm || ((gc->pipe[i].shader.cur_texm == texm->pt->texture)
&& (gc->pipe[i].shader.mask_smooth == mask_smooth)))
&& (gc->pipe[i].shader.cur_prog == prog)
&& (gc->pipe[i].shader.smooth == smooth)
&& (gc->pipe[i].shader.blend == blend)
@ -1544,8 +1546,9 @@ _evas_gl_common_context_push(int rtype,
#else
if (!((gc->pipe[pn].region.type == rtype)
&& (!tex || gc->pipe[pn].shader.cur_tex == current_tex)
&& (!texa || gc->pipe[pn].shader.cur_texa == current_texa)
&& (!texm || gc->pipe[pn].shader.cur_texm == current_texm)
/* && (!texa || gc->pipe[pn].shader.cur_texa == current_texa) */
&& (!texm || ((gc->pipe[i].shader.cur_texm == texm->pt->texture)
&& (gc->pipe[i].shader.mask_smooth == mask_smooth)))
&& (gc->pipe[pn].shader.cur_prog == prog)
&& (gc->pipe[pn].shader.smooth == smooth)
&& (gc->pipe[pn].shader.blend == blend)
@ -1672,6 +1675,7 @@ again:
gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -1686,7 +1690,6 @@ again:
gc->pipe[pn].array.use_texa = 0;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.mask_smooth = mask_smooth;
}
else
{
@ -1701,7 +1704,7 @@ again:
&& (gc->pipe[i].shader.blend == blend)
&& (gc->pipe[i].shader.render_op == gc->dc->render_op)
&& (gc->pipe[i].shader.clip == 0)
// todo: save & compare mask_smooth
&& (gc->pipe[i].shader.mask_smooth == mask_smooth)
)
{
found = 1;
@ -1726,6 +1729,7 @@ again:
gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -1740,7 +1744,6 @@ again:
gc->pipe[pn].array.use_texa = 0;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.mask_smooth = mask_smooth;
}
}
#else
@ -1750,6 +1753,7 @@ again:
|| (gc->pipe[pn].shader.blend != blend)
|| (gc->pipe[pn].shader.render_op != gc->dc->render_op)
|| (gc->pipe[pn].shader.clip != 0)
|| (mtex && (gc->pipe[pn].shader.mask_smooth != mask_smooth))
)
{
shader_array_flush(gc);
@ -1760,6 +1764,7 @@ again:
gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -1777,7 +1782,6 @@ again:
gc->pipe[pn].array.use_texa = 0;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.mask_smooth = mask_smooth;
#endif
pipe_region_expand(gc, pn, x, y, w, h);
@ -1999,7 +2003,8 @@ evas_gl_common_context_image_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
blend,
smooth,
0, 0, 0, 0, 0);
0, 0, 0, 0, 0,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_IMAGE;
gc->pipe[pn].shader.id = shader;
@ -2007,6 +2012,7 @@ evas_gl_common_context_image_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.cur_texm = mtex ? mtex->pt->texture : 0;
gc->pipe[pn].shader.cur_prog = prog;
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = render_op;
gc->pipe[pn].shader.clip = 0;
@ -2023,7 +2029,6 @@ evas_gl_common_context_image_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].array.use_texuv3 = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.use_texsam = sam;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -2089,7 +2094,8 @@ evas_gl_common_context_font_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
1,
0,
0, 0, 0, 0, 0);
0, 0, 0, 0, 0,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_FONT;
gc->pipe[pn].shader.id = shader;
@ -2099,6 +2105,7 @@ evas_gl_common_context_font_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.smooth = 0;
gc->pipe[pn].shader.blend = 1;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -2112,7 +2119,6 @@ evas_gl_common_context_font_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].array.use_texuv3 = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -2167,7 +2173,8 @@ evas_gl_common_context_yuv_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
blend,
smooth,
0, 0, 0, 0, 0);
0, 0, 0, 0, 0,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_YUV;
gc->pipe[pn].shader.id = shader;
@ -2179,6 +2186,7 @@ evas_gl_common_context_yuv_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -2192,7 +2200,6 @@ evas_gl_common_context_yuv_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].array.use_texuv3 = 1;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -2244,7 +2251,8 @@ evas_gl_common_context_yuy2_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
blend,
smooth,
0, 0, 0, 0, 0);
0, 0, 0, 0, 0,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_YUY2;
gc->pipe[pn].shader.id = shader;
@ -2255,6 +2263,7 @@ evas_gl_common_context_yuy2_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -2268,7 +2277,6 @@ evas_gl_common_context_yuy2_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].array.use_texuv3 = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -2319,7 +2327,8 @@ evas_gl_common_context_nv12_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
blend,
smooth,
0, 0, 0, 0, 0);
0, 0, 0, 0, 0,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_NV12;
gc->pipe[pn].shader.id = shader;
@ -2332,6 +2341,7 @@ evas_gl_common_context_nv12_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -2345,7 +2355,6 @@ evas_gl_common_context_nv12_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].array.use_texuv3 = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -2402,7 +2411,8 @@ evas_gl_common_context_rgb_a_pair_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
EINA_TRUE,
smooth,
EINA_FALSE, 0, 0, 0, 0);
EINA_FALSE, 0, 0, 0, 0,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_IMAGE;
gc->pipe[pn].shader.id = shader;
@ -2413,6 +2423,7 @@ evas_gl_common_context_rgb_a_pair_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = EINA_TRUE;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = 0;
gc->pipe[pn].shader.cx = 0;
gc->pipe[pn].shader.cy = 0;
@ -2428,7 +2439,6 @@ evas_gl_common_context_rgb_a_pair_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].array.use_texa = EINA_TRUE;
gc->pipe[pn].array.use_texsam = 0;
gc->pipe[pn].array.use_texm = !!mtex;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -2623,7 +2633,8 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
x, y, w, h,
blend,
smooth,
clip, cx, cy, cw, ch);
clip, cx, cy, cw, ch,
mask_smooth);
gc->pipe[pn].region.type = RTYPE_MAP;
gc->pipe[pn].shader.id = shader;
gc->pipe[pn].shader.cur_tex = tex->pt->texture;
@ -2644,6 +2655,7 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
gc->pipe[pn].shader.smooth = smooth;
gc->pipe[pn].shader.blend = blend;
gc->pipe[pn].shader.render_op = gc->dc->render_op;
gc->pipe[pn].shader.mask_smooth = mask_smooth;
gc->pipe[pn].shader.clip = clip;
gc->pipe[pn].shader.cx = cx;
gc->pipe[pn].shader.cy = cy;
@ -2658,7 +2670,6 @@ evas_gl_common_context_image_map_push(Evas_Engine_GL_Context *gc,
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;
gc->pipe[pn].array.mask_smooth = mask_smooth;
pipe_region_expand(gc, pn, x, y, w, h);
PIPE_GROW(gc, pn, 6);
@ -3352,7 +3363,7 @@ shader_array_flush(Evas_Engine_GL_Context *gc)
if (shared->info.anisotropic > 0.0)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, shared->info.anisotropic);
#endif
if (gc->pipe[i].array.mask_smooth)
if (gc->pipe[i].shader.mask_smooth)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@ -3430,7 +3441,6 @@ 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_texm = 0;
gc->pipe[i].array.mask_smooth = 0;
gc->pipe[i].array.vertex = NULL;
gc->pipe[i].array.color = NULL;