xserver: Branch 'master' - 2 commits

Michel Daenzer daenzer at kemper.freedesktop.org
Thu Feb 14 16:04:37 PST 2008


 GL/glx/glxdri.c |   81 +++++++++++++++++++++++++++++++-------------------------
 1 file changed, 46 insertions(+), 35 deletions(-)

New commits:
commit 005e31d3de04e7003f84a94d30f2b75a9636266e
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Fri Feb 15 00:01:32 2008 +0000

    AIGLX: Refactor code common between __glXDRI{drawableDestroy,releaseTexImage}.

diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index e405ee0..304fed2 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -180,46 +180,53 @@ __glXDRIenterServer(GLboolean rendering)
     DRIWakeupHandler(NULL, 0, NULL);
 }
 
+
 static void
-__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+__glXDRIdoReleaseTexImage(__GLXDRIscreen *screen, __GLXDRIdrawable *drawable)
 {
-    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+    GLuint lastOverride = screen->lastTexOffsetOverride;
 
-    int i;
+    if (lastOverride) {
+	__GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+	int i;
 
-    for (i = 0; i < screenInfo.numScreens; i++) {
-	__GLXDRIscreen * const screen = (__GLXDRIscreen *)
-	    glxGetScreen(screenInfo.screens[i]);
+	for (i = 0; i < lastOverride; i++) {
+	    if (texOffsetOverride[i] == drawable) {
 
-	GLuint lastOverride = screen->lastTexOffsetOverride;
+		texOffsetOverride[i] = NULL;
 
-	if (lastOverride) {
-	    __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
-	    int i;
-	    
-	    for (i = 0; i < lastOverride; i++) {
-		if (texOffsetOverride[i] == private) {
-		    
-		    texOffsetOverride[i] = NULL;
-		    
-		    if (i + 1 == lastOverride) {
-			lastOverride = 0;
-			
-			while (i--) {
-			    if (texOffsetOverride[i]) {
-				lastOverride = i + 1;
-				break;
-			    }
+		if (i + 1 == lastOverride) {
+		    lastOverride = 0;
+
+		    while (i--) {
+			if (texOffsetOverride[i]) {
+			    lastOverride = i + 1;
+			    break;
 			}
-			
-			screen->lastTexOffsetOverride = lastOverride;
-			
-			break;
 		    }
+
+		    screen->lastTexOffsetOverride = lastOverride;
+
+		    break;
 		}
 	    }
 	}
     }
+}
+
+
+static void
+__glXDRIdrawableDestroy(__GLXdrawable *drawable)
+{
+    __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
+
+    int i;
+
+    for (i = 0; i < screenInfo.numScreens; i++) {
+	__glXDRIdoReleaseTexImage((__GLXDRIscreen *)
+				  glxGetScreen(screenInfo.screens[i]),
+				  private);
+    }
 
     (*private->driDrawable.destroyDrawable)(&private->driDrawable);
 
@@ -561,41 +568,9 @@ __glXDRIreleaseTexImage(__GLXcontext *baseContext,
 			int buffer,
 			__GLXdrawable *pixmap)
 {
-    ScreenPtr pScreen = pixmap->pDraw->pScreen;
-    __GLXDRIdrawable *driDraw =
-	    containerOf(pixmap, __GLXDRIdrawable, base);
-    __GLXDRIscreen * const screen =
-	(__GLXDRIscreen *) glxGetScreen(pScreen);
-    GLuint lastOverride = screen->lastTexOffsetOverride;
-
-    if (lastOverride) {
-	__GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
-	int i;
-
-	for (i = 0; i < lastOverride; i++) {
-	    if (texOffsetOverride[i] == driDraw) {
-		if (screen->texOffsetFinish)
-		    screen->texOffsetFinish((PixmapPtr)pixmap->pDraw);
-
-		texOffsetOverride[i] = NULL;
-
-		if (i + 1 == lastOverride) {
-		    lastOverride = 0;
-
-		    while (i--) {
-			if (texOffsetOverride[i]) {
-			    lastOverride = i + 1;
-			    break;
-			}
-		    }
-
-		    screen->lastTexOffsetOverride = lastOverride;
-
-		    break;
-		}
-	    }
-	}
-    }
+    __glXDRIdoReleaseTexImage((__GLXDRIscreen *)
+			      glxGetScreen(pixmap->pDraw->pScreen),
+			      containerOf(pixmap, __GLXDRIdrawable, base));
 
     return Success;
 }
commit cd78f0d0fc08e4e2339ed09dad1a12802de7729c
Author: Pierre Willenbrock <pierre at pirsoft.de>
Date:   Thu Feb 7 21:28:28 2008 +0100

    AIGLX: Fix crash after client using GLX_EXT_texture_from_pixmap died.

diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index 6c1a199..e405ee0 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -185,6 +185,42 @@ __glXDRIdrawableDestroy(__GLXdrawable *drawable)
 {
     __GLXDRIdrawable *private = (__GLXDRIdrawable *) drawable;
 
+    int i;
+
+    for (i = 0; i < screenInfo.numScreens; i++) {
+	__GLXDRIscreen * const screen = (__GLXDRIscreen *)
+	    glxGetScreen(screenInfo.screens[i]);
+
+	GLuint lastOverride = screen->lastTexOffsetOverride;
+
+	if (lastOverride) {
+	    __GLXDRIdrawable **texOffsetOverride = screen->texOffsetOverride;
+	    int i;
+	    
+	    for (i = 0; i < lastOverride; i++) {
+		if (texOffsetOverride[i] == private) {
+		    
+		    texOffsetOverride[i] = NULL;
+		    
+		    if (i + 1 == lastOverride) {
+			lastOverride = 0;
+			
+			while (i--) {
+			    if (texOffsetOverride[i]) {
+				lastOverride = i + 1;
+				break;
+			    }
+			}
+			
+			screen->lastTexOffsetOverride = lastOverride;
+			
+			break;
+		    }
+		}
+	    }
+	}
+    }
+
     (*private->driDrawable.destroyDrawable)(&private->driDrawable);
 
     /* If the X window was destroyed, the dri DestroyWindow hook will


More information about the xorg-commit mailing list