summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--glx/glxcmds.c11
-rw-r--r--glx/glxdri2.c14
-rw-r--r--glx/glxext.c8
-rw-r--r--glx/glxscreens.c7
-rw-r--r--glx/glxscreens.h2
-rw-r--r--glx/glxserver.h3
6 files changed, 38 insertions, 7 deletions
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
index b1061a8c2..30c25a917 100644
--- a/glx/glxcmds.c
+++ b/glx/glxcmds.c
@@ -739,8 +739,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 +2360,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 +2370,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 ed7fb4c4b..82568e696 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -685,6 +685,20 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
screen->base.GLXextensions);
}
+ /* We know that the X server supports the protocol for at least GLX 1.4.
+ * When a new version of GLX is created, we'll have to revisit this. We're
+ * also going to assume (perhaps incorrectly?) that all DRI2-enabled
+ * drivers support the required extension for GLX 1.3. 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 19d70d495..2de8b8405 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) {
LogMessage(X_INFO,
"GLX: Initialized %s GL provider for screen %d\n",
p->name, i);
break;
}
+
+ if (glxScreen->GLXminor < glxMinorVersion)
+ glxMinorVersion = glxScreen->GLXminor;
}
if (!p)
diff --git a/glx/glxscreens.c b/glx/glxscreens.c
index 81faddd04..ee3788d4b 100644
--- a/glx/glxscreens.c
+++ b/glx/glxscreens.c
@@ -162,7 +162,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 = 1;
+unsigned glxMinorVersion = 4;
static char GLXServerExtensions[] =
"GLX_ARB_multisample "
"GLX_EXT_visual_info "
@@ -430,8 +431,9 @@ 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);
+ pGlxScreen->GLXmajor = 1;
+ pGlxScreen->GLXminor = 2;
pGlxScreen->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = glxCloseScreen;
@@ -506,7 +508,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 3c1bdd4ba..2d696d2ea 100644
--- a/glx/glxscreens.h
+++ b/glx/glxscreens.h
@@ -160,6 +160,8 @@ struct __GLXscreen {
char *GLXvendor;
char *GLXversion;
char *GLXextensions;
+ 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 4aa8c2eec..80f1b28f9 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__ */