diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c index 5c46ec9..1a41c5a 100644 --- a/exa/exa_glyphs.c +++ b/exa/exa_glyphs.c @@ -704,6 +704,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; @@ -716,7 +717,6 @@ exaGlyphs (CARD8 op, if (maskFormat) { - ExaScreenPriv(pScreen); GCPtr pGC; xRectangle rect; @@ -738,22 +738,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); @@ -767,15 +765,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; @@ -789,6 +797,13 @@ exaGlyphs (CARD8 op, } 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; } @@ -858,6 +873,10 @@ exaGlyphs (CARD8 op, x, y, width, height); FreePicture ((pointer) pMask, (XID) 0); - (*pScreen->DestroyPixmap) (pMaskPixmap); } + + return; + +fallback: + ExaCheckGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); } diff --git a/exa/exa_render.c b/exa/exa_render.c index 3974afe..d1c363a 100644 --- a/exa/exa_render.c +++ b/exa/exa_render.c @@ -902,7 +902,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 */ diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c index 219f903..0dd59d7 100644 --- a/exa/exa_unaccel.c +++ b/exa/exa_unaccel.c @@ -697,6 +697,7 @@ ExaCheckGlyphs (CARD8 op, ScreenPtr pScreen = pDst->pDrawable->pScreen; EXA_PRE_FALLBACK(pScreen); + exaPrepareAccess (pDst->pDrawable, EXA_PREPARE_DEST); miGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); EXA_POST_FALLBACK(pScreen);