summaryrefslogtreecommitdiffstats
path: root/abs/core/xorg-server/EXA_Fall_back_earlier_and_more_thoroughly_from_exaGlyphsV2.diff
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core/xorg-server/EXA_Fall_back_earlier_and_more_thoroughly_from_exaGlyphsV2.diff')
-rw-r--r--abs/core/xorg-server/EXA_Fall_back_earlier_and_more_thoroughly_from_exaGlyphsV2.diff116
1 files changed, 116 insertions, 0 deletions
diff --git a/abs/core/xorg-server/EXA_Fall_back_earlier_and_more_thoroughly_from_exaGlyphsV2.diff b/abs/core/xorg-server/EXA_Fall_back_earlier_and_more_thoroughly_from_exaGlyphsV2.diff
new file mode 100644
index 0000000..12c1101
--- /dev/null
+++ b/abs/core/xorg-server/EXA_Fall_back_earlier_and_more_thoroughly_from_exaGlyphsV2.diff
@@ -0,0 +1,116 @@
+--- xorg-server-1.12.1/exa/exa_glyphs.c 2012-03-30 04:57:25.000000000 +0200
++++ xorg-server-1.12.1/exa_glyphs.c.new 2012-04-15 11:48:51.683214230 +0200
+@@ -686,6 +686,7 @@
+ 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 @@
+ ExaGlyphBuffer buffer;
+
+ if (maskFormat) {
+- ExaScreenPriv(pScreen);
+ GCPtr pGC;
+ xRectangle rect;
+
+@@ -719,22 +719,20 @@
+ 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 @@
+ 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,13 @@
+ 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 +849,10 @@
+ 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);
+ }
+--- xorg-server-1.12.1/exa/exa_render.c 2012-03-30 04:57:25.000000000 +0200
++++ xorg-server-1.12.1/exa_render.c.new 2012-04-15 11:50:35.272482047 +0200
+@@ -878,7 +878,7 @@
+ 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 */