xserver: Branch 'master'

Daniel Drake dsd at kemper.freedesktop.org
Thu Jul 24 18:08:28 PDT 2008


 glx/glxdriswrast.c |    2 +-
 glx/glxext.c       |   37 ++++++++++++++++++++++++-------------
 2 files changed, 25 insertions(+), 14 deletions(-)

New commits:
commit eff25430b4a391409e39337962ff7697165d23c7
Author: Daniel Drake <dsd at laptop.org>
Date:   Thu Jul 24 21:06:34 2008 -0500

    Don't abort if swrast library is not present
    
    GLX is enabled by default, but the current swrast behaviour causes X
    to abort with fatal error if the swrast dri library dlopen fails.
    
    Handle the case where the swrast library is not present, and do not
    register the GLX extension unless at least one screen has a usable
    GL provider.

diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c
index 199f5f8..2859704 100644
--- a/glx/glxdriswrast.c
+++ b/glx/glxdriswrast.c
@@ -515,7 +515,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 
     xfree(screen);
 
-    FatalError("GLX: could not load software renderer\n");
+    LogMessage(X_ERROR, "GLX: could not load software renderer\n");
 
     return NULL;
 }
diff --git a/glx/glxext.c b/glx/glxext.c
index 13c65da..6ba404f 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -279,6 +279,7 @@ void GlxExtensionInit(void)
     ScreenPtr pScreen;
     int i;
     __GLXprovider *p;
+    Bool glx_provided = False;
 
     __glXContextRes = CreateNewResourceType((DeleteType)ContextGone);
     __glXDrawableRes = CreateNewResourceType((DeleteType)DrawableGone);
@@ -289,6 +290,29 @@ void GlxExtensionInit(void)
     if (!AddCallback (&ClientStateCallback, glxClientCallback, 0))
 	return;
 
+    for (i = 0; i < screenInfo.numScreens; i++) {
+	pScreen = screenInfo.screens[i];
+
+	for (p = __glXProviderStack; p != NULL; p = p->next) {
+	    if (p->screenProbe(pScreen) != NULL) {
+		LogMessage(X_INFO,
+			   "GLX: Initialized %s GL provider for screen %d\n",
+			   p->name, i);
+		break;
+	    }
+	}
+
+	if (!p)
+	    LogMessage(X_INFO,
+		       "GLX: no usable GL providers found for screen %d\n", i);
+	else
+	    glx_provided = True;
+    }
+
+    /* don't register extension if GL is not provided on any screen */
+    if (!glx_provided)
+	return;
+
     /*
     ** Add extension to server extensions.
     */
@@ -306,19 +330,6 @@ void GlxExtensionInit(void)
     }
 
     __glXErrorBase = extEntry->errorBase;
-
-    for (i = 0; i < screenInfo.numScreens; i++) {
-	pScreen = screenInfo.screens[i];
-
-	for (p = __glXProviderStack; p != NULL; p = p->next) {
-	    if (p->screenProbe(pScreen) != NULL) {
-		LogMessage(X_INFO,
-			   "GLX: Initialized %s GL provider for screen %d\n",
-			   p->name, i);
-	    	break;
-	    }
-	}
-    }
 }
 
 /************************************************************************/


More information about the xorg-commit mailing list