xserver: Branch 'master'

Michel Dänzer daenzer at kemper.freedesktop.org
Thu Sep 3 05:21:08 PDT 2009


 glx/glxscreens.c |   28 ++++++++++++++++++++++++++++
 glx/glxscreens.h |    1 +
 2 files changed, 29 insertions(+)

New commits:
commit 120286aef59dabdb7c9fa762e08457e5cc8ec3a6
Author: Michel Dänzer <daenzer at vmware.com>
Date:   Thu Sep 3 08:05:59 2009 +0200

    glx: Add screen DestroyWindow wrapper to destroy the GLX drawable.
    
    Fixes crashes exitting MacSlow's rgba-glx demo.

diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 3fff268..81faddd 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -212,6 +212,7 @@ glxCloseScreen (int index, ScreenPtr pScreen)
     __GLXscreen *pGlxScreen = glxGetScreen(pScreen);
 
     pScreen->CloseScreen = pGlxScreen->CloseScreen;
+    pScreen->DestroyWindow = pGlxScreen->DestroyWindow;
 
     pGlxScreen->destroy(pGlxScreen);
 
@@ -395,6 +396,31 @@ pickFBConfig(__GLXscreen *pGlxScreen, VisualPtr visual)
     return best;
 }
 
+static Bool
+glxDestroyWindow(WindowPtr pWin)
+{
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+    __GLXscreen *pGlxScreen = glxGetScreen(pScreen);
+    Bool retval = TRUE;
+
+    FreeResource(pWin->drawable.id, FALSE);
+
+    /* call lower wrapped functions */
+    if (pGlxScreen->DestroyWindow) {
+	/* unwrap */
+	pScreen->DestroyWindow = pGlxScreen->DestroyWindow;
+
+	/* call lower layers */
+	retval = (*pScreen->DestroyWindow)(pWin);
+
+	/* rewrap */
+	pGlxScreen->DestroyWindow = pScreen->DestroyWindow;
+	pScreen->DestroyWindow = glxDestroyWindow;
+    }
+
+    return retval;
+}
+
 void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
 {
     __GLXconfig *m;
@@ -409,6 +435,8 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
 
     pGlxScreen->CloseScreen = pScreen->CloseScreen;
     pScreen->CloseScreen = glxCloseScreen;
+    pGlxScreen->DestroyWindow = pScreen->DestroyWindow;
+    pScreen->DestroyWindow = glxDestroyWindow;
 
     i = 0;
     for (m = pGlxScreen->fbconfigs; m != NULL; m = m->next) {
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index 34e441e..3c1bdd4 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -162,6 +162,7 @@ struct __GLXscreen {
     char *GLXextensions;
 
     Bool (*CloseScreen)(int index, ScreenPtr pScreen);
+    Bool (*DestroyWindow)(WindowPtr pWindow);
 };
 
 


More information about the xorg-commit mailing list