[arch-commits] Commit in xorg-server/trunk (3 files)

Laurent Carlier lcarlier at archlinux.org
Thu Jan 5 20:36:05 UTC 2017


    Date: Thursday, January 5, 2017 @ 20:36:04
  Author: lcarlier
Revision: 285311

upgpkg: xorg-server 1.19.0-4

add more upstream fixes

Added:
  xorg-server/trunk/git-fixes.diff
    (from rev 285310, xorg-server/trunk/damageRegionProcessPending.diff)
Modified:
  xorg-server/trunk/PKGBUILD
Deleted:
  xorg-server/trunk/damageRegionProcessPending.diff

---------------------------------+
 PKGBUILD                        |   13 
 damageRegionProcessPending.diff |  516 -------------------------------
 git-fixes.diff                  |  614 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 622 insertions(+), 521 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2017-01-05 20:18:30 UTC (rev 285310)
+++ PKGBUILD	2017-01-05 20:36:04 UTC (rev 285311)
@@ -5,7 +5,7 @@
 pkgbase=xorg-server
 pkgname=('xorg-server' 'xorg-server-xephyr' 'xorg-server-xdmx' 'xorg-server-xvfb' 'xorg-server-xnest' 'xorg-server-xwayland' 'xorg-server-common' 'xorg-server-devel')
 pkgver=1.19.0
-pkgrel=3
+pkgrel=4
 arch=('i686' 'x86_64')
 license=('custom')
 groups=('xorg')
@@ -20,7 +20,7 @@
 source=(https://xorg.freedesktop.org/releases/individual/xserver/${pkgbase}-${pkgver}.tar.bz2{,.sig}
         xvfb-run
         xvfb-run.1
-        damageRegionProcessPending.diff)
+        git-fixes.diff)
 validpgpkeys=('7B27A3F1A6E18CD9588B4AE8310180050905E40C'
               'C383B778255613DFDB409D91DB221A6900000011'
               'DD38563A8A8224537D1F90E45B8A2D50A0ECD0D3')
@@ -28,12 +28,15 @@
             'SKIP'
             'ff0156309470fc1d378fd2e104338020a884295e285972cc88e250e031cc35b9'
             '2460adccd3362fefd4cdc5f1c70f332d7b578091fb9167bf88b5f91265bbd776'
-            'c8344b94d946005b28ad1e0771c77174afd7288100763ab7bb7c2b50be52f1e0')
+            '63e37008fdbd0c3630db38b995d3be8891b9c2cabb46cb4dc3596ba988a259cd')
 
 prepare() {
   cd "${pkgbase}-${pkgver}"
-  # apply upstream commit d6da2086951693e047fdd22b0d21c539ea1bb1e1
-  patch -Np1 -i ../damageRegionProcessPending.diff
+  # apply upstream fixes:
+  # Revert "damage: Make damageRegionProcessPending take a damage not a drawable"
+  # os: return 0 from check_timers if we touched any of them
+  # glamor: Trust eglGetPlatformDisplayEXT if it exists
+  patch -Np1 -i ../git-fixes.diff
 }
 
 build() {

Deleted: damageRegionProcessPending.diff
===================================================================
--- damageRegionProcessPending.diff	2017-01-05 20:18:30 UTC (rev 285310)
+++ damageRegionProcessPending.diff	2017-01-05 20:36:04 UTC (rev 285311)
@@ -1,516 +0,0 @@
-From d6da2086951693e047fdd22b0d21c539ea1bb1e1 Mon Sep 17 00:00:00 2001
-From: Adam Jackson <ajax at redhat.com>
-Date: Mon, 12 Dec 2016 13:08:17 -0500
-Subject: Revert "damage: Make damageRegionProcessPending take a damage not a
- drawable"
-
-The commit message makes the assertion that the code below damage is not
-allowed to change whether there's a damage monitor for the drawable.
-That turns out not to be the case! exa's mixed code, at least, will
-create and destroy a damage in PrepareAccess. The destroy path can then
-be catastrophic, as damageRegionProcessPending will attempt to
-RegionEmpty memory from the middle of a freed block.
-
-I'd wanted that invariant for performance, but faster isn't worth
-broken, so revert it. I think what exa's doing is reasonable, so the
-better way to improve performance for the unmonitored case is to either
-revisit dynamically wrapping into the GC, or inline damage into dix.
-
-This reverts commit 4e124203f2260daaf54155f4a05fe469733e0b97.
-
-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1389886
-Signed-off-by: Adam Jackson <ajax at redhat.com>
-(cherry picked from commit 32e632e85894eddc3ace83f16f1e973b1be478fe)
-
-diff --git a/miext/damage/damage.c b/miext/damage/damage.c
-index 17c2abf..d6a3614 100644
---- a/miext/damage/damage.c
-+++ b/miext/damage/damage.c
-@@ -282,8 +282,10 @@ damageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
- }
- 
- static void
--damageRegionProcessPending(DamagePtr pDamage)
-+damageRegionProcessPending(DrawablePtr pDrawable)
- {
-+    drawableDamage(pDrawable);
-+
-     for (; pDamage != NULL; pDamage = pDamage->pNext) {
-         if (pDamage->reportAfter) {
-             /* It's possible that there is only interest in postRendering reporting. */
-@@ -358,7 +360,6 @@ damageCreateGC(GCPtr pGC)
- 
- #define DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable) \
-     damageGCPriv(pGC);  \
--    drawableDamage(pDrawable); \
-     const GCFuncs *oldFuncs = pGC->funcs; \
-     unwrap(pGCPriv, pGC, funcs);  \
-     unwrap(pGCPriv, pGC, ops); \
-@@ -456,7 +457,7 @@ damageDestroyClip(GCPtr pGC)
- #define BOX_NOT_EMPTY(box) \
-     (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
- 
--#define checkGCDamage(d,g)	(d && \
-+#define checkGCDamage(d,g)	(getDrawableDamage(d) && \
- 				 (!g->pCompositeClip ||\
- 				  RegionNotEmpty(g->pCompositeClip)))
- 
-@@ -468,7 +469,8 @@ damageDestroyClip(GCPtr pGC)
-     if(box.y2 > extents->y2) box.y2 = extents->y2; \
-     }
- 
--#define checkPictureDamage(d, p) (d && RegionNotEmpty(p->pCompositeClip))
-+#define checkPictureDamage(p)	(getDrawableDamage(p->pDrawable) && \
-+				 RegionNotEmpty(p->pCompositeClip))
- 
- static void
- damageComposite(CARD8 op,
-@@ -485,9 +487,8 @@ damageComposite(CARD8 op,
-     PictureScreenPtr ps = GetPictureScreen(pScreen);
- 
-     damageScrPriv(pScreen);
--    drawableDamage(pDst->pDrawable);
- 
--    if (checkPictureDamage(pDamage, pDst)) {
-+    if (checkPictureDamage(pDst)) {
-         BoxRec box;
- 
-         box.x1 = xDst + pDst->pDrawable->x;
-@@ -504,7 +505,7 @@ damageComposite(CARD8 op,
-                       pMask,
-                       pDst,
-                       xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDst->pDrawable);
-     wrap(pScrPriv, ps, Composite, damageComposite);
- }
- 
-@@ -520,9 +521,8 @@ damageGlyphs(CARD8 op,
-     PictureScreenPtr ps = GetPictureScreen(pScreen);
- 
-     damageScrPriv(pScreen);
--    drawableDamage(pDst->pDrawable);
- 
--    if (checkPictureDamage(pDamage, pDst)) {
-+    if (checkPictureDamage(pDst)) {
-         int nlistTmp = nlist;
-         GlyphListPtr listTmp = list;
-         GlyphPtr *glyphsTmp = glyphs;
-@@ -567,7 +567,7 @@ damageGlyphs(CARD8 op,
-     }
-     unwrap(pScrPriv, ps, Glyphs);
-     (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDst->pDrawable);
-     wrap(pScrPriv, ps, Glyphs, damageGlyphs);
- }
- 
-@@ -579,9 +579,8 @@ damageAddTraps(PicturePtr pPicture,
-     PictureScreenPtr ps = GetPictureScreen(pScreen);
- 
-     damageScrPriv(pScreen);
--    drawableDamage(pPicture->pDrawable);
- 
--    if (checkPictureDamage(pDamage, pPicture)) {
-+    if (checkPictureDamage(pPicture)) {
-         BoxRec box;
-         int i;
-         int x, y;
-@@ -616,7 +615,7 @@ damageAddTraps(PicturePtr pPicture,
-     }
-     unwrap(pScrPriv, ps, AddTraps);
-     (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pPicture->pDrawable);
-     wrap(pScrPriv, ps, AddTraps, damageAddTraps);
- }
- 
-@@ -628,7 +627,7 @@ damageFillSpans(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (npt && checkGCDamage(pDamage, pGC)) {
-+    if (npt && checkGCDamage(pDrawable, pGC)) {
-         int nptTmp = npt;
-         DDXPointPtr pptTmp = ppt;
-         int *pwidthTmp = pwidth;
-@@ -664,7 +663,7 @@ damageFillSpans(DrawablePtr pDrawable,
- 
-     (*pGC->ops->FillSpans) (pDrawable, pGC, npt, ppt, pwidth, fSorted);
- 
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -676,7 +675,7 @@ damageSetSpans(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (npt && checkGCDamage(pDamage, pGC)) {
-+    if (npt && checkGCDamage(pDrawable, pGC)) {
-         DDXPointPtr pptTmp = ppt;
-         int *pwidthTmp = pwidth;
-         int nptTmp = npt;
-@@ -710,7 +709,7 @@ damageSetSpans(DrawablePtr pDrawable,
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->SetSpans) (pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -722,7 +721,7 @@ damagePutImage(DrawablePtr pDrawable,
-                int y, int w, int h, int leftPad, int format, char *pImage)
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
--    if (checkGCDamage(pDamage, pGC)) {
-+    if (checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
- 
-         box.x1 = x + pDrawable->x;
-@@ -736,7 +735,7 @@ damagePutImage(DrawablePtr pDrawable,
-     }
-     (*pGC->ops->PutImage) (pDrawable, pGC, depth, x, y, w, h,
-                            leftPad, format, pImage);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -750,7 +749,7 @@ damageCopyArea(DrawablePtr pSrc,
- 
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
- 
--    if (checkGCDamage(pDamage, pGC)) {
-+    if (checkGCDamage(pDst, pGC)) {
-         BoxRec box;
- 
-         box.x1 = dstx + pDst->x;
-@@ -765,7 +764,7 @@ damageCopyArea(DrawablePtr pSrc,
- 
-     ret = (*pGC->ops->CopyArea) (pSrc, pDst,
-                                  pGC, srcx, srcy, width, height, dstx, dsty);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDst);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
-     return ret;
- }
-@@ -783,7 +782,7 @@ damageCopyPlane(DrawablePtr pSrc,
- 
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
- 
--    if (checkGCDamage(pDamage, pGC)) {
-+    if (checkGCDamage(pDst, pGC)) {
-         BoxRec box;
- 
-         box.x1 = dstx + pDst->x;
-@@ -799,7 +798,7 @@ damageCopyPlane(DrawablePtr pSrc,
-     ret = (*pGC->ops->CopyPlane) (pSrc, pDst,
-                                   pGC, srcx, srcy, width, height, dstx, dsty,
-                                   bitPlane);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDst);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
-     return ret;
- }
-@@ -810,7 +809,7 @@ damagePolyPoint(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (npt && checkGCDamage(pDamage, pGC)) {
-+    if (npt && checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
-         int nptTmp = npt;
-         xPoint *pptTmp = ppt;
-@@ -840,7 +839,7 @@ damagePolyPoint(DrawablePtr pDrawable,
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->PolyPoint) (pDrawable, pGC, mode, npt, ppt);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -850,7 +849,7 @@ damagePolylines(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (npt && checkGCDamage(pDamage, pGC)) {
-+    if (npt && checkGCDamage(pDrawable, pGC)) {
-         int nptTmp = npt;
-         DDXPointPtr pptTmp = ppt;
-         BoxRec box;
-@@ -913,7 +912,7 @@ damagePolylines(DrawablePtr pDrawable,
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->Polylines) (pDrawable, pGC, mode, npt, ppt);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -922,7 +921,7 @@ damagePolySegment(DrawablePtr pDrawable, GCPtr pGC, int nSeg, xSegment * pSeg)
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (nSeg && checkGCDamage(pDamage, pGC)) {
-+    if (nSeg && checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
-         int extra = pGC->lineWidth;
-         int nsegTmp = nSeg;
-@@ -992,7 +991,7 @@ damagePolySegment(DrawablePtr pDrawable, GCPtr pGC, int nSeg, xSegment * pSeg)
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->PolySegment) (pDrawable, pGC, nSeg, pSeg);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1002,7 +1001,7 @@ damagePolyRectangle(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (nRects && checkGCDamage(pDamage, pGC)) {
-+    if (nRects && checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
-         int offset1, offset2, offset3;
-         int nRectsTmp = nRects;
-@@ -1051,7 +1050,7 @@ damagePolyRectangle(DrawablePtr pDrawable,
-         }
-     }
-     (*pGC->ops->PolyRectangle) (pDrawable, pGC, nRects, pRects);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1060,7 +1059,7 @@ damagePolyArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (nArcs && checkGCDamage(pDamage, pGC)) {
-+    if (nArcs && checkGCDamage(pDrawable, pGC)) {
-         int extra = pGC->lineWidth >> 1;
-         BoxRec box;
-         int nArcsTmp = nArcs;
-@@ -1098,7 +1097,7 @@ damagePolyArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->PolyArc) (pDrawable, pGC, nArcs, pArcs);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1108,7 +1107,7 @@ damageFillPolygon(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (npt > 2 && checkGCDamage(pDamage, pGC)) {
-+    if (npt > 2 && checkGCDamage(pDrawable, pGC)) {
-         DDXPointPtr pptTmp = ppt;
-         int nptTmp = npt;
-         BoxRec box;
-@@ -1157,7 +1156,7 @@ damageFillPolygon(DrawablePtr pDrawable,
-     }
- 
-     (*pGC->ops->FillPolygon) (pDrawable, pGC, shape, mode, npt, ppt);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1166,7 +1165,7 @@ damagePolyFillRect(DrawablePtr pDrawable,
-                    GCPtr pGC, int nRects, xRectangle *pRects)
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
--    if (nRects && checkGCDamage(pDamage, pGC)) {
-+    if (nRects && checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
-         xRectangle *pRectsTmp = pRects;
-         int nRectsTmp = nRects;
-@@ -1193,7 +1192,7 @@ damagePolyFillRect(DrawablePtr pDrawable,
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->PolyFillRect) (pDrawable, pGC, nRects, pRects);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1202,7 +1201,7 @@ damagePolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
- 
--    if (nArcs && checkGCDamage(pDamage, pGC)) {
-+    if (nArcs && checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
-         int nArcsTmp = nArcs;
-         xArc *pArcsTmp = pArcs;
-@@ -1229,7 +1228,7 @@ damagePolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->PolyFillArc) (pDrawable, pGC, nArcs, pArcs);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1278,9 +1277,12 @@ damageDamageChars(DrawablePtr pDrawable,
- #define TT_IMAGE16 3
- 
- static void
--damageText(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned long count,
--           char *chars, FontEncoding fontEncoding, DamagePtr pDamage,
--           Bool textType)
-+damageText(DrawablePtr pDrawable,
-+           GCPtr pGC,
-+           int x,
-+           int y,
-+           unsigned long count,
-+           char *chars, FontEncoding fontEncoding, Bool textType)
- {
-     CharInfoPtr *charinfo;
-     unsigned long i;
-@@ -1289,7 +1291,7 @@ damageText(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned long count,
- 
-     imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
- 
--    if (!pDamage)
-+    if (!checkGCDamage(pDrawable, pGC))
-         return;
- 
-     charinfo = xallocarray(count, sizeof(CharInfoPtr));
-@@ -1314,9 +1316,9 @@ damagePolyText8(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-     damageText(pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
--               pDamage, TT_POLY8);
-+               TT_POLY8);
-     x = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-     return x;
- }
-@@ -1328,9 +1330,9 @@ damagePolyText16(DrawablePtr pDrawable,
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-     damageText(pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
-                FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
--               pDamage, TT_POLY16);
-+               TT_POLY16);
-     x = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
-     return x;
- }
-@@ -1341,9 +1343,9 @@ damageImageText8(DrawablePtr pDrawable,
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-     damageText(pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
--               pDamage, TT_IMAGE8);
-+               TT_IMAGE8);
-     (*pGC->ops->ImageText8) (pDrawable, pGC, x, y, count, chars);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1354,9 +1356,9 @@ damageImageText16(DrawablePtr pDrawable,
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
-     damageText(pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
-                FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
--               pDamage, TT_IMAGE16);
-+               TT_IMAGE16);
-     (*pGC->ops->ImageText16) (pDrawable, pGC, x, y, count, chars);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1371,7 +1373,7 @@ damageImageGlyphBlt(DrawablePtr pDrawable,
-     damageDamageChars(pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
-                       nglyph, ppci, TRUE, pGC->subWindowMode);
-     (*pGC->ops->ImageGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1386,7 +1388,7 @@ damagePolyGlyphBlt(DrawablePtr pDrawable,
-     damageDamageChars(pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
-                       nglyph, ppci, FALSE, pGC->subWindowMode);
-     (*pGC->ops->PolyGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1396,7 +1398,7 @@ damagePushPixels(GCPtr pGC,
-                  DrawablePtr pDrawable, int dx, int dy, int xOrg, int yOrg)
- {
-     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
--    if (checkGCDamage(pDamage, pGC)) {
-+    if (checkGCDamage(pDrawable, pGC)) {
-         BoxRec box;
- 
-         box.x1 = xOrg;
-@@ -1415,7 +1417,7 @@ damagePushPixels(GCPtr pGC,
-             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
-     }
-     (*pGC->ops->PushPixels) (pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
-     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
- }
- 
-@@ -1480,7 +1482,6 @@ damageCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-     ScreenPtr pScreen = pWindow->drawable.pScreen;
- 
-     damageScrPriv(pScreen);
--    drawableDamage(&pWindow->drawable);
- 
-     if (getWindowDamage(pWindow)) {
-         int dx = pWindow->drawable.x - ptOldOrg.x;
-@@ -1496,7 +1497,7 @@ damageCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
-     }
-     unwrap(pScrPriv, pScreen, CopyWindow);
-     (*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(&pWindow->drawable);
-     wrap(pScrPriv, pScreen, CopyWindow, damageCopyWindow);
- }
- 
-@@ -1870,22 +1871,20 @@ DamageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion)
- void
- DamageRegionProcessPending(DrawablePtr pDrawable)
- {
--    drawableDamage(pDrawable);
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
- }
- 
- /* This call is very odd, i'm leaving it intact for API sake, but please don't use it. */
- void
- DamageDamageRegion(DrawablePtr pDrawable, RegionPtr pRegion)
- {
--    drawableDamage(pDrawable);
-     damageRegionAppend(pDrawable, pRegion, FALSE, -1);
- 
-     /* Go back and report this damage for DamagePtrs with reportAfter set, since
-      * this call isn't part of an in-progress drawing op in the call chain and
-      * the DDX probably just wants to know about it right away.
-      */
--    damageRegionProcessPending(pDamage);
-+    damageRegionProcessPending(pDrawable);
- }
- 
- void
--- 
-cgit v0.10.2
-
-

Copied: xorg-server/trunk/git-fixes.diff (from rev 285310, xorg-server/trunk/damageRegionProcessPending.diff)
===================================================================
--- git-fixes.diff	                        (rev 0)
+++ git-fixes.diff	2017-01-05 20:36:04 UTC (rev 285311)
@@ -0,0 +1,614 @@
+From d6da2086951693e047fdd22b0d21c539ea1bb1e1 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax at redhat.com>
+Date: Mon, 12 Dec 2016 13:08:17 -0500
+Subject: Revert "damage: Make damageRegionProcessPending take a damage not a
+ drawable"
+
+The commit message makes the assertion that the code below damage is not
+allowed to change whether there's a damage monitor for the drawable.
+That turns out not to be the case! exa's mixed code, at least, will
+create and destroy a damage in PrepareAccess. The destroy path can then
+be catastrophic, as damageRegionProcessPending will attempt to
+RegionEmpty memory from the middle of a freed block.
+
+I'd wanted that invariant for performance, but faster isn't worth
+broken, so revert it. I think what exa's doing is reasonable, so the
+better way to improve performance for the unmonitored case is to either
+revisit dynamically wrapping into the GC, or inline damage into dix.
+
+This reverts commit 4e124203f2260daaf54155f4a05fe469733e0b97.
+
+Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1389886
+Signed-off-by: Adam Jackson <ajax at redhat.com>
+(cherry picked from commit 32e632e85894eddc3ace83f16f1e973b1be478fe)
+
+diff --git a/miext/damage/damage.c b/miext/damage/damage.c
+index 17c2abf..d6a3614 100644
+--- a/miext/damage/damage.c
++++ b/miext/damage/damage.c
+@@ -282,8 +282,10 @@ damageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion, Bool clip,
+ }
+ 
+ static void
+-damageRegionProcessPending(DamagePtr pDamage)
++damageRegionProcessPending(DrawablePtr pDrawable)
+ {
++    drawableDamage(pDrawable);
++
+     for (; pDamage != NULL; pDamage = pDamage->pNext) {
+         if (pDamage->reportAfter) {
+             /* It's possible that there is only interest in postRendering reporting. */
+@@ -358,7 +360,6 @@ damageCreateGC(GCPtr pGC)
+ 
+ #define DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable) \
+     damageGCPriv(pGC);  \
+-    drawableDamage(pDrawable); \
+     const GCFuncs *oldFuncs = pGC->funcs; \
+     unwrap(pGCPriv, pGC, funcs);  \
+     unwrap(pGCPriv, pGC, ops); \
+@@ -456,7 +457,7 @@ damageDestroyClip(GCPtr pGC)
+ #define BOX_NOT_EMPTY(box) \
+     (((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
+ 
+-#define checkGCDamage(d,g)	(d && \
++#define checkGCDamage(d,g)	(getDrawableDamage(d) && \
+ 				 (!g->pCompositeClip ||\
+ 				  RegionNotEmpty(g->pCompositeClip)))
+ 
+@@ -468,7 +469,8 @@ damageDestroyClip(GCPtr pGC)
+     if(box.y2 > extents->y2) box.y2 = extents->y2; \
+     }
+ 
+-#define checkPictureDamage(d, p) (d && RegionNotEmpty(p->pCompositeClip))
++#define checkPictureDamage(p)	(getDrawableDamage(p->pDrawable) && \
++				 RegionNotEmpty(p->pCompositeClip))
+ 
+ static void
+ damageComposite(CARD8 op,
+@@ -485,9 +487,8 @@ damageComposite(CARD8 op,
+     PictureScreenPtr ps = GetPictureScreen(pScreen);
+ 
+     damageScrPriv(pScreen);
+-    drawableDamage(pDst->pDrawable);
+ 
+-    if (checkPictureDamage(pDamage, pDst)) {
++    if (checkPictureDamage(pDst)) {
+         BoxRec box;
+ 
+         box.x1 = xDst + pDst->pDrawable->x;
+@@ -504,7 +505,7 @@ damageComposite(CARD8 op,
+                       pMask,
+                       pDst,
+                       xSrc, ySrc, xMask, yMask, xDst, yDst, width, height);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDst->pDrawable);
+     wrap(pScrPriv, ps, Composite, damageComposite);
+ }
+ 
+@@ -520,9 +521,8 @@ damageGlyphs(CARD8 op,
+     PictureScreenPtr ps = GetPictureScreen(pScreen);
+ 
+     damageScrPriv(pScreen);
+-    drawableDamage(pDst->pDrawable);
+ 
+-    if (checkPictureDamage(pDamage, pDst)) {
++    if (checkPictureDamage(pDst)) {
+         int nlistTmp = nlist;
+         GlyphListPtr listTmp = list;
+         GlyphPtr *glyphsTmp = glyphs;
+@@ -567,7 +567,7 @@ damageGlyphs(CARD8 op,
+     }
+     unwrap(pScrPriv, ps, Glyphs);
+     (*ps->Glyphs) (op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDst->pDrawable);
+     wrap(pScrPriv, ps, Glyphs, damageGlyphs);
+ }
+ 
+@@ -579,9 +579,8 @@ damageAddTraps(PicturePtr pPicture,
+     PictureScreenPtr ps = GetPictureScreen(pScreen);
+ 
+     damageScrPriv(pScreen);
+-    drawableDamage(pPicture->pDrawable);
+ 
+-    if (checkPictureDamage(pDamage, pPicture)) {
++    if (checkPictureDamage(pPicture)) {
+         BoxRec box;
+         int i;
+         int x, y;
+@@ -616,7 +615,7 @@ damageAddTraps(PicturePtr pPicture,
+     }
+     unwrap(pScrPriv, ps, AddTraps);
+     (*ps->AddTraps) (pPicture, x_off, y_off, ntrap, traps);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pPicture->pDrawable);
+     wrap(pScrPriv, ps, AddTraps, damageAddTraps);
+ }
+ 
+@@ -628,7 +627,7 @@ damageFillSpans(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (npt && checkGCDamage(pDamage, pGC)) {
++    if (npt && checkGCDamage(pDrawable, pGC)) {
+         int nptTmp = npt;
+         DDXPointPtr pptTmp = ppt;
+         int *pwidthTmp = pwidth;
+@@ -664,7 +663,7 @@ damageFillSpans(DrawablePtr pDrawable,
+ 
+     (*pGC->ops->FillSpans) (pDrawable, pGC, npt, ppt, pwidth, fSorted);
+ 
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -676,7 +675,7 @@ damageSetSpans(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (npt && checkGCDamage(pDamage, pGC)) {
++    if (npt && checkGCDamage(pDrawable, pGC)) {
+         DDXPointPtr pptTmp = ppt;
+         int *pwidthTmp = pwidth;
+         int nptTmp = npt;
+@@ -710,7 +709,7 @@ damageSetSpans(DrawablePtr pDrawable,
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->SetSpans) (pDrawable, pGC, pcharsrc, ppt, pwidth, npt, fSorted);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -722,7 +721,7 @@ damagePutImage(DrawablePtr pDrawable,
+                int y, int w, int h, int leftPad, int format, char *pImage)
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+-    if (checkGCDamage(pDamage, pGC)) {
++    if (checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+ 
+         box.x1 = x + pDrawable->x;
+@@ -736,7 +735,7 @@ damagePutImage(DrawablePtr pDrawable,
+     }
+     (*pGC->ops->PutImage) (pDrawable, pGC, depth, x, y, w, h,
+                            leftPad, format, pImage);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -750,7 +749,7 @@ damageCopyArea(DrawablePtr pSrc,
+ 
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
+ 
+-    if (checkGCDamage(pDamage, pGC)) {
++    if (checkGCDamage(pDst, pGC)) {
+         BoxRec box;
+ 
+         box.x1 = dstx + pDst->x;
+@@ -765,7 +764,7 @@ damageCopyArea(DrawablePtr pSrc,
+ 
+     ret = (*pGC->ops->CopyArea) (pSrc, pDst,
+                                  pGC, srcx, srcy, width, height, dstx, dsty);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDst);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
+     return ret;
+ }
+@@ -783,7 +782,7 @@ damageCopyPlane(DrawablePtr pSrc,
+ 
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDst);
+ 
+-    if (checkGCDamage(pDamage, pGC)) {
++    if (checkGCDamage(pDst, pGC)) {
+         BoxRec box;
+ 
+         box.x1 = dstx + pDst->x;
+@@ -799,7 +798,7 @@ damageCopyPlane(DrawablePtr pSrc,
+     ret = (*pGC->ops->CopyPlane) (pSrc, pDst,
+                                   pGC, srcx, srcy, width, height, dstx, dsty,
+                                   bitPlane);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDst);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDst);
+     return ret;
+ }
+@@ -810,7 +809,7 @@ damagePolyPoint(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (npt && checkGCDamage(pDamage, pGC)) {
++    if (npt && checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+         int nptTmp = npt;
+         xPoint *pptTmp = ppt;
+@@ -840,7 +839,7 @@ damagePolyPoint(DrawablePtr pDrawable,
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->PolyPoint) (pDrawable, pGC, mode, npt, ppt);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -850,7 +849,7 @@ damagePolylines(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (npt && checkGCDamage(pDamage, pGC)) {
++    if (npt && checkGCDamage(pDrawable, pGC)) {
+         int nptTmp = npt;
+         DDXPointPtr pptTmp = ppt;
+         BoxRec box;
+@@ -913,7 +912,7 @@ damagePolylines(DrawablePtr pDrawable,
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->Polylines) (pDrawable, pGC, mode, npt, ppt);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -922,7 +921,7 @@ damagePolySegment(DrawablePtr pDrawable, GCPtr pGC, int nSeg, xSegment * pSeg)
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (nSeg && checkGCDamage(pDamage, pGC)) {
++    if (nSeg && checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+         int extra = pGC->lineWidth;
+         int nsegTmp = nSeg;
+@@ -992,7 +991,7 @@ damagePolySegment(DrawablePtr pDrawable, GCPtr pGC, int nSeg, xSegment * pSeg)
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->PolySegment) (pDrawable, pGC, nSeg, pSeg);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1002,7 +1001,7 @@ damagePolyRectangle(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (nRects && checkGCDamage(pDamage, pGC)) {
++    if (nRects && checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+         int offset1, offset2, offset3;
+         int nRectsTmp = nRects;
+@@ -1051,7 +1050,7 @@ damagePolyRectangle(DrawablePtr pDrawable,
+         }
+     }
+     (*pGC->ops->PolyRectangle) (pDrawable, pGC, nRects, pRects);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1060,7 +1059,7 @@ damagePolyArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (nArcs && checkGCDamage(pDamage, pGC)) {
++    if (nArcs && checkGCDamage(pDrawable, pGC)) {
+         int extra = pGC->lineWidth >> 1;
+         BoxRec box;
+         int nArcsTmp = nArcs;
+@@ -1098,7 +1097,7 @@ damagePolyArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->PolyArc) (pDrawable, pGC, nArcs, pArcs);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1108,7 +1107,7 @@ damageFillPolygon(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (npt > 2 && checkGCDamage(pDamage, pGC)) {
++    if (npt > 2 && checkGCDamage(pDrawable, pGC)) {
+         DDXPointPtr pptTmp = ppt;
+         int nptTmp = npt;
+         BoxRec box;
+@@ -1157,7 +1156,7 @@ damageFillPolygon(DrawablePtr pDrawable,
+     }
+ 
+     (*pGC->ops->FillPolygon) (pDrawable, pGC, shape, mode, npt, ppt);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1166,7 +1165,7 @@ damagePolyFillRect(DrawablePtr pDrawable,
+                    GCPtr pGC, int nRects, xRectangle *pRects)
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+-    if (nRects && checkGCDamage(pDamage, pGC)) {
++    if (nRects && checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+         xRectangle *pRectsTmp = pRects;
+         int nRectsTmp = nRects;
+@@ -1193,7 +1192,7 @@ damagePolyFillRect(DrawablePtr pDrawable,
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->PolyFillRect) (pDrawable, pGC, nRects, pRects);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1202,7 +1201,7 @@ damagePolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+ 
+-    if (nArcs && checkGCDamage(pDamage, pGC)) {
++    if (nArcs && checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+         int nArcsTmp = nArcs;
+         xArc *pArcsTmp = pArcs;
+@@ -1229,7 +1228,7 @@ damagePolyFillArc(DrawablePtr pDrawable, GCPtr pGC, int nArcs, xArc * pArcs)
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->PolyFillArc) (pDrawable, pGC, nArcs, pArcs);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1278,9 +1277,12 @@ damageDamageChars(DrawablePtr pDrawable,
+ #define TT_IMAGE16 3
+ 
+ static void
+-damageText(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned long count,
+-           char *chars, FontEncoding fontEncoding, DamagePtr pDamage,
+-           Bool textType)
++damageText(DrawablePtr pDrawable,
++           GCPtr pGC,
++           int x,
++           int y,
++           unsigned long count,
++           char *chars, FontEncoding fontEncoding, Bool textType)
+ {
+     CharInfoPtr *charinfo;
+     unsigned long i;
+@@ -1289,7 +1291,7 @@ damageText(DrawablePtr pDrawable, GCPtr pGC, int x, int y, unsigned long count,
+ 
+     imageblt = (textType == TT_IMAGE8) || (textType == TT_IMAGE16);
+ 
+-    if (!pDamage)
++    if (!checkGCDamage(pDrawable, pGC))
+         return;
+ 
+     charinfo = xallocarray(count, sizeof(CharInfoPtr));
+@@ -1314,9 +1316,9 @@ damagePolyText8(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+     damageText(pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
+-               pDamage, TT_POLY8);
++               TT_POLY8);
+     x = (*pGC->ops->PolyText8) (pDrawable, pGC, x, y, count, chars);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+     return x;
+ }
+@@ -1328,9 +1330,9 @@ damagePolyText16(DrawablePtr pDrawable,
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+     damageText(pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
+                FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
+-               pDamage, TT_POLY16);
++               TT_POLY16);
+     x = (*pGC->ops->PolyText16) (pDrawable, pGC, x, y, count, chars);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+     return x;
+ }
+@@ -1341,9 +1343,9 @@ damageImageText8(DrawablePtr pDrawable,
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+     damageText(pDrawable, pGC, x, y, (unsigned long) count, chars, Linear8Bit,
+-               pDamage, TT_IMAGE8);
++               TT_IMAGE8);
+     (*pGC->ops->ImageText8) (pDrawable, pGC, x, y, count, chars);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1354,9 +1356,9 @@ damageImageText16(DrawablePtr pDrawable,
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+     damageText(pDrawable, pGC, x, y, (unsigned long) count, (char *) chars,
+                FONTLASTROW(pGC->font) == 0 ? Linear16Bit : TwoD16Bit,
+-               pDamage, TT_IMAGE16);
++               TT_IMAGE16);
+     (*pGC->ops->ImageText16) (pDrawable, pGC, x, y, count, chars);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1371,7 +1373,7 @@ damageImageGlyphBlt(DrawablePtr pDrawable,
+     damageDamageChars(pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
+                       nglyph, ppci, TRUE, pGC->subWindowMode);
+     (*pGC->ops->ImageGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1386,7 +1388,7 @@ damagePolyGlyphBlt(DrawablePtr pDrawable,
+     damageDamageChars(pDrawable, pGC->font, x + pDrawable->x, y + pDrawable->y,
+                       nglyph, ppci, FALSE, pGC->subWindowMode);
+     (*pGC->ops->PolyGlyphBlt) (pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1396,7 +1398,7 @@ damagePushPixels(GCPtr pGC,
+                  DrawablePtr pDrawable, int dx, int dy, int xOrg, int yOrg)
+ {
+     DAMAGE_GC_OP_PROLOGUE(pGC, pDrawable);
+-    if (checkGCDamage(pDamage, pGC)) {
++    if (checkGCDamage(pDrawable, pGC)) {
+         BoxRec box;
+ 
+         box.x1 = xOrg;
+@@ -1415,7 +1417,7 @@ damagePushPixels(GCPtr pGC,
+             damageDamageBox(pDrawable, &box, pGC->subWindowMode);
+     }
+     (*pGC->ops->PushPixels) (pGC, pBitMap, pDrawable, dx, dy, xOrg, yOrg);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+     DAMAGE_GC_OP_EPILOGUE(pGC, pDrawable);
+ }
+ 
+@@ -1480,7 +1482,6 @@ damageCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+     ScreenPtr pScreen = pWindow->drawable.pScreen;
+ 
+     damageScrPriv(pScreen);
+-    drawableDamage(&pWindow->drawable);
+ 
+     if (getWindowDamage(pWindow)) {
+         int dx = pWindow->drawable.x - ptOldOrg.x;
+@@ -1496,7 +1497,7 @@ damageCopyWindow(WindowPtr pWindow, DDXPointRec ptOldOrg, RegionPtr prgnSrc)
+     }
+     unwrap(pScrPriv, pScreen, CopyWindow);
+     (*pScreen->CopyWindow) (pWindow, ptOldOrg, prgnSrc);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(&pWindow->drawable);
+     wrap(pScrPriv, pScreen, CopyWindow, damageCopyWindow);
+ }
+ 
+@@ -1870,22 +1871,20 @@ DamageRegionAppend(DrawablePtr pDrawable, RegionPtr pRegion)
+ void
+ DamageRegionProcessPending(DrawablePtr pDrawable)
+ {
+-    drawableDamage(pDrawable);
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+ }
+ 
+ /* This call is very odd, i'm leaving it intact for API sake, but please don't use it. */
+ void
+ DamageDamageRegion(DrawablePtr pDrawable, RegionPtr pRegion)
+ {
+-    drawableDamage(pDrawable);
+     damageRegionAppend(pDrawable, pRegion, FALSE, -1);
+ 
+     /* Go back and report this damage for DamagePtrs with reportAfter set, since
+      * this call isn't part of an in-progress drawing op in the call chain and
+      * the DDX probably just wants to know about it right away.
+      */
+-    damageRegionProcessPending(pDamage);
++    damageRegionProcessPending(pDrawable);
+ }
+ 
+ void
+-- 
+cgit v0.10.2
+
+From 1b42f9505ff3a39b441464f553442079b750fe88 Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer at who-t.net>
+Date: Thu, 8 Dec 2016 14:32:06 +1000
+Subject: os: return 0 from check_timers if we touched any of them
+
+Fixes a regression introduced in 0b2f30834b1a9f. If a driver posts input
+events during a timer function (wacom and synaptics do this during tap
+timeouts), ProcessInputEvents() is not called for these events. There are no
+new events on any fds, so the events just sit in the queue waiting for
+something else to happen.
+
+Fix this by simply returning 0 from check_timers if we ran at least one of
+them or reset them all. This way the callers ospoll_wait will exit and
+continue with normal processing.
+
+Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
+Reviewed-by: Keith Packard <keithp at keithp.com>
+
+diff --git a/os/WaitFor.c b/os/WaitFor.c
+index ff1c85e..613608f 100644
+--- a/os/WaitFor.c
++++ b/os/WaitFor.c
+@@ -143,7 +143,7 @@ check_timers(void)
+ {
+     OsTimerPtr timer;
+ 
+-    while ((timer = first_timer()) != NULL) {
++    if ((timer = first_timer()) != NULL) {
+         CARD32 now = GetTimeInMillis();
+         int timeout = timer->expires - now;
+ 
+@@ -157,6 +157,8 @@ check_timers(void)
+             /* time has rewound.  reset the timers. */
+             CheckAllTimers();
+         }
++
++        return 0;
+     }
+     return -1;
+ }
+-- 
+cgit v0.10.2
+
+From 05e19644250698aa126a60bc671e85425df784d1 Mon Sep 17 00:00:00 2001
+From: Hans De Goede <hdegoede at redhat.com>
+Date: Tue, 20 Dec 2016 13:00:43 +0100
+Subject: glamor: Trust eglGetPlatformDisplayEXT if it exists
+
+If the libEGL we are using has eglGetPlatformDisplayEXT, yet it still
+returns NULL, then this very likely means that it does not support the
+type (e.g. EGL_PLATFORM_GBM_MESA) passed in, and then returning NULL is
+the right thing to do.
+
+This avoids falling back to an eglGetDisplay() implementation which does
+not understands the passed in gbm handle, treats it as a pointer to
+something else completely, followed by a crash sooner or later.
+
+Specifically this fixes using the nvidia binary driver, with nvidia's
+libEGL + the modesetting driver on a secondary GPU crashing inside
+glamor_egl_init() sometimes.
+
+Cc: Eric Anholt <eric at anholt.net>
+Reviewed-by: Adam Jackson <ajax at redhat.com>
+Signed-off-by: Hans de Goede <hdegoede at redhat.com>
+
+diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c
+index 9cc0f8d..4bde637 100644
+--- a/glamor/glamor_egl.c
++++ b/glamor/glamor_egl.c
+@@ -769,6 +769,10 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
+ 
+     glamor_egl->display = glamor_egl_get_display(EGL_PLATFORM_GBM_MESA,
+                                                  glamor_egl->gbm);
++    if (!glamor_egl->display) {
++        xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglGetDisplay() failed\n");
++        goto error;
++    }
+ #else
+     glamor_egl->display = eglGetDisplay((EGLNativeDisplayType) (intptr_t) fd);
+ #endif
+diff --git a/glamor/glamor_egl.h b/glamor/glamor_egl.h
+index 6b05f57..2c6d307 100644
+--- a/glamor/glamor_egl.h
++++ b/glamor/glamor_egl.h
+@@ -67,9 +67,7 @@ glamor_egl_get_display(EGLint type, void *native)
+         PFNEGLGETPLATFORMDISPLAYEXTPROC getPlatformDisplayEXT =
+             (void *) eglGetProcAddress("eglGetPlatformDisplayEXT");
+         if (getPlatformDisplayEXT)
+-            dpy = getPlatformDisplayEXT(type, native, NULL);
+-        if (dpy)
+-            return dpy;
++            return getPlatformDisplayEXT(type, native, NULL);
+     }
+ 
+     /* Welp, everything is awful. */
+-- 
+cgit v0.10.2
+
+



More information about the arch-commits mailing list