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 e9aa61e9f0.

Conflicts:

	configure.ac
	fb/fbpict.c

Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Aaron Plattner 2009-11-24 10:21:28 -08:00 committed by Peter Hutterer
parent 8eca8eaef5
commit 196aff9b18
3 changed files with 23 additions and 102 deletions

View File

@ -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_ */

View File

@ -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)
{

View File

@ -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;