diff options
-rw-r--r-- | glx/glxcmds.c | 11 | ||||
-rw-r--r-- | glx/glxdri2.c | 14 | ||||
-rw-r--r-- | glx/glxext.c | 8 | ||||
-rw-r--r-- | glx/glxscreens.c | 7 | ||||
-rw-r--r-- | glx/glxscreens.h | 2 | ||||
-rw-r--r-- | glx/glxserver.h | 3 |
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__ */ |