glamor_render: Don't fallback when rendering glyphs with OpOver.

Signed-off-by: Zhigang Gong <zhigang.gong@linux.intel.com>
This commit is contained in:
Zhigang Gong 2012-06-21 19:29:06 +08:00 committed by Eric Anholt
parent 7acbe89561
commit ea4c22716c

View File

@ -996,7 +996,8 @@ Bool glamor_composite_choose_shader(CARD8 op,
&source_solid_color[2], &source_solid_color[2],
&source_solid_color[3], &source_solid_color[3],
PICT_a8r8g8b8); PICT_a8r8g8b8);
} } else
goto fail;
} else { } else {
key.source = SHADER_SOURCE_TEXTURE_ALPHA; key.source = SHADER_SOURCE_TEXTURE_ALPHA;
} }
@ -1012,7 +1013,8 @@ Bool glamor_composite_choose_shader(CARD8 op,
&mask_solid_color[1], &mask_solid_color[1],
&mask_solid_color[2], &mask_solid_color[2],
&mask_solid_color[3], PICT_a8r8g8b8); &mask_solid_color[3], PICT_a8r8g8b8);
} } else
goto fail;
} else { } else {
key.mask = SHADER_MASK_TEXTURE_ALPHA; key.mask = SHADER_MASK_TEXTURE_ALPHA;
} }
@ -1921,6 +1923,7 @@ glamor_composite_glyph_rects(CARD8 op,
{ {
int n; int n;
glamor_composite_rect_t *r; glamor_composite_rect_t *r;
Bool ok;
ValidatePicture(src); ValidatePicture(src);
ValidatePicture(dst); ValidatePicture(dst);
@ -1936,10 +1939,29 @@ glamor_composite_glyph_rects(CARD8 op,
mask_pixmap_priv = glamor_get_pixmap_private(glamor_get_drawable_pixmap(mask->pDrawable)); mask_pixmap_priv = glamor_get_pixmap_private(glamor_get_drawable_pixmap(mask->pDrawable));
if (src->pDrawable) if (src->pDrawable)
src_pixmap_priv = glamor_get_pixmap_private(glamor_get_drawable_pixmap(src->pDrawable)); src_pixmap_priv = glamor_get_pixmap_private(glamor_get_drawable_pixmap(src->pDrawable));
if (glamor_composite_with_shader(op, src, mask, dst, src_pixmap_priv,
if (mask && mask->componentAlpha) {
if (op == PictOpOver) {
ok = glamor_composite_with_shader(PictOpOutReverse,
src, mask, dst, src_pixmap_priv,
mask_pixmap_priv, dst_pixmap_priv, nrect, rects);
if (!ok)
goto fallback;
ok |= glamor_composite_with_shader(PictOpAdd,
src, mask, dst, src_pixmap_priv,
mask_pixmap_priv, dst_pixmap_priv, nrect, rects);
if (ok)
return;
assert(0);
}
} else {
if (glamor_composite_with_shader(op, src, mask, dst, src_pixmap_priv,
mask_pixmap_priv, dst_pixmap_priv, nrect, rects)) mask_pixmap_priv, dst_pixmap_priv, nrect, rects))
return; return;
}
} }
fallback:
n = nrect; n = nrect;
r = rects; r = rects;