71 lines
2.9 KiB
Diff
71 lines
2.9 KiB
Diff
|
From 6af0ee2cbe2d6584b523809f160f56daf16eb583 Mon Sep 17 00:00:00 2001
|
||
|
From: Emmanuele Bassi <ebassi@linux.intel.com>
|
||
|
Date: Mon, 4 Oct 2010 14:12:21 +0100
|
||
|
Subject: [PATCH] cogl-x11: Trap glXDestroyPixmap()
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
There are ordering issues in the pixmap destruction with current and
|
||
|
past X11 server, Mesa and dri2. Under some circumstances, an X pixmap
|
||
|
might be destroyed with the GLX pixmap still referencing it, and thus
|
||
|
the X server will decide to destroy the GLX pixmap as well; then, when
|
||
|
Cogl tries to destroy the GLX pixmap, it gets BadDrawable errors.
|
||
|
|
||
|
Clutter 1.2 used to trap + sync all calls to glXDestroyPixmap(), but
|
||
|
then we assumed that the ordering issue had been solved. So, we're back
|
||
|
to square 1.
|
||
|
|
||
|
I left a Big Fat Comment™ right above the glXDestroyPixmap() call
|
||
|
referencing the bug and the reasoning behind the trap, so that we don't
|
||
|
go and remove it in the future without checking that the issue has been
|
||
|
in fact solved.
|
||
|
|
||
|
http://bugzilla.clutter-project.org/show_bug.cgi?id=2324
|
||
|
---
|
||
|
clutter/cogl/cogl/winsys/cogl-texture-pixmap-x11.c | 22 ++++++++++++++++++++
|
||
|
1 files changed, 22 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/clutter/cogl/cogl/winsys/cogl-texture-pixmap-x11.c b/clutter/cogl/cogl/winsys/cogl-texture-pixmap-x11.c
|
||
|
index 56097ea..be0c302 100644
|
||
|
--- a/clutter/cogl/cogl/winsys/cogl-texture-pixmap-x11.c
|
||
|
+++ b/clutter/cogl/cogl/winsys/cogl-texture-pixmap-x11.c
|
||
|
@@ -888,12 +888,34 @@ _cogl_texture_pixmap_x11_free_glx_pixmap (CoglTexturePixmapX11 *tex_pixmap)
|
||
|
{
|
||
|
if (tex_pixmap->glx_pixmap)
|
||
|
{
|
||
|
+ CoglXlibTrapState trap_state;
|
||
|
+
|
||
|
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
|
||
|
|
||
|
if (tex_pixmap->pixmap_bound)
|
||
|
glXReleaseTexImage (_cogl_xlib_get_display (), tex_pixmap->glx_pixmap,
|
||
|
GLX_FRONT_LEFT_EXT);
|
||
|
+
|
||
|
+ /* FIXME - we need to trap errors and synchronize here because
|
||
|
+ * of ordering issues between the XPixmap destruction and the
|
||
|
+ * GLXPixmap destruction.
|
||
|
+ *
|
||
|
+ * If the X pixmap is destroyed, the GLX pixmap is destroyed as
|
||
|
+ * well immediately, and thus, when Cogl calls glXDestroyPixmap()
|
||
|
+ * it'll cause a BadDrawable error.
|
||
|
+ *
|
||
|
+ * this is technically a bug in the X server, which should not
|
||
|
+ * destroy either pixmaps until the call to glXDestroyPixmap(); so
|
||
|
+ * at some point we should revisit this code and remove the
|
||
|
+ * trap+sync after verifying that the destruction is indeed safe.
|
||
|
+ *
|
||
|
+ * for reference, see:
|
||
|
+ * http://bugzilla.clutter-project.org/show_bug.cgi?id=2324
|
||
|
+ */
|
||
|
+ _cogl_xlib_trap_errors (&trap_state);
|
||
|
glXDestroyPixmap (_cogl_xlib_get_display (), tex_pixmap->glx_pixmap);
|
||
|
+ XSync (_cogl_xlib_get_display (), False);
|
||
|
+ _cogl_xlib_untrap_errors (&trap_state);
|
||
|
|
||
|
tex_pixmap->glx_pixmap = None;
|
||
|
tex_pixmap->pixmap_bound = FALSE;
|
||
|
--
|
||
|
1.7.3.1
|
||
|
|