summaryrefslogtreecommitdiff
path: root/saa/saa_render.c
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2011-12-14 12:38:27 +0100
committerThomas Hellstrom <thellstrom@vmware.com>2011-12-15 08:32:14 +0100
commit5748c33535bc7d3009b9758653885e6ae0e73002 (patch)
tree311799a48c3d1f7c55f79aa8f8f4fa3fe758fba2 /saa/saa_render.c
parentf664e31d73bd31594e069d8bcca872687b84d8d9 (diff)
saa, vmwgfx: Fix saa_copy_composite
The traditional accelerated copy methods aren't format aware. Make saa copy format aware,and pass formats on to the driver copy function if available. If the driver can't handle format conversions it needs to return FALSE. This fixes format confusion in the copy composite fastpath. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Diffstat (limited to 'saa/saa_render.c')
-rw-r--r--saa/saa_render.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/saa/saa_render.c b/saa/saa_render.c
index 3c441da..c69f2c9 100644
--- a/saa/saa_render.c
+++ b/saa/saa_render.c
@@ -311,35 +311,29 @@ saa_copy_composite(CARD8 op,
ySrc + height > pSrc->pDrawable->height)
return FALSE;
- if (saa_pixmap(saa_get_drawable_pixmap(pSrc->pDrawable))->auth_loc !=
- saa_loc_driver)
- return FALSE;
+ if (op == PictOpSrc ||
+ (op == PictOpOver && PICT_FORMAT_A(pSrc->format) == 0 &&
+ pMask == NULL)) {
- if ((op == PictOpSrc &&
- (pSrc->format == pDst->format ||
- (PICT_FORMAT_COLOR(pDst->format) &&
- PICT_FORMAT_COLOR(pSrc->format) &&
- pDst->format == PICT_FORMAT(PICT_FORMAT_BPP(pSrc->format),
- PICT_FORMAT_TYPE(pSrc->format),
- 0,
- PICT_FORMAT_R(pSrc->format),
- PICT_FORMAT_G(pSrc->format),
- PICT_FORMAT_B(pSrc->format))))) ||
- (op == PictOpOver && pSrc->format == pDst->format &&
- !PICT_FORMAT_A(pSrc->format))) {
- Bool ret;
int xoff, yoff;
- PixmapPtr pixmap = saa_get_pixmap(pDst->pDrawable, &xoff, &yoff);
-
- if (saa_pixmap(pixmap)->auth_loc != saa_loc_driver)
+ PixmapPtr dst_pix = saa_get_pixmap(pDst->pDrawable, &xoff, &yoff);
+ struct saa_pixmap *dst_spix = saa_pixmap(dst_pix);
+ struct saa_pixmap *src_spix =
+ saa_pixmap(saa_get_drawable_pixmap(pSrc->pDrawable));
+ int ret;
+
+ if (src_spix->auth_loc != saa_loc_driver ||
+ dst_spix->auth_loc != saa_loc_driver)
return FALSE;
+ src_spix->src_format = pSrc->format;
+ dst_spix->dst_format = pDst->format;
+
xDst += pDst->pDrawable->x;
yDst += pDst->pDrawable->y;
xSrc += pSrc->pDrawable->x;
ySrc += pSrc->pDrawable->y;
-
/*
* Dst region is in backing pixmap space. We need to
* translate it.
@@ -350,6 +344,10 @@ saa_copy_composite(CARD8 op,
REGION_NUM_RECTS(dst_region),
xSrc - xDst, ySrc - yDst, FALSE, FALSE);
REGION_TRANSLATE(pScreen, dst_region, xoff, yoff);
+
+ src_spix->src_format = 0;
+ dst_spix->dst_format = 0;
+
if (ret)
return TRUE;
}