704bf42673
Copied F-12 spec file to here, so the F-12 patch history is maintained.
234 lines
8.2 KiB
Diff
234 lines
8.2 KiB
Diff
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
|
|
|