summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-03-09 10:37:34 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-03-09 10:37:34 +0000
commitbd62dc73dcdbab34aa5c83382e46c7315d554a1a (patch)
treedce61f12607f39174494c8dc9c8712c176bcfb96
parentc25a3f7f46010660f441070ab7b9d5d1bc39ed0d (diff)
sna/traps: Apply somes simple but common operator reduction for clipmasks
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/sna_trapezoids.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/sna/sna_trapezoids.c b/src/sna/sna_trapezoids.c
index e28c6690..8c6cf346 100644
--- a/src/sna/sna_trapezoids.c
+++ b/src/sna/sna_trapezoids.c
@@ -3354,8 +3354,10 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
struct inplace inplace;
span_func_t span;
PixmapPtr pixmap;
+ struct sna_pixmap *priv;
RegionRec region;
uint32_t color;
+ bool unbounded;
int16_t dst_x, dst_y;
int dx, dy;
int n;
@@ -3380,18 +3382,33 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
return false;
}
+ pixmap = get_drawable_pixmap(dst->pDrawable);
+ priv = sna_pixmap(pixmap);
+ if (priv == NULL) {
+ DBG(("%s: fallback -- unattached\n", __FUNCTION__));
+ return false;
+ }
+
+ unbounded = false;
switch (op) {
case PictOpIn:
+ unbounded = true;
+ if (priv->clear && priv->clear_color == 0xff)
+ op = PictOpSrc;
+ break;
case PictOpAdd:
+ if (priv->clear && priv->clear_color == 0)
+ op = PictOpSrc;
+ break;
case PictOpSrc:
- if (!fallback && is_gpu(dst->pDrawable))
- return false;
break;
default:
DBG(("%s: fallback -- can not perform op [%d] in place\n",
__FUNCTION__, op));
return false;
}
+ if (!fallback && is_gpu(dst->pDrawable))
+ return false;
DBG(("%s: format=%x, op=%d, color=%x\n",
__FUNCTION__, dst->format, op, color));
@@ -3497,7 +3514,6 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
op == PictOpSrc ? MOVE_WRITE : MOVE_WRITE | MOVE_READ))
return true;
- pixmap = get_drawable_pixmap(dst->pDrawable);
get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y);
inplace.ptr = pixmap->devPrivate.ptr;
@@ -3506,7 +3522,7 @@ trapezoid_span_inplace(CARD8 op, PicturePtr src, PicturePtr dst,
inplace.opacity = color >> 24;
tor_render(NULL, &tor, (void*)&inplace,
- dst->pCompositeClip, span, op == PictOpIn);
+ dst->pCompositeClip, span, unbounded);
tor_fini(&tor);