diff --git a/xorg-x11-server.spec b/xorg-x11-server.spec index e2b05ab..4dab391 100644 --- a/xorg-x11-server.spec +++ b/xorg-x11-server.spec @@ -19,7 +19,7 @@ Summary: X.Org X11 X server Name: xorg-x11-server Version: 1.7.0 -Release: 3%{dist} +Release: 4%{dist} URL: http://www.x.org License: MIT Group: User Interface/X @@ -75,6 +75,7 @@ Patch6044: xserver-1.6.99-hush-prerelease-warning.patch Patch6045: xserver-1.7.0-randr-gamma-restore.patch Patch6046: xserver-1.7.0-exa-looping-forever-is-evil.patch +Patch6047: xserver-1.7.0-glx-versioning.patch %define moduledir %{_libdir}/xorg/modules %define drimoduledir %{_libdir}/dri @@ -503,6 +504,9 @@ rm -rf $RPM_BUILD_ROOT %{xserver_source_dir} %changelog +* Fri Oct 16 2009 Dave Airlie 1.7.0-4 +- update GLX for 1.4 version reporting + * Fri Oct 09 2009 Ben Skeggs 1.7.0-3 - xserver-1.7.0-exa-looping-forever-is-evil.patch: Fix rendercheck hang diff --git a/xserver-1.7.0-glx-versioning.patch b/xserver-1.7.0-glx-versioning.patch new file mode 100644 index 0000000..c8a1c30 --- /dev/null +++ b/xserver-1.7.0-glx-versioning.patch @@ -0,0 +1,233 @@ +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 +