uxa_prepare_access may fail to map the pixmap into user space. Recover from this without crashing.
Signed-off-by: Keith Packard <kei...@keithp.com> --- uxa/uxa-accel.c | 30 ++++--- uxa/uxa-priv.h | 6 +- uxa/uxa-render.c | 37 +++++---- uxa/uxa-unaccel.c | 236 +++++++++++++++++++++++++++++++---------------------- uxa/uxa.c | 47 +++++++---- 5 files changed, 208 insertions(+), 148 deletions(-) diff --git a/uxa/uxa-accel.c b/uxa/uxa-accel.c index b25a8fa..f42e0e2 100644 --- a/uxa/uxa-accel.c +++ b/uxa/uxa-accel.c @@ -188,7 +188,8 @@ uxa_do_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, int dstXoff, dstYoff; if (!access_prepared) { - uxa_prepare_access(pDrawable, UXA_ACCESS_RW); + if (!uxa_prepare_access(pDrawable, UXA_ACCESS_RW)) + return FALSE; access_prepared = TRUE; } @@ -237,7 +238,8 @@ uxa_do_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, if (!pPixmap) return FALSE; - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); + if (!uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) + return FALSE; fbCopyArea((DrawablePtr)pPixmap, pDrawable, pGC, sx, sy, sw, sh, dx, dy); uxa_finish_access(pDrawable); @@ -262,7 +264,8 @@ uxa_shm_put_image(DrawablePtr pDrawable, GCPtr pGC, int depth, unsigned int form { if (!uxa_do_shm_put_image(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, data)) { - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); + if (!uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) + return; fbShmPutImage(pDrawable, pGC, depth, format, w, h, sx, sy, sw, sh, dx, dy, data); uxa_finish_access(pDrawable); @@ -468,12 +471,14 @@ fallback: UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrcDrawable, pDstDrawable, uxa_drawable_location(pSrcDrawable), uxa_drawable_location(pDstDrawable))); - uxa_prepare_access (pDstDrawable, UXA_ACCESS_RW); - uxa_prepare_access (pSrcDrawable, UXA_ACCESS_RO); - fbCopyNtoN (pSrcDrawable, pDstDrawable, pGC, pbox, nbox, dx, dy, reverse, - upsidedown, bitplane, closure); - uxa_finish_access (pSrcDrawable); - uxa_finish_access (pDstDrawable); + if (uxa_prepare_access (pDstDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access (pSrcDrawable, UXA_ACCESS_RO)) { + fbCopyNtoN (pSrcDrawable, pDstDrawable, pGC, pbox, nbox, dx, dy, + reverse, upsidedown, bitplane, closure); + uxa_finish_access (pSrcDrawable); + } + uxa_finish_access (pDstDrawable); + } } RegionPtr @@ -1024,9 +1029,10 @@ fallback: UXA_FALLBACK(("from %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RO); - fbGetImage (pDrawable, x, y, w, h, format, planeMask, d); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RO)) { + fbGetImage (pDrawable, x, y, w, h, format, planeMask, d); + uxa_finish_access (pDrawable); + } return; } diff --git a/uxa/uxa-priv.h b/uxa/uxa-priv.h index 0f9cfbf..f4b3cee 100644 --- a/uxa/uxa-priv.h +++ b/uxa/uxa-priv.h @@ -182,14 +182,14 @@ typedef struct { */ void exaDDXDriverInit (ScreenPtr pScreen); -void +Bool uxa_prepare_access_window(WindowPtr pWin); void uxa_finish_access_window(WindowPtr pWin); /* uxa-unaccel.c */ -void +Bool uxa_prepare_access_gc(GCPtr pGC); void @@ -351,7 +351,7 @@ uxa_check_composite (CARD8 op, #endif /* uxa.c */ -void +Bool uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access); void diff --git a/uxa/uxa-render.c b/uxa/uxa-render.c index b2d3297..13635f8 100644 --- a/uxa/uxa-render.c +++ b/uxa/uxa-render.c @@ -889,12 +889,12 @@ uxa_trapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst, xoff += pDraw->x; yoff += pDraw->y; - uxa_prepare_access(pDraw, UXA_ACCESS_RW); - - for (; ntrap; ntrap--, traps++) - (*ps->RasterizeTrapezoid) (pDst, traps, 0, 0); - - uxa_finish_access(pDraw); + if (uxa_prepare_access(pDraw, UXA_ACCESS_RW)) + { + for (; ntrap; ntrap--, traps++) + (*ps->RasterizeTrapezoid) (pDst, traps, 0, 0); + uxa_finish_access(pDraw); + } } else if (maskFormat) { @@ -911,11 +911,12 @@ uxa_trapezoids (CARD8 op, PicturePtr pSrc, PicturePtr pDst, if (!pPicture) return; - uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW); - for (; ntrap; ntrap--, traps++) - (*ps->RasterizeTrapezoid) (pPicture, traps, - -bounds.x1, -bounds.y1); - uxa_finish_access(pPicture->pDrawable); + if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) { + for (; ntrap; ntrap--, traps++) + (*ps->RasterizeTrapezoid) (pPicture, traps, + -bounds.x1, -bounds.y1); + uxa_finish_access(pPicture->pDrawable); + } xRel = bounds.x1 + xSrc - xDst; yRel = bounds.y1 + ySrc - yDst; @@ -972,9 +973,10 @@ uxa_triangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst, if (direct) { DrawablePtr pDraw = pDst->pDrawable; - uxa_prepare_access(pDraw, UXA_ACCESS_RW); - (*ps->AddTriangles) (pDst, 0, 0, ntri, tris); - uxa_finish_access(pDraw); + if (uxa_prepare_access(pDraw, UXA_ACCESS_RW)) { + (*ps->AddTriangles) (pDst, 0, 0, ntri, tris); + uxa_finish_access(pDraw); + } } else if (maskFormat) { @@ -991,9 +993,10 @@ uxa_triangles (CARD8 op, PicturePtr pSrc, PicturePtr pDst, if (!pPicture) return; - uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW); - (*ps->AddTriangles) (pPicture, -bounds.x1, -bounds.y1, ntri, tris); - uxa_finish_access(pPicture->pDrawable); + if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) { + (*ps->AddTriangles) (pPicture, -bounds.x1, -bounds.y1, ntri, tris); + uxa_finish_access(pPicture->pDrawable); + } xRel = bounds.x1 + xSrc - xDst; yRel = bounds.y1 + ySrc - yDst; diff --git a/uxa/uxa-unaccel.c b/uxa/uxa-unaccel.c index 01c1322..aba12e8 100644 --- a/uxa/uxa-unaccel.c +++ b/uxa/uxa-unaccel.c @@ -41,13 +41,19 @@ * 1bpp and never in fb, so we don't worry about them. * We should worry about them for completeness sake and going forward. */ -void +Bool uxa_prepare_access_gc(GCPtr pGC) { if (pGC->stipple) - uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO); + if (!uxa_prepare_access(&pGC->stipple->drawable, UXA_ACCESS_RO)) + return FALSE; if (pGC->fillStyle == FillTiled) - uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RO); + if (!uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RO)) { + if (pGC->stipple) + uxa_finish_access(&pGC->stipple->drawable); + return FALSE; + } + return TRUE; } /** @@ -75,11 +81,13 @@ uxa_check_fill_spans (DrawablePtr pDrawable, GCPtr pGC, int nspans, DDXPointPtr ppt, int *pwidth, int fSorted) { UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbFillSpans (pDrawable, pGC, nspans, ppt, pwidth, fSorted); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } } void @@ -87,9 +95,10 @@ uxa_check_set_spans (DrawablePtr pDrawable, GCPtr pGC, char *psrc, DDXPointPtr ppt, int *pwidth, int nspans, int fSorted) { UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + fbSetSpans (pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted); + uxa_finish_access (pDrawable); + } } void @@ -98,25 +107,27 @@ uxa_check_put_image (DrawablePtr pDrawable, GCPtr pGC, int depth, char *bits) { UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + fbPutImage (pDrawable, pGC, depth, x, y, w, h, leftPad, format, bits); + uxa_finish_access (pDrawable); + } } RegionPtr uxa_check_copy_area (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, - int srcx, int srcy, int w, int h, int dstx, int dsty) + int srcx, int srcy, int w, int h, int dstx, int dsty) { - RegionPtr ret; + RegionPtr ret = NULL; UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, uxa_drawable_location(pSrc), uxa_drawable_location(pDst))); - uxa_prepare_access (pDst, UXA_ACCESS_RW); - uxa_prepare_access (pSrc, UXA_ACCESS_RO); - ret = fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); - uxa_finish_access (pSrc); - uxa_finish_access (pDst); - + if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) { + if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) { + ret = fbCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); + uxa_finish_access (pSrc); + } + uxa_finish_access (pDst); + } return ret; } @@ -125,17 +136,18 @@ uxa_check_copy_plane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int w, int h, int dstx, int dsty, unsigned long bitPlane) { - RegionPtr ret; + RegionPtr ret = NULL; UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, uxa_drawable_location(pSrc), uxa_drawable_location(pDst))); - uxa_prepare_access (pDst, UXA_ACCESS_RW); - uxa_prepare_access (pSrc, UXA_ACCESS_RO); - ret = fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, - bitPlane); - uxa_finish_access (pSrc); - uxa_finish_access (pDst); - + if (uxa_prepare_access (pDst, UXA_ACCESS_RW)) { + if (uxa_prepare_access (pSrc, UXA_ACCESS_RO)) { + ret = fbCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, + bitPlane); + uxa_finish_access (pSrc); + } + uxa_finish_access (pDst); + } return ret; } @@ -144,9 +156,10 @@ uxa_check_poly_point (DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, DDXPointPtr pptInit) { UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - fbPolyPoint (pDrawable, pGC, mode, npt, pptInit); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + fbPolyPoint (pDrawable, pGC, mode, npt, pptInit); + uxa_finish_access (pDrawable); + } } void @@ -158,11 +171,13 @@ uxa_check_poly_lines (DrawablePtr pDrawable, GCPtr pGC, pGC->lineWidth, mode, npt)); if (pGC->lineWidth == 0) { - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbPolyLine (pDrawable, pGC, mode, npt, ppt); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbPolyLine (pDrawable, pGC, mode, npt, ppt); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } return; } /* fb calls mi functions in the lineWidth != 0 case. */ @@ -176,11 +191,13 @@ uxa_check_poly_segment (DrawablePtr pDrawable, GCPtr pGC, UXA_FALLBACK(("to %p (%c) width %d, count %d\n", pDrawable, uxa_drawable_location(pDrawable), pGC->lineWidth, nsegInit)); if (pGC->lineWidth == 0) { - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbPolySegment (pDrawable, pGC, nsegInit, pSegInit); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbPolySegment (pDrawable, pGC, nsegInit, pSegInit); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } return; } /* fb calls mi functions in the lineWidth != 0 case. */ @@ -200,11 +217,13 @@ uxa_check_poly_arc (DrawablePtr pDrawable, GCPtr pGC, #if 0 if (pGC->lineWidth == 0) { - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbPolyArc (pDrawable, pGC, narcs, pArcs); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbPolyArc (pDrawable, pGC, narcs, pArcs); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } return; } #endif @@ -217,11 +236,13 @@ uxa_check_poly_fill_rect (DrawablePtr pDrawable, GCPtr pGC, { UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbPolyFillRect (pDrawable, pGC, nrect, prect); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbPolyFillRect (pDrawable, pGC, nrect, prect); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } } void @@ -231,11 +252,13 @@ uxa_check_image_glyph_blt (DrawablePtr pDrawable, GCPtr pGC, { UXA_FALLBACK(("to %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbImageGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } } void @@ -245,11 +268,13 @@ uxa_check_poly_glyph_blt (DrawablePtr pDrawable, GCPtr pGC, { UXA_FALLBACK(("to %p (%c), style %d alu %d\n", pDrawable, uxa_drawable_location(pDrawable), pGC->fillStyle, pGC->alu)); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access_gc (pGC); - fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); - uxa_finish_access_gc (pGC); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access_gc (pGC)) { + fbPolyGlyphBlt (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (pDrawable); + } } void @@ -260,13 +285,16 @@ uxa_check_push_pixels (GCPtr pGC, PixmapPtr pBitmap, UXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable, uxa_drawable_location(&pBitmap->drawable), uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RW); - uxa_prepare_access (&pBitmap->drawable, UXA_ACCESS_RO); - uxa_prepare_access_gc (pGC); - fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y); - uxa_finish_access_gc (pGC); - uxa_finish_access (&pBitmap->drawable); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RW)) { + if (uxa_prepare_access (&pBitmap->drawable, UXA_ACCESS_RO)) { + if (uxa_prepare_access_gc (pGC)) { + fbPushPixels (pGC, pBitmap, pDrawable, w, h, x, y); + uxa_finish_access_gc (pGC); + } + uxa_finish_access (&pBitmap->drawable); + } + uxa_finish_access (pDrawable); + } } void @@ -278,9 +306,10 @@ uxa_check_get_spans (DrawablePtr pDrawable, char *pdstStart) { UXA_FALLBACK(("from %p (%c)\n", pDrawable, uxa_drawable_location(pDrawable))); - uxa_prepare_access (pDrawable, UXA_ACCESS_RO); - fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart); - uxa_finish_access (pDrawable); + if (uxa_prepare_access (pDrawable, UXA_ACCESS_RO)) { + fbGetSpans (pDrawable, wMax, ppt, pwidth, nspans, pdstStart); + uxa_finish_access (pDrawable); + } } void @@ -300,28 +329,34 @@ uxa_check_composite (CARD8 op, UXA_FALLBACK(("from picts %p/%p to pict %p\n", pSrc, pMask, pDst)); - uxa_prepare_access (pDst->pDrawable, UXA_ACCESS_RW); - if (pSrc->pDrawable != NULL) - uxa_prepare_access (pSrc->pDrawable, UXA_ACCESS_RO); - if (pMask && pMask->pDrawable != NULL) - uxa_prepare_access (pMask->pDrawable, UXA_ACCESS_RO); - fbComposite (op, - pSrc, - pMask, - pDst, - xSrc, - ySrc, - xMask, - yMask, - xDst, - yDst, - width, - height); - if (pMask && pMask->pDrawable != NULL) - uxa_finish_access (pMask->pDrawable); - if (pSrc->pDrawable != NULL) - uxa_finish_access (pSrc->pDrawable); - uxa_finish_access (pDst->pDrawable); + if (uxa_prepare_access (pDst->pDrawable, UXA_ACCESS_RW)) + { + if (pSrc->pDrawable == NULL || + uxa_prepare_access (pSrc->pDrawable, UXA_ACCESS_RO)) + { + if (!pMask || pMask->pDrawable == NULL || + uxa_prepare_access (pMask->pDrawable, UXA_ACCESS_RO)) + { + fbComposite (op, + pSrc, + pMask, + pDst, + xSrc, + ySrc, + xMask, + yMask, + xDst, + yDst, + width, + height); + if (pMask && pMask->pDrawable != NULL) + uxa_finish_access (pMask->pDrawable); + } + if (pSrc->pDrawable != NULL) + uxa_finish_access (pSrc->pDrawable); + } + uxa_finish_access (pDst->pDrawable); + } } void @@ -333,9 +368,10 @@ uxa_check_add_traps (PicturePtr pPicture, { UXA_FALLBACK(("to pict %p (%c)\n", uxa_drawable_location(pPicture->pDrawable))); - uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW); - fbAddTraps (pPicture, x_off, y_off, ntrap, traps); - uxa_finish_access(pPicture->pDrawable); + if (uxa_prepare_access(pPicture->pDrawable, UXA_ACCESS_RW)) { + fbAddTraps (pPicture, x_off, y_off, ntrap, traps); + uxa_finish_access(pPicture->pDrawable); + } } /** @@ -350,7 +386,9 @@ uxa_get_pixmap_first_pixel (PixmapPtr pPixmap) CARD32 pixel; void *fb; - uxa_prepare_access (&pPixmap->drawable, UXA_ACCESS_RO); + if (!uxa_prepare_access (&pPixmap->drawable, UXA_ACCESS_RO)) + return 0; + fb = pPixmap->devPrivate.ptr; switch (pPixmap->drawable.bitsPerPixel) { diff --git a/uxa/uxa.c b/uxa/uxa.c index 5b6f537..c341f04 100644 --- a/uxa/uxa.c +++ b/uxa/uxa.c @@ -140,7 +140,7 @@ uxa_get_offscreen_pixmap (DrawablePtr drawable, int *xp, int *yp) * It deals with waiting for synchronization with the card, determining if * PrepareAccess() is necessary, and working around PrepareAccess() failure. */ -void +Bool uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access) { ScreenPtr pScreen = pDrawable->pScreen; @@ -149,10 +149,11 @@ uxa_prepare_access(DrawablePtr pDrawable, uxa_access_t access) Bool offscreen = uxa_pixmap_is_offscreen(pPixmap); if (!offscreen) - return; + return TRUE; if (uxa_screen->info->prepare_access) - (*uxa_screen->info->prepare_access) (pPixmap, access); + return (*uxa_screen->info->prepare_access) (pPixmap, access); + return TRUE; } /** @@ -209,10 +210,11 @@ uxa_validate_gc (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) * allocated pixmap. This isn't a problem yet, since we don't * put pixmaps in FB until at least one accelerated UXA op. */ - uxa_prepare_access(&pOldTile->drawable, UXA_ACCESS_RO); - pNewTile = fb24_32ReformatTile (pOldTile, - pDrawable->bitsPerPixel); - uxa_finish_access(&pOldTile->drawable); + if (uxa_prepare_access(&pOldTile->drawable, UXA_ACCESS_RO)) { + pNewTile = fb24_32ReformatTile (pOldTile, + pDrawable->bitsPerPixel); + uxa_finish_access(&pOldTile->drawable); + } } if (pNewTile) { @@ -227,9 +229,10 @@ uxa_validate_gc (GCPtr pGC, unsigned long changes, DrawablePtr pDrawable) if (!pGC->tileIsPixel && FbEvenTile (pGC->tile.pixmap->drawable.width * pDrawable->bitsPerPixel)) { - uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RW); - fbPadPixmap (pGC->tile.pixmap); - uxa_finish_access(&pGC->tile.pixmap->drawable); + if (uxa_prepare_access(&pGC->tile.pixmap->drawable, UXA_ACCESS_RW)) { + fbPadPixmap (pGC->tile.pixmap); + uxa_finish_access(&pGC->tile.pixmap->drawable); + } } /* Mask out the GCTile change notification, now that we've done FB's * job for it. @@ -269,14 +272,22 @@ uxa_create_gc (GCPtr pGC) return TRUE; } -void +Bool uxa_prepare_access_window(WindowPtr pWin) { - if (pWin->backgroundState == BackgroundPixmap) - uxa_prepare_access(&pWin->background.pixmap->drawable, UXA_ACCESS_RO); + if (pWin->backgroundState == BackgroundPixmap) { + if (!uxa_prepare_access(&pWin->background.pixmap->drawable, UXA_ACCESS_RO)) + return FALSE; + } - if (pWin->borderIsPixel == FALSE) - uxa_prepare_access(&pWin->border.pixmap->drawable, UXA_ACCESS_RO); + if (pWin->borderIsPixel == FALSE) { + if (!uxa_prepare_access(&pWin->border.pixmap->drawable, UXA_ACCESS_RO)) { + if (pWin->backgroundState == BackgroundPixmap) + uxa_finish_access(&pWin->background.pixmap->drawable); + return FALSE; + } + } + return TRUE; } void @@ -294,7 +305,8 @@ uxa_change_window_attributes(WindowPtr pWin, unsigned long mask) { Bool ret; - uxa_prepare_access_window(pWin); + if (!uxa_prepare_access_window(pWin)) + return FALSE; ret = fbChangeWindowAttributes(pWin, mask); uxa_finish_access_window(pWin); return ret; @@ -304,7 +316,8 @@ static RegionPtr uxa_bitmap_to_region(PixmapPtr pPix) { RegionPtr ret; - uxa_prepare_access(&pPix->drawable, UXA_ACCESS_RO); + if (!uxa_prepare_access(&pPix->drawable, UXA_ACCESS_RO)) + return NULL; ret = fbPixmapToRegion(pPix); uxa_finish_access(&pPix->drawable); return ret; -- 1.5.6.5 ------------------------------------------------------------------------------ SF.Net email is Sponsored by MIX09, March 18-20, 2009 in Las Vegas, Nevada. The future of the web can't happen without you. Join us at MIX09 to help pave the way to the Next Web now. Learn more and register at http://ad.doubleclick.net/clk;208669438;13503038;i?http://2009.visitmix.com/ -- _______________________________________________ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel