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 <a...@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 <a...@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 <a...@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 <a...@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.hutte...@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.hutte...@who-t.net> +Reviewed-by: Keith Packard <kei...@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 <hdego...@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 <e...@anholt.net> +Reviewed-by: Adam Jackson <a...@redhat.com> +Signed-off-by: Hans de Goede <hdego...@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 + +