[xorg-x11-server] bugfixes from -next

Adam Jackson ajax at fedoraproject.org
Wed Mar 30 20:00:25 UTC 2011


commit 6debda7ca9d216d759501602b494d74e8d1b0e81
Author: Adam Jackson <ajax at redhat.com>
Date:   Wed Mar 30 16:07:40 2011 -0400

    bugfixes from -next

 xorg-x11-server.spec                |    9 +++-
 xserver-1.10-bg-none-revert.patch   |   62 +++++++++++++++++++++++
 xserver-1.10-glx-pixmap-crash.patch |   93 +++++++++++++++++++++++++++++++++++
 3 files changed, 163 insertions(+), 1 deletions(-)
---
diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec
index 91c9a79..04e37d9 100644
--- a/xorg-x11-server.spec
+++ b/xorg-x11-server.spec
@@ -30,7 +30,7 @@
 Summary:   X.Org X11 X server
 Name:      xorg-x11-server
 Version:   1.10.0
-Release:   6%{?gitdate:.%{gitdate}}%{dist}
+Release:   7%{?gitdate:.%{gitdate}}%{dist}
 URL:       http://www.x.org
 License:   MIT
 Group:     User Interface/X
@@ -86,6 +86,9 @@ Patch7005: xserver-1.9.0-qxl-fallback.patch
 
 Patch7006: xserver-1.10-pointer-barriers.patch
 Patch7007: xserver-1.10-vbe-malloc.patch
+# from ajax/xserver-next
+Patch7008: xserver-1.10-glx-pixmap-crash.patch
+Patch7009: xserver-1.10-bg-none-revert.patch
 
 %define moduledir	%{_libdir}/xorg/modules
 %define drimoduledir	%{_libdir}/dri
@@ -551,6 +554,10 @@ rm -rf $RPM_BUILD_ROOT
 %{xserver_source_dir}
 
 %changelog
+* Wed Mar 30 2011 Adam Jackson <ajax at redhat.com> 1.10.0-7
+- xserver-1.10-glx-pixmap-crash.patch, xserver-1.10-bg-none-revert.patch:
+  bugfixes from xserver-next
+
 * Tue Mar 22 2011 Adam Jackson <ajax at redhat.com> 1.10.0-6
 - Fix thinko in pointer barrier patch
 
diff --git a/xserver-1.10-bg-none-revert.patch b/xserver-1.10-bg-none-revert.patch
new file mode 100644
index 0000000..1388522
--- /dev/null
+++ b/xserver-1.10-bg-none-revert.patch
@@ -0,0 +1,62 @@
+From 3bc6ed2d8c9028ec28015d05b60af67a194f3694 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax at redhat.com>
+Date: Tue, 29 Mar 2011 10:09:46 -0400
+Subject: [PATCH 2/2] Revert "composite: Don't backfill non-bg-None windows"
+
+This reverts commit 6dd775f57d2f94f0ddaee324aeec33b9b66ed5bc.
+
+Bugzilla: https://bugs.freedesktop.org/34427
+
+Acked-by: Alex Deucher <alexdeucher at gmail.com>
+Signed-off-by: Adam Jackson <ajax at redhat.com>
+---
+ composite/compalloc.c |   26 --------------------------
+ 1 files changed, 0 insertions(+), 26 deletions(-)
+
+diff --git a/composite/compalloc.c b/composite/compalloc.c
+index e4064f6..7164c0d 100644
+--- a/composite/compalloc.c
++++ b/composite/compalloc.c
+@@ -508,17 +508,6 @@ compUnredirectOneSubwindow (WindowPtr pParent, WindowPtr pWin)
+     return Success;
+ }
+ 
+-static int
+-bgNoneVisitWindow(WindowPtr pWin, void *null)
+-{
+-    if (pWin->backgroundState != BackgroundPixmap)
+-	return WT_WALKCHILDREN;
+-    if (pWin->background.pixmap != None)
+-	return WT_WALKCHILDREN;
+-
+-    return WT_STOPWALKING;
+-}
+-
+ static PixmapPtr
+ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h, Bool map)
+ {
+@@ -539,21 +528,6 @@ compNewPixmap (WindowPtr pWin, int x, int y, int w, int h, Bool map)
+     if (!map)
+ 	return pPixmap;
+ 
+-    /*
+-     * If there's no bg=None in the tree, we're done.
+-     *
+-     * We could optimize this more by collection the regions of all the
+-     * bg=None subwindows and feeding that in as the clip for the
+-     * CopyArea below, but since window trees are shallow these days it
+-     * might not be worth the effort.
+-     */
+-    if (TraverseTree(pWin, bgNoneVisitWindow, NULL) == WT_NOMATCH)
+-	return pPixmap;
+-
+-    /*
+-     * Copy bits from the parent into the new pixmap so that it will
+-     * have "reasonable" contents in case for background None areas.
+-     */
+     if (pParent->drawable.depth == pWin->drawable.depth)
+     {
+ 	GCPtr	pGC = GetScratchGC (pWin->drawable.depth, pScreen);
+-- 
+1.7.4.1
+
diff --git a/xserver-1.10-glx-pixmap-crash.patch b/xserver-1.10-glx-pixmap-crash.patch
new file mode 100644
index 0000000..ae635af
--- /dev/null
+++ b/xserver-1.10-glx-pixmap-crash.patch
@@ -0,0 +1,93 @@
+From 2fefa1aff56f6d24dcc0206c60da3d9487832504 Mon Sep 17 00:00:00 2001
+From: Adam Jackson <ajax at redhat.com>
+Date: Wed, 30 Mar 2011 16:03:53 -0400
+Subject: [PATCH] glx: Fix lifetime tracking for pixmaps
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+GLX pixmaps take a reference on the underlying pixmap; X and GLX pixmap
+IDs can be destroyed in either order with no error.  Only windows need
+to be tracked under both XIDs.
+
+Fixes piglit/glx-pixmap-life.
+
+Reviewed-by: Michel Dänzer <michel at daenzer.net>
+Signed-off-by: Adam Jackson <ajax at redhat.com>
+---
+ glx/glxcmds.c |   11 +++++++----
+ glx/glxext.c  |   22 +++++++++++++---------
+ 2 files changed, 20 insertions(+), 13 deletions(-)
+
+diff --git a/glx/glxcmds.c b/glx/glxcmds.c
+index 9b4bc9e..9d60bdb 100644
+--- a/glx/glxcmds.c
++++ b/glx/glxcmds.c
+@@ -1177,10 +1177,11 @@ DoCreateGLXDrawable(ClientPtr client, __GLXscreen *pGlxScreen,
+ 	return BadAlloc;
+     }
+ 
+-    /* Add the glx drawable under the XID of the underlying X drawable
+-     * too.  That way we'll get a callback in DrawableGone and can
+-     * clean up properly when the drawable is destroyed. */
+-    if (drawableId != glxDrawableId &&
++    /*
++     * Windows aren't refcounted, so track both the X and the GLX window
++     * so we get called regardless of destruction order.
++     */
++    if (drawableId != glxDrawableId && type == GLX_DRAWABLE_WINDOW &&
+ 	!AddResource(pDraw->id, __glXDrawableRes, pGlxDraw)) {
+ 	pGlxDraw->destroy (pGlxDraw);
+ 	return BadAlloc;
+@@ -1211,6 +1212,8 @@ DoCreateGLXPixmap(ClientPtr client, __GLXscreen *pGlxScreen, __GLXconfig *config
+     err = DoCreateGLXDrawable(client, pGlxScreen, config, pDraw, drawableId,
+ 			      glxDrawableId, GLX_DRAWABLE_PIXMAP);
+ 
++    ((PixmapPtr)pDraw)->refcnt++;
++
+     return err;
+ }
+ 
+diff --git a/glx/glxext.c b/glx/glxext.c
+index 4bd5d6b..cec3ee5 100644
+--- a/glx/glxext.c
++++ b/glx/glxext.c
+@@ -124,15 +124,15 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
+ {
+     __GLXcontext *c, *next;
+ 
+-    /* If this drawable was created using glx 1.3 drawable
+-     * constructors, we added it as a glx drawable resource under both
+-     * its glx drawable ID and it X drawable ID.  Remove the other
+-     * resource now so we don't a callback for freed memory. */
+-    if (glxPriv->drawId != glxPriv->pDraw->id) {
+-	if (xid == glxPriv->drawId)
+-	    FreeResourceByType(glxPriv->pDraw->id, __glXDrawableRes, TRUE);
+-	else
+-	    FreeResourceByType(glxPriv->drawId, __glXDrawableRes, TRUE);
++    if (glxPriv->type == GLX_DRAWABLE_WINDOW) {
++        /* If this was created by glXCreateWindow, free the matching resource */
++        if (glxPriv->drawId != glxPriv->pDraw->id) {
++            if (xid == glxPriv->drawId)
++                FreeResourceByType(glxPriv->pDraw->id, __glXDrawableRes, TRUE);
++            else
++                FreeResourceByType(glxPriv->drawId, __glXDrawableRes, TRUE);
++        }
++        /* otherwise this window was implicitly created by MakeCurrent */
+     }
+ 
+     for (c = glxAllContexts; c; c = next) {
+@@ -168,6 +168,10 @@ static Bool DrawableGone(__GLXdrawable *glxPriv, XID xid)
+ 	    __glXFreeContext(c);
+     }
+ 
++    /* drop our reference to any backing pixmap */
++    if (glxPriv->type == GLX_DRAWABLE_PIXMAP)
++        glxPriv->pDraw->pScreen->DestroyPixmap((PixmapPtr)glxPriv->pDraw);
++
+     glxPriv->destroy(glxPriv);
+ 
+     return True;
+-- 
+1.7.4.1
+


More information about the scm-commits mailing list