diff options
-rw-r--r-- | saa/saa.h | 2 | ||||
-rw-r--r-- | saa/saa_render.c | 38 | ||||
-rw-r--r-- | vmwgfx/vmwgfx_saa.c | 21 |
3 files changed, 37 insertions, 24 deletions
@@ -74,6 +74,8 @@ struct saa_pixmap { void *addr; void *override; enum saa_pixmap_loc auth_loc; + PictFormatShort src_format; + PictFormatShort dst_format; uint32_t pad[16]; }; 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; } diff --git a/vmwgfx/vmwgfx_saa.c b/vmwgfx/vmwgfx_saa.c index 7788ed5..0a6b98f 100644 --- a/vmwgfx/vmwgfx_saa.c +++ b/vmwgfx/vmwgfx_saa.c @@ -896,10 +896,23 @@ vmwgfx_copy_prepare(struct saa_driver *driver, * Determine surface formats. */ - if (!vmwgfx_hw_accel_stage(src_pixmap, 0, XA_FLAG_RENDER_TARGET, 0)) - return FALSE; - if (!vmwgfx_hw_accel_stage(dst_pixmap, 0, XA_FLAG_RENDER_TARGET, 0)) - return FALSE; + if (src_vpix->base.src_format == 0) { + if (!vmwgfx_hw_accel_stage(src_pixmap, 0, XA_FLAG_RENDER_TARGET, 0)) + return FALSE; + } else { + if (PICT_FORMAT_TYPE(src_vpix->base.src_format) != PICT_TYPE_ARGB || + !vmwgfx_hw_composite_src_stage(src_pixmap, src_vpix->base.src_format)) + return FALSE; + } + + if (dst_vpix->base.dst_format == 0) { + if (!vmwgfx_hw_accel_stage(dst_pixmap, 0, XA_FLAG_RENDER_TARGET, 0)) + return FALSE; + } else { + if (PICT_FORMAT_TYPE(dst_vpix->base.dst_format) != PICT_TYPE_ARGB || + !vmwgfx_hw_composite_dst_stage(dst_pixmap, dst_vpix->base.dst_format)) + return FALSE; + } /* * Create hardware surfaces. |