Blob Blame Raw
From 3ef4be8129f78afd5566a9e5d0fb901449dcb771 Mon Sep 17 00:00:00 2001
From: Ian Romanick <ian.d.romanick@intel.com>
Date: Tue, 29 Sep 2009 16:43:43 -0700
Subject: [PATCH] GLX: Enable GLX 1.4 on DRI2

this squashes 4 commits
(cherry picked from commit ad5c0d9efa47476ed5cf75c82265c73919e468b4)
(cherry picked from commit cb54cf1b3e8c4109541cfb698542c00f2473e731)
(cherry picked from commit 4c6bfa2c09ae2b0cffdf9211a6dfbcaefe0366b5)
(cherry picked from commit 9bf2ff4faf730913de3073f346646a8727be41d4)
---
 glx/glxcmds.c                      |   12 ++++++++----
 glx/glxdri2.c                      |   12 ++++++++++++
 glx/glxext.c                       |    8 +++++++-
 glx/glxscreens.c                   |   15 ++++++++++++---
 glx/glxscreens.h                   |   11 +++++++++++
 glx/glxserver.h                    |    3 +++
 glx/indirect_texture_compression.c |    4 ++--
 include/protocol-versions.h        |    2 +-
 8 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index b1061a8..ba4c123 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -50,7 +50,6 @@
 #include "indirect_dispatch.h"
 #include "indirect_table.h"
 #include "indirect_util.h"
-#include "protocol-versions.h"
 
 static int
 validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err)
@@ -739,8 +738,8 @@ int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc)
     ** client if it wants to work with older clients; however, in this
     ** implementation the server just returns its version number.
     */
-    reply.majorVersion = SERVER_GLX_MAJOR_VERSION;
-    reply.minorVersion = SERVER_GLX_MINOR_VERSION;
+    reply.majorVersion = glxMajorVersion;
+    reply.minorVersion = glxMinorVersion;
     reply.length = 0;
     reply.type = X_Reply;
     reply.sequenceNumber = client->sequence;
@@ -2360,6 +2359,7 @@ int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc)
     char *buf;
     __GLXscreen *pGlxScreen;
     int err;
+    char ver_str[16];
 
     if (!validGlxScreen(client, req->screen, &pGlxScreen, &err))
 	return err;
@@ -2369,7 +2369,11 @@ int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc)
 	    ptr = pGlxScreen->GLXvendor;
 	    break;
 	case GLX_VERSION:
-	    ptr = pGlxScreen->GLXversion;
+	    /* Return to the server version rather than the screen version
+	     * to prevent confusion when they do not match.
+	     */
+	    snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion);
+	    ptr = ver_str;
 	    break;
 	case GLX_EXTENSIONS:
 	    ptr = pGlxScreen->GLXextensions;
diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index ed7fb4c..ed7dc80 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -685,6 +685,18 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
 				       screen->base.GLXextensions);
     }
 
+    /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled
+     * drivers support the required extensions for GLX 1.4.  The extensions
+     * we're assuming are:
+     *
+     *    - GLX_SGI_make_current_read (1.3)
+     *    - GLX_SGIX_fbconfig (1.3)
+     *    - GLX_SGIX_pbuffer (1.3)
+     *    - GLX_ARB_multisample (1.4)
+     */
+    screen->base.GLXmajor = 1;
+    screen->base.GLXminor = 4;
+
     screen->enterVT = pScrn->EnterVT;
     pScrn->EnterVT = glxDRIEnterVT; 
     screen->leaveVT = pScrn->LeaveVT;
diff --git a/glx/glxext.c b/glx/glxext.c
index 19d70d4..9f9c0ed 100644
--- a/glx/glxext.c
+++ b/glx/glxext.c
@@ -360,12 +360,18 @@ void GlxExtensionInit(void)
 	pScreen = screenInfo.screens[i];
 
 	for (p = __glXProviderStack; p != NULL; p = p->next) {
-	    if (p->screenProbe(pScreen) != NULL) {
+	    __GLXscreen *glxScreen;
+
+	    glxScreen = p->screenProbe(pScreen);
+	    if (glxScreen != NULL) {
+	        if (glxScreen->GLXminor < glxMinorVersion)
+		    glxMinorVersion = glxScreen->GLXminor;
 		LogMessage(X_INFO,
 			   "GLX: Initialized %s GL provider for screen %d\n",
 			   p->name, i);
 		break;
 	    }
+
 	}
 
 	if (!p)
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 7d29d31..674e2c6 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -42,6 +42,7 @@
 #include "glxserver.h"
 #include "glxutil.h"
 #include "glxext.h"
+#include "protocol-versions.h"
 
 static int glxScreenPrivateKeyIndex;
 static DevPrivateKey glxScreenPrivateKey = &glxScreenPrivateKeyIndex;
@@ -162,7 +163,8 @@ static const char GLServerExtensions[] =
 ** supported across all screens in a multi-screen system.
 */
 static char GLXServerVendorName[] = "SGI";
-static char GLXServerVersion[] = "1.2";
+unsigned glxMajorVersion = SERVER_GLX_MAJOR_VERSION;
+unsigned glxMinorVersion = SERVER_GLX_MINOR_VERSION;
 static char GLXServerExtensions[] =
 			"GLX_ARB_multisample "
 			"GLX_EXT_visual_info "
@@ -378,9 +380,17 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
     pGlxScreen->pScreen       = pScreen;
     pGlxScreen->GLextensions  = xstrdup(GLServerExtensions);
     pGlxScreen->GLXvendor     = xstrdup(GLXServerVendorName);
-    pGlxScreen->GLXversion    = xstrdup(GLXServerVersion);
     pGlxScreen->GLXextensions = xstrdup(GLXServerExtensions);
 
+    /* All GLX providers must support all of the functionality required for at
+     * least GLX 1.2.  If the provider supports a higher version, the GLXminor
+     * version can be changed in the provider's screen-probe routine.  For
+     * most providers, the screen-probe routine is the caller of this
+     * function.
+     */
+    pGlxScreen->GLXmajor      = 1;
+    pGlxScreen->GLXminor      = 2;
+
     pGlxScreen->CloseScreen = pScreen->CloseScreen;
     pScreen->CloseScreen = glxCloseScreen;
     pGlxScreen->DestroyWindow = pScreen->DestroyWindow;
@@ -454,7 +464,6 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen)
 void __glXScreenDestroy(__GLXscreen *screen)
 {
     xfree(screen->GLXvendor);
-    xfree(screen->GLXversion);
     xfree(screen->GLXextensions);
     xfree(screen->GLextensions);
 }
diff --git a/glx/glxscreens.h b/glx/glxscreens.h
index 3c1bdd4..bff4363 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -161,6 +161,17 @@ struct __GLXscreen {
     char *GLXversion;
     char *GLXextensions;
 
+    /**
+     * \name GLX version supported by this screen.
+     *
+     * Since the GLX version advertised by the server is for the whole server,
+     * the GLX protocol code uses the minimum version supported on all screens.
+     */
+    /*@{*/
+    unsigned GLXmajor;
+    unsigned GLXminor;
+    /*@}*/
+
     Bool (*CloseScreen)(int index, ScreenPtr pScreen);
     Bool (*DestroyWindow)(WindowPtr pWindow);
 };
diff --git a/glx/glxserver.h b/glx/glxserver.h
index 4aa8c2e..80f1b28 100644
--- a/glx/glxserver.h
+++ b/glx/glxserver.h
@@ -248,4 +248,7 @@ extern int __glXImageSize(GLenum format, GLenum type,
     GLint imageHeight, GLint rowLength, GLint skipImages, GLint skipRows,
     GLint alignment);
 
+extern unsigned glxMajorVersion;
+extern unsigned glxMinorVersion;
+
 #endif /* !__GLX_server_h__ */
diff --git a/glx/indirect_texture_compression.c b/glx/indirect_texture_compression.c
index 25c6eb3..5f44d7b 100644
--- a/glx/indirect_texture_compression.c
+++ b/glx/indirect_texture_compression.c
@@ -52,7 +52,7 @@ int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *p
 	const GLenum target = *(GLenum *)(pc + 0);
 	const GLint  level  = *(GLint  *)(pc + 4);
 	GLint compsize = 0;
-	char *answer, answerBuffer[200];
+	char *answer = NULL, answerBuffer[200];
 
 	CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize));
 
@@ -92,7 +92,7 @@ int __glXDispSwap_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyt
 	const GLenum target = (GLenum) bswap_32( *(int *)(pc + 0) );
 	const GLint  level =  (GLint ) bswap_32( *(int *)(pc + 4) );
 	GLint compsize = 0;
-	char *answer, answerBuffer[200];
+	char *answer = NULL, answerBuffer[200];
 
 	CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize));
 
diff --git a/include/protocol-versions.h b/include/protocol-versions.h
index da9770c..d688c66 100644
--- a/include/protocol-versions.h
+++ b/include/protocol-versions.h
@@ -61,7 +61,7 @@
 
 /* GLX */
 #define SERVER_GLX_MAJOR_VERSION		1
-#define SERVER_GLX_MINOR_VERSION		2
+#define SERVER_GLX_MINOR_VERSION		4
 
 /* Xinerama */
 #define SERVER_PANORAMIX_MAJOR_VERSION          1
-- 
1.6.5.rc2