1 /****************************************************************************
3 * Mesa 3-D graphics library
4 * Direct3D Driver Interface
6 * ========================================================================
8 * Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved.
10 * Permission is hereby granted, free of charge, to any person obtaining a
11 * copy of this software and associated documentation files (the "Software"),
12 * to deal in the Software without restriction, including without limitation
13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 * and/or sell copies of the Software, and to permit persons to whom the
15 * Software is furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included
18 * in all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
25 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28 * ======================================================================
31 * Environment: Windows 9x/2000/XP/XBox (Win32)
33 * Description: GL extensions
35 ****************************************************************************/
37 //#include "../GLDirect.h"
38 //#include "../gld_log.h"
39 //#include "../gld_settings.h"
42 #define GL_GLEXT_PROTOTYPES
47 //#include "gld_dx8.h"
53 #include "extensions.h"
59 #include "texformat.h"
62 #include "swrast_setup/swrast_setup.h"
63 #include "swrast_setup/ss_context.h"
65 #include "tnl/t_context.h"
66 #include "tnl/t_pipeline.h"
68 #include "dglcontext.h"
69 #include "extensions.h"
71 // For some reason this is not defined in an above header...
72 extern void _mesa_enable_imaging_extensions(GLcontext
*ctx
);
74 //---------------------------------------------------------------------------
75 // Hack for the SGIS_multitexture extension that was removed from Mesa
76 // NOTE: SGIS_multitexture enums also clash with GL_SGIX_async_pixel
78 // NOTE: Quake2 ran *slower* with this enabled, so I've
79 // disabled it for now.
80 // To enable, uncomment:
81 // _mesa_add_extension(ctx, GL_TRUE, szGL_SGIS_multitexture, 0);
83 //---------------------------------------------------------------------------
86 /* Quake2 GL_SGIS_multitexture */
87 GL_SELECTED_TEXTURE_SGIS
= 0x835B,
88 GL_SELECTED_TEXTURE_COORD_SET_SGIS
= 0x835C,
89 GL_MAX_TEXTURES_SGIS
= 0x835D,
90 GL_TEXTURE0_SGIS
= 0x835E,
91 GL_TEXTURE1_SGIS
= 0x835F,
92 GL_TEXTURE2_SGIS
= 0x8360,
93 GL_TEXTURE3_SGIS
= 0x8361,
94 GL_TEXTURE_COORD_SET_SOURCE_SGIS
= 0x8363,
97 //---------------------------------------------------------------------------
99 void APIENTRY
gldSelectTextureSGIS(
102 GLenum ARB_target
= GL_TEXTURE0_ARB
+ (target
- GL_TEXTURE0_SGIS
);
103 glActiveTextureARB(ARB_target
);
106 //---------------------------------------------------------------------------
108 void APIENTRY
gldMTexCoord2fSGIS(
113 GLenum ARB_target
= GL_TEXTURE0_ARB
+ (target
- GL_TEXTURE0_SGIS
);
114 glMultiTexCoord2fARB(ARB_target
, s
, t
);
117 //---------------------------------------------------------------------------
119 void APIENTRY
gldMTexCoord2fvSGIS(
123 GLenum ARB_target
= GL_TEXTURE0_ARB
+ (target
- GL_TEXTURE0_SGIS
);
124 glMultiTexCoord2fvARB(ARB_target
, v
);
127 //---------------------------------------------------------------------------
129 //---------------------------------------------------------------------------
136 GLD_extension GLD_extList
[] = {
137 #ifdef GL_EXT_polygon_offset
138 { (PROC
)glPolygonOffsetEXT
, "glPolygonOffsetEXT" },
140 { (PROC
)glBlendEquationEXT
, "glBlendEquationEXT" },
141 { (PROC
)glBlendColorEXT
, "glBlendColorExt" },
142 { (PROC
)glVertexPointerEXT
, "glVertexPointerEXT" },
143 { (PROC
)glNormalPointerEXT
, "glNormalPointerEXT" },
144 { (PROC
)glColorPointerEXT
, "glColorPointerEXT" },
145 { (PROC
)glIndexPointerEXT
, "glIndexPointerEXT" },
146 { (PROC
)glTexCoordPointerEXT
, "glTexCoordPointer" },
147 { (PROC
)glEdgeFlagPointerEXT
, "glEdgeFlagPointerEXT" },
148 { (PROC
)glGetPointervEXT
, "glGetPointervEXT" },
149 { (PROC
)glArrayElementEXT
, "glArrayElementEXT" },
150 { (PROC
)glDrawArraysEXT
, "glDrawArrayEXT" },
151 { (PROC
)glAreTexturesResidentEXT
, "glAreTexturesResidentEXT" },
152 { (PROC
)glBindTextureEXT
, "glBindTextureEXT" },
153 { (PROC
)glDeleteTexturesEXT
, "glDeleteTexturesEXT" },
154 { (PROC
)glGenTexturesEXT
, "glGenTexturesEXT" },
155 { (PROC
)glIsTextureEXT
, "glIsTextureEXT" },
156 { (PROC
)glPrioritizeTexturesEXT
, "glPrioritizeTexturesEXT" },
157 { (PROC
)glCopyTexSubImage3DEXT
, "glCopyTexSubImage3DEXT" },
158 { (PROC
)glTexImage3DEXT
, "glTexImage3DEXT" },
159 { (PROC
)glTexSubImage3DEXT
, "glTexSubImage3DEXT" },
160 { (PROC
)glPointParameterfEXT
, "glPointParameterfEXT" },
161 { (PROC
)glPointParameterfvEXT
, "glPointParameterfvEXT" },
163 { (PROC
)glLockArraysEXT
, "glLockArraysEXT" },
164 { (PROC
)glUnlockArraysEXT
, "glUnlockArraysEXT" },
168 GLD_extension GLD_multitexList
[] = {
170 { (PROC)glMultiTexCoord1dSGIS, "glMTexCoord1dSGIS" },
171 { (PROC)glMultiTexCoord1dvSGIS, "glMTexCoord1dvSGIS" },
172 { (PROC)glMultiTexCoord1fSGIS, "glMTexCoord1fSGIS" },
173 { (PROC)glMultiTexCoord1fvSGIS, "glMTexCoord1fvSGIS" },
174 { (PROC)glMultiTexCoord1iSGIS, "glMTexCoord1iSGIS" },
175 { (PROC)glMultiTexCoord1ivSGIS, "glMTexCoord1ivSGIS" },
176 { (PROC)glMultiTexCoord1sSGIS, "glMTexCoord1sSGIS" },
177 { (PROC)glMultiTexCoord1svSGIS, "glMTexCoord1svSGIS" },
178 { (PROC)glMultiTexCoord2dSGIS, "glMTexCoord2dSGIS" },
179 { (PROC)glMultiTexCoord2dvSGIS, "glMTexCoord2dvSGIS" },
180 { (PROC)glMultiTexCoord2fSGIS, "glMTexCoord2fSGIS" },
181 { (PROC)glMultiTexCoord2fvSGIS, "glMTexCoord2fvSGIS" },
182 { (PROC)glMultiTexCoord2iSGIS, "glMTexCoord2iSGIS" },
183 { (PROC)glMultiTexCoord2ivSGIS, "glMTexCoord2ivSGIS" },
184 { (PROC)glMultiTexCoord2sSGIS, "glMTexCoord2sSGIS" },
185 { (PROC)glMultiTexCoord2svSGIS, "glMTexCoord2svSGIS" },
186 { (PROC)glMultiTexCoord3dSGIS, "glMTexCoord3dSGIS" },
187 { (PROC)glMultiTexCoord3dvSGIS, "glMTexCoord3dvSGIS" },
188 { (PROC)glMultiTexCoord3fSGIS, "glMTexCoord3fSGIS" },
189 { (PROC)glMultiTexCoord3fvSGIS, "glMTexCoord3fvSGIS" },
190 { (PROC)glMultiTexCoord3iSGIS, "glMTexCoord3iSGIS" },
191 { (PROC)glMultiTexCoord3ivSGIS, "glMTexCoord3ivSGIS" },
192 { (PROC)glMultiTexCoord3sSGIS, "glMTexCoord3sSGIS" },
193 { (PROC)glMultiTexCoord3svSGIS, "glMTexCoord3svSGIS" },
194 { (PROC)glMultiTexCoord4dSGIS, "glMTexCoord4dSGIS" },
195 { (PROC)glMultiTexCoord4dvSGIS, "glMTexCoord4dvSGIS" },
196 { (PROC)glMultiTexCoord4fSGIS, "glMTexCoord4fSGIS" },
197 { (PROC)glMultiTexCoord4fvSGIS, "glMTexCoord4fvSGIS" },
198 { (PROC)glMultiTexCoord4iSGIS, "glMTexCoord4iSGIS" },
199 { (PROC)glMultiTexCoord4ivSGIS, "glMTexCoord4ivSGIS" },
200 { (PROC)glMultiTexCoord4sSGIS, "glMTexCoord4sSGIS" },
201 { (PROC)glMultiTexCoord4svSGIS, "glMTexCoord4svSGIS" },
202 { (PROC)glMultiTexCoordPointerSGIS, "glMTexCoordPointerSGIS" },
203 { (PROC)glSelectTextureSGIS, "glSelectTextureSGIS" },
204 { (PROC)glSelectTextureCoordSetSGIS, "glSelectTextureCoordSetSGIS" },
206 { (PROC
)glActiveTextureARB
, "glActiveTextureARB" },
207 { (PROC
)glClientActiveTextureARB
, "glClientActiveTextureARB" },
208 { (PROC
)glMultiTexCoord1dARB
, "glMultiTexCoord1dARB" },
209 { (PROC
)glMultiTexCoord1dvARB
, "glMultiTexCoord1dvARB" },
210 { (PROC
)glMultiTexCoord1fARB
, "glMultiTexCoord1fARB" },
211 { (PROC
)glMultiTexCoord1fvARB
, "glMultiTexCoord1fvARB" },
212 { (PROC
)glMultiTexCoord1iARB
, "glMultiTexCoord1iARB" },
213 { (PROC
)glMultiTexCoord1ivARB
, "glMultiTexCoord1ivARB" },
214 { (PROC
)glMultiTexCoord1sARB
, "glMultiTexCoord1sARB" },
215 { (PROC
)glMultiTexCoord1svARB
, "glMultiTexCoord1svARB" },
216 { (PROC
)glMultiTexCoord2dARB
, "glMultiTexCoord2dARB" },
217 { (PROC
)glMultiTexCoord2dvARB
, "glMultiTexCoord2dvARB" },
218 { (PROC
)glMultiTexCoord2fARB
, "glMultiTexCoord2fARB" },
219 { (PROC
)glMultiTexCoord2fvARB
, "glMultiTexCoord2fvARB" },
220 { (PROC
)glMultiTexCoord2iARB
, "glMultiTexCoord2iARB" },
221 { (PROC
)glMultiTexCoord2ivARB
, "glMultiTexCoord2ivARB" },
222 { (PROC
)glMultiTexCoord2sARB
, "glMultiTexCoord2sARB" },
223 { (PROC
)glMultiTexCoord2svARB
, "glMultiTexCoord2svARB" },
224 { (PROC
)glMultiTexCoord3dARB
, "glMultiTexCoord3dARB" },
225 { (PROC
)glMultiTexCoord3dvARB
, "glMultiTexCoord3dvARB" },
226 { (PROC
)glMultiTexCoord3fARB
, "glMultiTexCoord3fARB" },
227 { (PROC
)glMultiTexCoord3fvARB
, "glMultiTexCoord3fvARB" },
228 { (PROC
)glMultiTexCoord3iARB
, "glMultiTexCoord3iARB" },
229 { (PROC
)glMultiTexCoord3ivARB
, "glMultiTexCoord3ivARB" },
230 { (PROC
)glMultiTexCoord3sARB
, "glMultiTexCoord3sARB" },
231 { (PROC
)glMultiTexCoord3svARB
, "glMultiTexCoord3svARB" },
232 { (PROC
)glMultiTexCoord4dARB
, "glMultiTexCoord4dARB" },
233 { (PROC
)glMultiTexCoord4dvARB
, "glMultiTexCoord4dvARB" },
234 { (PROC
)glMultiTexCoord4fARB
, "glMultiTexCoord4fARB" },
235 { (PROC
)glMultiTexCoord4fvARB
, "glMultiTexCoord4fvARB" },
236 { (PROC
)glMultiTexCoord4iARB
, "glMultiTexCoord4iARB" },
237 { (PROC
)glMultiTexCoord4ivARB
, "glMultiTexCoord4ivARB" },
238 { (PROC
)glMultiTexCoord4sARB
, "glMultiTexCoord4sARB" },
239 { (PROC
)glMultiTexCoord4svARB
, "glMultiTexCoord4svARB" },
241 // Descent3 doesn't use correct string, hence this hack
242 { (PROC
)glMultiTexCoord4fARB
, "glMultiTexCoord4f" },
244 // Quake2 SGIS multitexture
245 { (PROC
)gldSelectTextureSGIS
, "glSelectTextureSGIS" },
246 { (PROC
)gldMTexCoord2fSGIS
, "glMTexCoord2fSGIS" },
247 { (PROC
)gldMTexCoord2fvSGIS
, "glMTexCoord2fvSGIS" },
252 //---------------------------------------------------------------------------
254 PROC
gldGetProcAddress_DX(
260 for (i
=0; GLD_extList
[i
].proc
; i
++) {
261 if (!strcmp(a
, GLD_extList
[i
].name
)) {
262 proc
= GLD_extList
[i
].proc
;
267 if (glb
.bMultitexture
) {
268 for (i
=0; GLD_multitexList
[i
].proc
; i
++) {
269 if (!strcmp(a
, GLD_multitexList
[i
].name
)) {
270 proc
= GLD_multitexList
[i
].proc
;
276 gldLogPrintf(GLDLOG_INFO
, "GetProcAddress: %s (%s)", a
, proc
? "OK" : "Failed");
281 //---------------------------------------------------------------------------
283 void gldEnableExtensions_DX7(
288 // Mesa enables some extensions by default.
289 // This table decides which ones we want to switch off again.
291 // NOTE: GL_EXT_compiled_vertex_array appears broken.
293 const char *gld_disable_extensions
[] = {
294 // "GL_ARB_transpose_matrix",
295 // "GL_EXT_compiled_vertex_array",
296 // "GL_EXT_polygon_offset",
297 // "GL_EXT_rescale_normal",
299 // "GL_NV_texgen_reflection",
305 const char *gld_multitex_extensions
[] = {
306 "GL_ARB_multitexture", // Quake 3
311 const char *szGL_SGIS_multitexture
= "GL_SGIS_multitexture";
313 const char *gld_enable_extensions
[] = {
314 "GL_EXT_texture_env_add", // Quake 3
315 "GL_ARB_texture_env_add", // Quake 3
319 for (i
=0; gld_disable_extensions
[i
]; i
++) {
320 _mesa_disable_extension(ctx
, gld_disable_extensions
[i
]);
323 for (i
=0; gld_enable_extensions
[i
]; i
++) {
324 _mesa_enable_extension(ctx
, gld_enable_extensions
[i
]);
327 if (glb
.bMultitexture
) {
328 for (i
=0; gld_multitex_extensions
[i
]; i
++) {
329 _mesa_enable_extension(ctx
, gld_multitex_extensions
[i
]);
332 // GL_SGIS_multitexture
333 // NOTE: Quake2 ran *slower* with this enabled, so I've
334 // disabled it for now.
335 // Fair bit slower on GeForce256,
336 // Much slower on 3dfx Voodoo5 5500.
337 // _mesa_add_extension(ctx, GL_TRUE, szGL_SGIS_multitexture, 0);
341 _mesa_enable_imaging_extensions(ctx
);
342 _mesa_enable_1_3_extensions(ctx
);
343 _mesa_enable_1_4_extensions(ctx
);
346 //---------------------------------------------------------------------------