aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-glx-versioning.patch
blob: c8a1c30954f7538aeed2583c816cf26db9f49e66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
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