debian/changelog | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-)
New commits: commit c399c3d272c9152d614facb27d59ba74c5d32615 Author: Christopher James Halse Rogers <christopher.halse.rog...@canonical.com> Date: Thu Sep 16 16:07:57 2010 +0200 Revert 0ubuntu2. This is a clutter bug, fixed in clutter 1.2.12-0ubuntu12 diff --git a/debian/changelog b/debian/changelog index d35bd03..f77f0e2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +mesa (7.9~git20100909-0ubuntu3) maverick; urgency=low + + * Drop the changes from previous upload. The Unity white screen problem + is clutter bug #632352, fixed in clutter-1.0 1.2.12-0ubuntu12. + + -- Christopher James Halse Rogers <r...@ubuntu.com> Thu, 16 Sep 2010 16:04:28 +0200 + mesa (7.9~git20100909-0ubuntu2) maverick; urgency=low * 105_old_gc_ignore_destroyed_drawable_events.patch (revert), diff --git a/debian/patches/105_old_gc_ignore_destroyed_drawable_events.patch b/debian/patches/105_old_gc_ignore_destroyed_drawable_events.patch deleted file mode 100644 index cf51117..0000000 --- a/debian/patches/105_old_gc_ignore_destroyed_drawable_events.patch +++ /dev/null @@ -1,23 +0,0 @@ -commit f24ec6367b1cf6c6822fa998df8a877288711427 -Author: Kristian Høgsberg <k...@bitplanet.net> -Date: Wed Sep 8 18:54:30 2010 -0400 - - glx: Ignore DRI2 event for drawables we've destroyed - - Since we now actually destroy GLX drawables, we get into situations where - we get events for drawables that no longer exist. Just ignore the - event in that case. - -diff --git a/src/glx/dri2.c b/src/glx/dri2.c -index d410898..30999c8 100644 ---- a/src/glx/dri2.c -+++ b/src/glx/dri2.c -@@ -103,7 +103,7 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire) - - /* Ignore swap events if we're not looking for them */ - pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, awire->drawable); -- if (!(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) -+ if (!pdraw || !(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) - return False; - - aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); diff --git a/debian/patches/106_old_gc_fix_use_after_free.patch b/debian/patches/106_old_gc_fix_use_after_free.patch deleted file mode 100644 index 76cfb73..0000000 --- a/debian/patches/106_old_gc_fix_use_after_free.patch +++ /dev/null @@ -1,37 +0,0 @@ -commit 659dab6be6bc82f8a0551c30f1133e0010f04ed8 -Author: Kristian Høgsberg <k...@bitplanet.net> -Date: Wed Sep 8 14:51:18 2010 -0400 - - glx: Fix use after free problem - -diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c -index 710985b..0d359f7 100644 ---- a/src/glx/glxcurrent.c -+++ b/src/glx/glxcurrent.c -@@ -248,12 +248,6 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, - oldGC->currentDrawable = None; - oldGC->currentReadable = None; - oldGC->thread_id = 0; -- if (oldGC->xid == None && oldGC != gc) -- /* We are switching away from a context that was -- * previously destroyed, so we need to free the memory -- * for the old handle. -- */ -- oldGC->vtable->destroy(oldGC); - } - - if (gc) { -@@ -267,6 +261,13 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, - __glXSetCurrentContextNull(); - } - -+ if (oldGC != &dummyContext && oldGC->xid == None && oldGC != gc) { -+ /* We are switching away from a context that was -+ * previously destroyed, so we need to free the memory -+ * for the old handle. */ -+ oldGC->vtable->destroy(oldGC); -+ } -+ - if (ret) { - __glXGenerateError(dpy, gc, None, ret, X_GLXMakeContextCurrent); - return GL_FALSE; diff --git a/debian/patches/107_old_gc_drop_broken_drawable_garbage_collector.patch b/debian/patches/107_old_gc_drop_broken_drawable_garbage_collector.patch deleted file mode 100644 index c3139e5..0000000 --- a/debian/patches/107_old_gc_drop_broken_drawable_garbage_collector.patch +++ /dev/null @@ -1,252 +0,0 @@ -commit 16887d042a917fa4773e4d853f50051b54e9948c -Author: Kristian Høgsberg <k...@bitplanet.net> -Date: Fri Aug 27 12:40:11 2010 -0400 - - glx: Drop broken drawable garbage collection - - Doesn't work for pixmaps, was looking up the GLX XID and was never thread - safe. Instead, just destroy the client side structures when the - drawable is no long current for a context. - -diff --git a/src/glx/dri2.c b/src/glx/dri2.c -index d70ec5a..d410898 100644 ---- a/src/glx/dri2.c -+++ b/src/glx/dri2.c -@@ -175,6 +175,14 @@ DRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code) - err->minorCode == X_DRI2CopyRegion) - return True; - -+ /* If the X drawable was destroyed before the GLX drawable, the -+ * DRI2 drawble will be gone by the time we call -+ * DRI2DestroyDrawable. So just ignore BadDrawable here. */ -+ if (err->majorCode == codes->major_opcode && -+ err->errorCode == BadDrawable && -+ err->minorCode == X_DRI2DestroyDrawable) -+ return True; -+ - return False; - } - -diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c -index ff48c79..e38a40c 100644 ---- a/src/glx/dri2_glx.c -+++ b/src/glx/dri2_glx.c -@@ -124,8 +124,6 @@ dri2_destroy_context(struct glx_context *context) - if (context->extensions) - XFree((char *) context->extensions); - -- GarbageCollectDRIDrawables(context->psc); -- - (*psc->core->destroyContext) (pcp->driContext); - - Xfree(pcp); -@@ -159,6 +157,8 @@ dri2_unbind_context(struct glx_context *context, struct glx_context *new) - struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; - - (*psc->core->unbindContext) (pcp->driContext); -+ -+ driReleaseDrawables(&pcp->base); - } - - static struct glx_context * -diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c -index a7fb4c6..5fb5255 100644 ---- a/src/glx/dri_common.c -+++ b/src/glx/dri_common.c -@@ -380,4 +380,29 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) - return pdraw; - } - -+_X_HIDDEN void -+driReleaseDrawables(struct glx_context *gc) -+{ -+ struct glx_display *const priv = __glXInitialize(gc->psc->dpy); -+ __GLXDRIdrawable *pdraw; -+ -+ if (priv == NULL) -+ return; -+ -+ if (__glxHashLookup(priv->drawHash, -+ gc->currentDrawable, (void *) &pdraw) == 0) { -+ if (pdraw->drawable == pdraw->xDrawable) -+ (*pdraw->destroyDrawable)(pdraw); -+ __glxHashDelete(priv->drawHash, gc->currentDrawable); -+ } -+ -+ if (gc->currentDrawable != gc->currentReadable && -+ __glxHashLookup(priv->drawHash, -+ gc->currentReadable, (void *) &pdraw) == 0) { -+ if (pdraw->drawable == pdraw->xDrawable) -+ (*pdraw->destroyDrawable)(pdraw); -+ __glxHashDelete(priv->drawHash, gc->currentReadable); -+ } -+} -+ - #endif /* GLX_DIRECT_RENDERING */ -diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h -index 846a905..13b5ae4 100644 ---- a/src/glx/dri_common.h -+++ b/src/glx/dri_common.h -@@ -55,6 +55,9 @@ extern void driDestroyConfigs(const __DRIconfig **configs); - extern __GLXDRIdrawable * - driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable); - -+extern void -+driReleaseDrawables(struct glx_context *gc); -+ - extern const __DRIsystemTimeExtension systemTimeExtension; - - extern void InfoMessageF(const char *f, ...); -diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c -index 43a2aa4..42b263c 100644 ---- a/src/glx/dri_glx.c -+++ b/src/glx/dri_glx.c -@@ -509,8 +509,6 @@ dri_destroy_context(struct glx_context * context) - if (context->extensions) - XFree((char *) context->extensions); - -- GarbageCollectDRIDrawables(context->psc); -- - (*psc->core->destroyContext) (pcp->driContext); - - XF86DRIDestroyContext(psc->base.dpy, psc->base.scr, pcp->hwContextID); -@@ -545,6 +543,8 @@ dri_unbind_context(struct glx_context *context, struct glx_context *new) - struct dri_screen *psc = (struct dri_screen *) pcp->base.psc; - - (*psc->core->unbindContext) (pcp->driContext); -+ -+ driReleaseDrawables(&pcp->base); - } - - static const struct glx_context_vtable dri_context_vtable = { -diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c -index c5b1791..237ce17 100644 ---- a/src/glx/drisw_glx.c -+++ b/src/glx/drisw_glx.c -@@ -250,8 +250,6 @@ drisw_destroy_context(struct glx_context *context) - if (context->extensions) - XFree((char *) context->extensions); - -- GarbageCollectDRIDrawables(context->psc); -- - (*psc->core->destroyContext) (pcp->driContext); - - Xfree(pcp); -@@ -285,6 +283,8 @@ drisw_unbind_context(struct glx_context *context, struct glx_context *new) - struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc; - - (*psc->core->unbindContext) (pcp->driContext); -+ -+ driReleaseDrawables(&pcp->base); - } - - static const struct glx_context_vtable drisw_context_vtable = { -diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c -index 9575156..4f7e84e 100644 ---- a/src/glx/glxcmds.c -+++ b/src/glx/glxcmds.c -@@ -63,56 +63,6 @@ static const char __glXGLXClientVersion[] = "1.4"; - - #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) - --static Bool windowExistsFlag; --static int --windowExistsErrorHandler(Display * dpy, XErrorEvent * xerr) --{ -- (void) dpy; -- -- if (xerr->error_code == BadWindow) { -- windowExistsFlag = GL_FALSE; -- } -- return 0; --} -- --/** -- * Find drawables in the local hash that have been destroyed on the -- * server. -- * -- * \param dpy Display to destroy drawables for -- * \param screen Screen number to destroy drawables for -- */ --_X_HIDDEN void --GarbageCollectDRIDrawables(struct glx_screen * sc) --{ -- XID draw; -- __GLXDRIdrawable *pdraw; -- struct glx_display *priv = sc->display; -- XWindowAttributes xwa; -- int (*oldXErrorHandler) (Display *, XErrorEvent *); -- -- /* Set no-op error handler so Xlib doesn't bail out if the windows -- * has alreay been destroyed on the server. */ -- XSync(priv->dpy, GL_FALSE); -- oldXErrorHandler = XSetErrorHandler(windowExistsErrorHandler); -- -- if (__glxHashFirst(priv->drawHash, &draw, (void *) &pdraw) == 1) { -- do { -- windowExistsFlag = GL_TRUE; -- XGetWindowAttributes(priv->dpy, draw, &xwa); /* dummy request */ -- if (!windowExistsFlag) { -- /* Destroy the local drawable data, if the drawable no -- longer exists in the Xserver */ -- (*pdraw->destroyDrawable) (pdraw); -- __glxHashDelete(priv->drawHash, draw); -- } -- } while (__glxHashNext(priv->drawHash, &draw, (void *) &pdraw) == 1); -- } -- -- XSync(priv->dpy, GL_FALSE); -- XSetErrorHandler(oldXErrorHandler); --} -- - /** - * Get the __DRIdrawable for the drawable associated with a GLXContext - * -diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c -index 98f66c2..710985b 100644 ---- a/src/glx/glxcurrent.c -+++ b/src/glx/glxcurrent.c -@@ -242,13 +242,13 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, - return False; - } - -- if (oldGC != &dummyContext && oldGC != gc) { -+ if (oldGC != &dummyContext) { - oldGC->vtable->unbind(oldGC, gc); - oldGC->currentDpy = 0; - oldGC->currentDrawable = None; - oldGC->currentReadable = None; - oldGC->thread_id = 0; -- if (oldGC->xid == None) -+ if (oldGC->xid == None && oldGC != gc) - /* We are switching away from a context that was - * previously destroyed, so we need to free the memory - * for the old handle. -@@ -257,12 +257,12 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, - } - - if (gc) { -- ret = gc->vtable->bind(gc, oldGC, draw, read); - gc->currentDpy = dpy; - gc->currentDrawable = draw; - gc->currentReadable = read; - gc->thread_id = _glthread_GetID(); - __glXSetCurrentContext(gc); -+ ret = gc->vtable->bind(gc, oldGC, draw, read); - } else { - __glXSetCurrentContextNull(); - } -diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c -index 61ceed3..1870ede 100644 ---- a/src/glx/indirect_glx.c -+++ b/src/glx/indirect_glx.c -@@ -168,6 +168,9 @@ indirect_unbind_context(struct glx_context *gc, struct glx_context *new) - int opcode = __glXSetupForCommand(dpy); - xGLXMakeCurrentReply reply; - -+ if (gc == new) -+ return; -+ - /* We are either switching to no context, away from a indirect - * context to a direct context or from one dpy to another and have - * to send a request to the dpy to unbind the previous context. diff --git a/debian/patches/series b/debian/patches/series index 48ff057..c267c2b 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -7,6 +7,3 @@ 101_ubuntu_hidden_glname.patch 103_savage-expose_fbmodes_with_nonzero_alpha.patch 104_i915_fragment_shader_disable.patch -105_old_gc_ignore_destroyed_drawable_events.patch -R -106_old_gc_fix_use_after_free.patch -R -107_old_gc_drop_broken_drawable_garbage_collector.patch -R commit 391df818b0020a9a901f4f1f67456bf2f80a115d Author: Christopher James Halse Rogers <christopher.halse.rog...@canonical.com> Date: Thu Sep 16 15:40:05 2010 +0200 Merge 0ubuntu2 from outside of git diff --git a/debian/changelog b/debian/changelog index d675d81..d35bd03 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,16 @@ +mesa (7.9~git20100909-0ubuntu2) maverick; urgency=low + + * 105_old_gc_ignore_destroyed_drawable_events.patch (revert), + 106_old_gc_fix_use_after_free.patch (revert), + 107_old_gc_drop_broken_drawable_garbage_collector.patch (revert): + These three related patches introduced a new garbage collector, however + this introduces a regression causing clutter/mutter/unity to load with + a blank white screen. Revert these three patches to restore mesa to + a working condition for unity. + (LP: #638808, #638725) + + -- Bryce Harrington <br...@ubuntu.com> Wed, 15 Sep 2010 19:32:52 -0700 + mesa (7.9~git20100909-0ubuntu1) maverick; urgency=low [ Robert Hooker ] @@ -14,7 +27,8 @@ mesa (7.9~git20100909-0ubuntu1) maverick; urgency=low instead. * Remove all references to mesa-utils now that its no longer shipped with the mesa source. - * Disable the experimental ARB_fragment_shader option by default on + * Add 104_i915_fragment_shader_disable.patch: + - Disable the experimental ARB_fragment_shader option by default on i915, it exposes incomplete functionality that breaks KDE compositing among other things. It can be enabled via driconf still. (LP: #628930) diff --git a/debian/patches/105_old_gc_ignore_destroyed_drawable_events.patch b/debian/patches/105_old_gc_ignore_destroyed_drawable_events.patch new file mode 100644 index 0000000..cf51117 --- /dev/null +++ b/debian/patches/105_old_gc_ignore_destroyed_drawable_events.patch @@ -0,0 +1,23 @@ +commit f24ec6367b1cf6c6822fa998df8a877288711427 +Author: Kristian Høgsberg <k...@bitplanet.net> +Date: Wed Sep 8 18:54:30 2010 -0400 + + glx: Ignore DRI2 event for drawables we've destroyed + + Since we now actually destroy GLX drawables, we get into situations where + we get events for drawables that no longer exist. Just ignore the + event in that case. + +diff --git a/src/glx/dri2.c b/src/glx/dri2.c +index d410898..30999c8 100644 +--- a/src/glx/dri2.c ++++ b/src/glx/dri2.c +@@ -103,7 +103,7 @@ DRI2WireToEvent(Display *dpy, XEvent *event, xEvent *wire) + + /* Ignore swap events if we're not looking for them */ + pdraw = dri2GetGlxDrawableFromXDrawableId(dpy, awire->drawable); +- if (!(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) ++ if (!pdraw || !(pdraw->eventMask & GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK)) + return False; + + aevent->serial = _XSetLastRequestRead(dpy, (xGenericReply *) wire); diff --git a/debian/patches/106_old_gc_fix_use_after_free.patch b/debian/patches/106_old_gc_fix_use_after_free.patch new file mode 100644 index 0000000..76cfb73 --- /dev/null +++ b/debian/patches/106_old_gc_fix_use_after_free.patch @@ -0,0 +1,37 @@ +commit 659dab6be6bc82f8a0551c30f1133e0010f04ed8 +Author: Kristian Høgsberg <k...@bitplanet.net> +Date: Wed Sep 8 14:51:18 2010 -0400 + + glx: Fix use after free problem + +diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c +index 710985b..0d359f7 100644 +--- a/src/glx/glxcurrent.c ++++ b/src/glx/glxcurrent.c +@@ -248,12 +248,6 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, + oldGC->currentDrawable = None; + oldGC->currentReadable = None; + oldGC->thread_id = 0; +- if (oldGC->xid == None && oldGC != gc) +- /* We are switching away from a context that was +- * previously destroyed, so we need to free the memory +- * for the old handle. +- */ +- oldGC->vtable->destroy(oldGC); + } + + if (gc) { +@@ -267,6 +261,13 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, + __glXSetCurrentContextNull(); + } + ++ if (oldGC != &dummyContext && oldGC->xid == None && oldGC != gc) { ++ /* We are switching away from a context that was ++ * previously destroyed, so we need to free the memory ++ * for the old handle. */ ++ oldGC->vtable->destroy(oldGC); ++ } ++ + if (ret) { + __glXGenerateError(dpy, gc, None, ret, X_GLXMakeContextCurrent); + return GL_FALSE; diff --git a/debian/patches/107_old_gc_drop_broken_drawable_garbage_collector.patch b/debian/patches/107_old_gc_drop_broken_drawable_garbage_collector.patch new file mode 100644 index 0000000..c3139e5 --- /dev/null +++ b/debian/patches/107_old_gc_drop_broken_drawable_garbage_collector.patch @@ -0,0 +1,252 @@ +commit 16887d042a917fa4773e4d853f50051b54e9948c +Author: Kristian Høgsberg <k...@bitplanet.net> +Date: Fri Aug 27 12:40:11 2010 -0400 + + glx: Drop broken drawable garbage collection + + Doesn't work for pixmaps, was looking up the GLX XID and was never thread + safe. Instead, just destroy the client side structures when the + drawable is no long current for a context. + +diff --git a/src/glx/dri2.c b/src/glx/dri2.c +index d70ec5a..d410898 100644 +--- a/src/glx/dri2.c ++++ b/src/glx/dri2.c +@@ -175,6 +175,14 @@ DRI2Error(Display *display, xError *err, XExtCodes *codes, int *ret_code) + err->minorCode == X_DRI2CopyRegion) + return True; + ++ /* If the X drawable was destroyed before the GLX drawable, the ++ * DRI2 drawble will be gone by the time we call ++ * DRI2DestroyDrawable. So just ignore BadDrawable here. */ ++ if (err->majorCode == codes->major_opcode && ++ err->errorCode == BadDrawable && ++ err->minorCode == X_DRI2DestroyDrawable) ++ return True; ++ + return False; + } + +diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c +index ff48c79..e38a40c 100644 +--- a/src/glx/dri2_glx.c ++++ b/src/glx/dri2_glx.c +@@ -124,8 +124,6 @@ dri2_destroy_context(struct glx_context *context) + if (context->extensions) + XFree((char *) context->extensions); + +- GarbageCollectDRIDrawables(context->psc); +- + (*psc->core->destroyContext) (pcp->driContext); + + Xfree(pcp); +@@ -159,6 +157,8 @@ dri2_unbind_context(struct glx_context *context, struct glx_context *new) + struct dri2_screen *psc = (struct dri2_screen *) pcp->base.psc; + + (*psc->core->unbindContext) (pcp->driContext); ++ ++ driReleaseDrawables(&pcp->base); + } + + static struct glx_context * +diff --git a/src/glx/dri_common.c b/src/glx/dri_common.c +index a7fb4c6..5fb5255 100644 +--- a/src/glx/dri_common.c ++++ b/src/glx/dri_common.c +@@ -380,4 +380,29 @@ driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable) + return pdraw; + } + ++_X_HIDDEN void ++driReleaseDrawables(struct glx_context *gc) ++{ ++ struct glx_display *const priv = __glXInitialize(gc->psc->dpy); ++ __GLXDRIdrawable *pdraw; ++ ++ if (priv == NULL) ++ return; ++ ++ if (__glxHashLookup(priv->drawHash, ++ gc->currentDrawable, (void *) &pdraw) == 0) { ++ if (pdraw->drawable == pdraw->xDrawable) ++ (*pdraw->destroyDrawable)(pdraw); ++ __glxHashDelete(priv->drawHash, gc->currentDrawable); ++ } ++ ++ if (gc->currentDrawable != gc->currentReadable && ++ __glxHashLookup(priv->drawHash, ++ gc->currentReadable, (void *) &pdraw) == 0) { ++ if (pdraw->drawable == pdraw->xDrawable) ++ (*pdraw->destroyDrawable)(pdraw); ++ __glxHashDelete(priv->drawHash, gc->currentReadable); ++ } ++} ++ + #endif /* GLX_DIRECT_RENDERING */ +diff --git a/src/glx/dri_common.h b/src/glx/dri_common.h +index 846a905..13b5ae4 100644 +--- a/src/glx/dri_common.h ++++ b/src/glx/dri_common.h +@@ -55,6 +55,9 @@ extern void driDestroyConfigs(const __DRIconfig **configs); + extern __GLXDRIdrawable * + driFetchDrawable(struct glx_context *gc, GLXDrawable glxDrawable); + ++extern void ++driReleaseDrawables(struct glx_context *gc); ++ + extern const __DRIsystemTimeExtension systemTimeExtension; + + extern void InfoMessageF(const char *f, ...); +diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c +index 43a2aa4..42b263c 100644 +--- a/src/glx/dri_glx.c ++++ b/src/glx/dri_glx.c +@@ -509,8 +509,6 @@ dri_destroy_context(struct glx_context * context) + if (context->extensions) + XFree((char *) context->extensions); + +- GarbageCollectDRIDrawables(context->psc); +- + (*psc->core->destroyContext) (pcp->driContext); + + XF86DRIDestroyContext(psc->base.dpy, psc->base.scr, pcp->hwContextID); +@@ -545,6 +543,8 @@ dri_unbind_context(struct glx_context *context, struct glx_context *new) + struct dri_screen *psc = (struct dri_screen *) pcp->base.psc; + + (*psc->core->unbindContext) (pcp->driContext); ++ ++ driReleaseDrawables(&pcp->base); + } + + static const struct glx_context_vtable dri_context_vtable = { +diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c +index c5b1791..237ce17 100644 +--- a/src/glx/drisw_glx.c ++++ b/src/glx/drisw_glx.c +@@ -250,8 +250,6 @@ drisw_destroy_context(struct glx_context *context) + if (context->extensions) + XFree((char *) context->extensions); + +- GarbageCollectDRIDrawables(context->psc); +- + (*psc->core->destroyContext) (pcp->driContext); + + Xfree(pcp); +@@ -285,6 +283,8 @@ drisw_unbind_context(struct glx_context *context, struct glx_context *new) + struct drisw_screen *psc = (struct drisw_screen *) pcp->base.psc; + + (*psc->core->unbindContext) (pcp->driContext); ++ ++ driReleaseDrawables(&pcp->base); + } + + static const struct glx_context_vtable drisw_context_vtable = { +diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c +index 9575156..4f7e84e 100644 +--- a/src/glx/glxcmds.c ++++ b/src/glx/glxcmds.c +@@ -63,56 +63,6 @@ static const char __glXGLXClientVersion[] = "1.4"; + + #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) + +-static Bool windowExistsFlag; +-static int +-windowExistsErrorHandler(Display * dpy, XErrorEvent * xerr) +-{ +- (void) dpy; +- +- if (xerr->error_code == BadWindow) { +- windowExistsFlag = GL_FALSE; +- } +- return 0; +-} +- +-/** +- * Find drawables in the local hash that have been destroyed on the +- * server. +- * +- * \param dpy Display to destroy drawables for +- * \param screen Screen number to destroy drawables for +- */ +-_X_HIDDEN void +-GarbageCollectDRIDrawables(struct glx_screen * sc) +-{ +- XID draw; +- __GLXDRIdrawable *pdraw; +- struct glx_display *priv = sc->display; +- XWindowAttributes xwa; +- int (*oldXErrorHandler) (Display *, XErrorEvent *); +- +- /* Set no-op error handler so Xlib doesn't bail out if the windows +- * has alreay been destroyed on the server. */ +- XSync(priv->dpy, GL_FALSE); +- oldXErrorHandler = XSetErrorHandler(windowExistsErrorHandler); +- +- if (__glxHashFirst(priv->drawHash, &draw, (void *) &pdraw) == 1) { +- do { +- windowExistsFlag = GL_TRUE; +- XGetWindowAttributes(priv->dpy, draw, &xwa); /* dummy request */ +- if (!windowExistsFlag) { +- /* Destroy the local drawable data, if the drawable no +- longer exists in the Xserver */ +- (*pdraw->destroyDrawable) (pdraw); +- __glxHashDelete(priv->drawHash, draw); +- } +- } while (__glxHashNext(priv->drawHash, &draw, (void *) &pdraw) == 1); +- } +- +- XSync(priv->dpy, GL_FALSE); +- XSetErrorHandler(oldXErrorHandler); +-} +- + /** + * Get the __DRIdrawable for the drawable associated with a GLXContext + * +diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c +index 98f66c2..710985b 100644 +--- a/src/glx/glxcurrent.c ++++ b/src/glx/glxcurrent.c +@@ -242,13 +242,13 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, + return False; + } + +- if (oldGC != &dummyContext && oldGC != gc) { ++ if (oldGC != &dummyContext) { + oldGC->vtable->unbind(oldGC, gc); + oldGC->currentDpy = 0; + oldGC->currentDrawable = None; + oldGC->currentReadable = None; + oldGC->thread_id = 0; +- if (oldGC->xid == None) ++ if (oldGC->xid == None && oldGC != gc) + /* We are switching away from a context that was + * previously destroyed, so we need to free the memory + * for the old handle. +@@ -257,12 +257,12 @@ MakeContextCurrent(Display * dpy, GLXDrawable draw, + } + + if (gc) { +- ret = gc->vtable->bind(gc, oldGC, draw, read); + gc->currentDpy = dpy; + gc->currentDrawable = draw; + gc->currentReadable = read; + gc->thread_id = _glthread_GetID(); + __glXSetCurrentContext(gc); ++ ret = gc->vtable->bind(gc, oldGC, draw, read); + } else { + __glXSetCurrentContextNull(); + } +diff --git a/src/glx/indirect_glx.c b/src/glx/indirect_glx.c +index 61ceed3..1870ede 100644 +--- a/src/glx/indirect_glx.c ++++ b/src/glx/indirect_glx.c +@@ -168,6 +168,9 @@ indirect_unbind_context(struct glx_context *gc, struct glx_context *new) + int opcode = __glXSetupForCommand(dpy); + xGLXMakeCurrentReply reply; + ++ if (gc == new) ++ return; ++ + /* We are either switching to no context, away from a indirect + * context to a direct context or from one dpy to another and have + * to send a request to the dpy to unbind the previous context. diff --git a/debian/patches/series b/debian/patches/series index c267c2b..48ff057 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -7,3 +7,6 @@ 101_ubuntu_hidden_glname.patch 103_savage-expose_fbmodes_with_nonzero_alpha.patch 104_i915_fragment_shader_disable.patch +105_old_gc_ignore_destroyed_drawable_events.patch -R +106_old_gc_fix_use_after_free.patch -R +107_old_gc_drop_broken_drawable_garbage_collector.patch -R -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1owzql-0004ro...@alioth.debian.org