From 3ef4be8129f78afd5566a9e5d0fb901449dcb771 Mon Sep 17 00:00:00 2001 From: Ian Romanick 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