diff options
author | Aaron Plattner <aplattner@nvidia.com> | 2009-11-24 10:21:28 -0800 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2009-11-26 15:41:46 +1000 |
commit | 196aff9b18381d700fb28027186cce6e68ad587c (patch) | |
tree | 27c6589851a81279cfa40ccd59a5d058b46a9754 | |
parent | 8eca8eaef56526b9649b48aa5f83c3d7914cfdc4 (diff) |
Bug #25136: Revert "Fix clipping when windows are used as sources"
That change causes lib(w)fb to make accelerated driver calls after the driver
has entered a software fallback. Most drivers don't expect this, which leads to
corruption or crashes. A change to make this code do the copy in software is
unacceptably slow.
This reverts commit e9aa61e9f0d663d5b34a397b943b4d1df44e873d.
Conflicts:
configure.ac
fb/fbpict.c
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r-- | fb/fb.h | 3 | ||||
-rw-r--r-- | fb/fbpict.c | 118 | ||||
-rw-r--r-- | fb/fbtrap.c | 4 |
3 files changed, 23 insertions, 102 deletions
@@ -2080,8 +2080,7 @@ fbFillRegionSolid (DrawablePtr pDrawable, extern _X_EXPORT pixman_image_t * image_from_pict (PicturePtr pict, - Bool has_clip, - Bool is_src); + Bool has_clip); extern _X_EXPORT void free_pixman_pict (PicturePtr, pixman_image_t *); #endif /* _FB_H_ */ diff --git a/fb/fbpict.c b/fb/fbpict.c index 2fbef15c3..8057e900a 100644 --- a/fb/fbpict.c +++ b/fb/fbpict.c @@ -163,9 +163,9 @@ fbComposite (CARD8 op, if (pMask) miCompositeSourceValidate (pMask, xMask, yMask, width, height); - src = image_from_pict (pSrc, TRUE, TRUE); - mask = image_from_pict (pMask, TRUE, TRUE); - dest = image_from_pict (pDst, TRUE, FALSE); + src = image_from_pict (pSrc, TRUE); + mask = image_from_pict (pMask, TRUE); + dest = image_from_pict (pDst, TRUE); if (src && dest && !(pMask && !mask)) { @@ -268,80 +268,24 @@ create_conical_gradient_image (PictGradient *gradient) gradient->nstops); } -static DrawablePtr -copy_drawable (DrawablePtr pDraw) -{ - ScreenPtr pScreen = pDraw->pScreen; - PixmapPtr pPixmap; - GCPtr pGC; - int width, height; - ChangeGCVal gcv[2]; - - width = pDraw->width; - height = pDraw->height; - - pPixmap = (*pScreen->CreatePixmap) (pScreen, width, height, pDraw->depth, 0); - - if (!pPixmap) - return NULL; - - pGC = GetScratchGC (pDraw->depth, pScreen); - - if (!pGC) - { - (*pScreen->DestroyPixmap) (pPixmap); - return NULL; - } - - /* First fill the pixmap with zeros */ - gcv[0].val = 0x00000000; - gcv[1].val = IncludeInferiors; - dixChangeGC (NullClient, pGC, GCBackground | GCSubwindowMode, NULL, gcv); - ValidateGC ((DrawablePtr)pPixmap, pGC); - miClearDrawable ((DrawablePtr)pPixmap, pGC); - - /* Then copy the window there */ - ValidateGC(&pPixmap->drawable, pGC); - (* pGC->ops->CopyArea) (pDraw, &pPixmap->drawable, pGC, 0, 0, width, height, 0, 0); - - FreeScratchGC (pGC); - - return &pPixmap->drawable; -} - -static void -destroy_drawable (pixman_image_t *image, void *data) -{ - DrawablePtr pDrawable = data; - ScreenPtr pScreen = pDrawable->pScreen; - - pScreen->DestroyPixmap ((PixmapPtr)pDrawable); -} - static pixman_image_t * create_bits_picture (PicturePtr pict, - Bool has_clip, - Bool is_src) + Bool has_clip) { FbBits *bits; FbStride stride; int bpp, xoff, yoff; pixman_image_t *image; - DrawablePtr drawable; - - if (is_src && pict->pDrawable->type == DRAWABLE_WINDOW) - drawable = copy_drawable (pict->pDrawable); - else - drawable = pict->pDrawable; - fbGetDrawable (drawable, bits, stride, bpp, xoff, yoff); + fbGetDrawable (pict->pDrawable, bits, stride, bpp, xoff, yoff); bits = (FbBits*)((CARD8*)bits + - (drawable->y + yoff) * stride * sizeof(FbBits) + - (drawable->x + xoff) * (bpp / 8)); + (pict->pDrawable->y + yoff) * stride * sizeof(FbBits) + + (pict->pDrawable->x + xoff) * (bpp / 8)); image = pixman_image_create_bits ( - pict->format, drawable->width, drawable->height, + pict->format, + pict->pDrawable->width, pict->pDrawable->height, (uint32_t *)bits, stride * sizeof (FbStride)); @@ -359,46 +303,25 @@ create_bits_picture (PicturePtr pict, #endif #endif + /* pCompositeClip is undefined for source pictures, so + * only set the clip region for pictures with drawables + */ if (has_clip) { - if (is_src) - { - if (pict->clientClipType != CT_NONE) - { - pixman_image_set_has_client_clip (image, TRUE); + if (pict->clientClipType != CT_NONE) + pixman_image_set_has_client_clip (image, TRUE); - pixman_region_translate (pict->clientClip, - pict->clipOrigin.x, - pict->clipOrigin.y); - - pixman_image_set_clip_region (image, pict->clientClip); + pixman_region_translate (pict->pCompositeClip, - pict->pDrawable->x, - pict->pDrawable->y); - pixman_region_translate (pict->clientClip, - - pict->clipOrigin.x, - - pict->clipOrigin.y); - } - } - else - { - pixman_region_translate (pict->pCompositeClip, - - pict->pDrawable->x, - - pict->pDrawable->y); + pixman_image_set_clip_region (image, pict->pCompositeClip); - pixman_image_set_clip_region (image, pict->pCompositeClip); - - pixman_region_translate (pict->pCompositeClip, - pict->pDrawable->x, - pict->pDrawable->y); - } + pixman_region_translate (pict->pCompositeClip, pict->pDrawable->x, pict->pDrawable->y); } /* Indexed table */ if (pict->pFormat->index.devPrivate) pixman_image_set_indexed (image, pict->pFormat->index.devPrivate); - if (drawable != pict->pDrawable) - pixman_image_set_destroy_function (image, destroy_drawable, drawable); - return image; } @@ -438,7 +361,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict) if (pict->alphaMap) { - pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE, TRUE); + pixman_image_t *alpha_map = image_from_pict (pict->alphaMap, TRUE); pixman_image_set_alpha_map ( image, alpha_map, pict->alphaOrigin.x, pict->alphaOrigin.y); @@ -472,8 +395,7 @@ set_image_properties (pixman_image_t *image, PicturePtr pict) pixman_image_t * image_from_pict (PicturePtr pict, - Bool has_clip, - Bool is_src) + Bool has_clip) { pixman_image_t *image = NULL; @@ -482,7 +404,7 @@ image_from_pict (PicturePtr pict, if (pict->pDrawable) { - image = create_bits_picture (pict, has_clip, is_src); + image = create_bits_picture (pict, has_clip); } else if (pict->pSourcePict) { diff --git a/fb/fbtrap.c b/fb/fbtrap.c index b1e1eff4a..830603ae7 100644 --- a/fb/fbtrap.c +++ b/fb/fbtrap.c @@ -40,7 +40,7 @@ fbAddTraps (PicturePtr pPicture, int ntrap, xTrap *traps) { - pixman_image_t *image = image_from_pict (pPicture, FALSE, FALSE); + pixman_image_t *image = image_from_pict (pPicture, FALSE); if (!image) return; @@ -56,7 +56,7 @@ fbRasterizeTrapezoid (PicturePtr pPicture, int x_off, int y_off) { - pixman_image_t *image = image_from_pict (pPicture, FALSE, FALSE); + pixman_image_t *image = image_from_pict (pPicture, FALSE); if (!image) return; |