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 <[email protected]>
---
Consensus on IRC was to just revert the broken change in server-1.7-branch.
This change does that, but there were conflicts so I'd like somebody to
review before I push it to server-1.7-nominations.


 fb/fb.h     |    3 +-
 fb/fbpict.c |  120 ++++++++++------------------------------------------------
 fb/fbtrap.c |    4 +-
 3 files changed, 24 insertions(+), 103 deletions(-)

diff --git a/fb/fb.h b/fb/fb.h
index c35e765..6c9f8a1 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -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 2fbef15..6100ccb 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);
-
-               pixman_region_translate (pict->clientClip,
-                                        pict->clipOrigin.x,
-                                        pict->clipOrigin.y);
-               
-               pixman_image_set_clip_region (image, pict->clientClip);
+       if (pict->clientClipType != CT_NONE)
+           pixman_image_set_has_client_clip (image, TRUE);
 
-               pixman_region_translate (pict->clientClip,
-                                        - pict->clipOrigin.x,
-                                        - pict->clipOrigin.y);
-           }
-       }
-       else
-       {
-           pixman_region_translate (pict->pCompositeClip,
-                                    - pict->pDrawable->x,
-                                    - pict->pDrawable->y);
+       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 b1e1eff..830603a 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;
-- 
1.6.3.3

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to