From: foo Subject: foo Index: xorg-server-1.13.0/exa/exa_glyphs.c =================================================================== --- xorg-server-1.13.0.orig/exa/exa_glyphs.c +++ xorg-server-1.13.0/exa/exa_glyphs.c @@ -686,6 +686,7 @@ exaGlyphs(CARD8 op, PixmapPtr pMaskPixmap = 0; PicturePtr pMask = NULL; ScreenPtr pScreen = pDst->pDrawable->pScreen; + ExaScreenPriv(pScreen); int width = 0, height = 0; int x, y; int first_xOff = list->xOff, first_yOff = list->yOff; @@ -697,7 +698,6 @@ exaGlyphs(CARD8 op, ExaGlyphBuffer buffer; if (maskFormat) { - ExaScreenPriv(pScreen); GCPtr pGC; xRectangle rect; @@ -719,22 +719,20 @@ exaGlyphs(CARD8 op, maskFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH); if (!pMaskPixmap) - return; + goto fallback; component_alpha = NeedsComponent(maskFormat->format); pMask = CreatePicture(0, &pMaskPixmap->drawable, maskFormat, CPComponentAlpha, &component_alpha, serverClient, &error); - if (!pMask || - (!component_alpha && pExaScr->info->CheckComposite && - !(*pExaScr->info->CheckComposite) (PictOpAdd, pSrc, NULL, pMask))) + (*pScreen->DestroyPixmap) (pMaskPixmap); + if (!pMask) + goto fallback; + + if (!component_alpha && pExaScr->info->CheckComposite && + !(*pExaScr->info->CheckComposite) (PictOpAdd, pSrc, NULL, pMask)) { PictFormatPtr argbFormat; - (*pScreen->DestroyPixmap) (pMaskPixmap); - - if (!pMask) - return; - /* The driver can't seem to composite to a8, let's try argb (but * without component-alpha) */ FreePicture((pointer) pMask, (XID) 0); @@ -748,15 +746,25 @@ exaGlyphs(CARD8 op, maskFormat->depth, CREATE_PIXMAP_USAGE_SCRATCH); if (!pMaskPixmap) - return; + goto fallback; pMask = CreatePicture(0, &pMaskPixmap->drawable, maskFormat, 0, 0, serverClient, &error); - if (!pMask) { - (*pScreen->DestroyPixmap) (pMaskPixmap); - return; - } + (*pScreen->DestroyPixmap) (pMaskPixmap); + if (!pMask) + goto fallback; } + + if (pExaScr->info->CheckComposite && + (!(*pExaScr->info->CheckComposite) (PictOpAdd, pSrc, NULL, pMask) || + (!(*pExaScr->info->CheckComposite) (op, pSrc, pMask, pDst) && + (op != PictOpOver || + !(*pExaScr->info->CheckComposite) (PictOpOutReverse, pSrc, pMask, pDst) || + !(*pExaScr->info->CheckComposite) (PictOpOver, pSrc, pMask, pDst))))) { + FreePicture ((pointer) pMask, (XID) 0); + goto fallback; + } + pGC = GetScratchGC(pMaskPixmap->drawable.depth, pScreen); ValidateGC(&pMaskPixmap->drawable, pGC); rect.x = 0; @@ -769,6 +777,12 @@ exaGlyphs(CARD8 op, y = -extents.y1; } else { + if (pExaScr->info->CheckComposite && + !(*pExaScr->info->CheckComposite) (op, pSrc, NULL, pDst) && + (op != PictOpOver || + !(*pExaScr->info->CheckComposite) (PictOpOutReverse, pSrc, NULL, pDst) || + !(*pExaScr->info->CheckComposite) (PictOpOver, pSrc, NULL, pDst))) + goto fallback; x = 0; y = 0; } @@ -834,6 +848,10 @@ exaGlyphs(CARD8 op, xSrc + x - first_xOff, ySrc + y - first_yOff, 0, 0, x, y, width, height); FreePicture((pointer) pMask, (XID) 0); - (*pScreen->DestroyPixmap) (pMaskPixmap); } + + return; + +fallback: + ExaCheckGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); } Index: xorg-server-1.13.0/exa/exa_render.c =================================================================== --- xorg-server-1.13.0.orig/exa/exa_render.c +++ xorg-server-1.13.0/exa/exa_render.c @@ -878,7 +878,7 @@ exaComposite(CARD8 op, Bool saveMaskRepeat = pMask ? pMask->repeat : 0; RegionRec region; - if (pExaScr->swappedOut) + if (pExaScr->fallback_counter || pExaScr->swappedOut) goto fallback; /* Remove repeat in source if useless */