| /**************************************************************************** |
| * |
| * Mesa 3-D graphics library |
| * Direct3D Driver Interface |
| * |
| * ======================================================================== |
| * |
| * Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
| * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| * |
| * ====================================================================== |
| * |
| * Language: ANSI C |
| * Environment: Windows 9x/2000/XP/XBox (Win32) |
| * |
| * Description: GL extensions |
| * |
| ****************************************************************************/ |
| |
| //#include "../GLDirect.h" |
| //#include "../gld_log.h" |
| //#include "../gld_settings.h" |
| |
| #include <windows.h> |
| #define GL_GLEXT_PROTOTYPES |
| #include <GL/gl.h> |
| #include <GL/glext.h> |
| |
| //#include "ddlog.h" |
| //#include "gld_dx8.h" |
| |
| #include "glheader.h" |
| #include "context.h" |
| #include "colormac.h" |
| #include "depth.h" |
| #include "extensions.h" |
| #include "macros.h" |
| #include "matrix.h" |
| // #include "mem.h" |
| //#include "mmath.h" |
| #include "mtypes.h" |
| #include "texformat.h" |
| #include "texstore.h" |
| #include "vbo/vbo.h" |
| #include "swrast_setup/swrast_setup.h" |
| #include "swrast_setup/ss_context.h" |
| #include "tnl/tnl.h" |
| #include "tnl/t_context.h" |
| #include "tnl/t_pipeline.h" |
| |
| #include "dglcontext.h" |
| #include "extensions.h" |
| |
| // For some reason this is not defined in an above header... |
| extern void _mesa_enable_imaging_extensions(struct gl_context *ctx); |
| |
| //--------------------------------------------------------------------------- |
| // Hack for the SGIS_multitexture extension that was removed from Mesa |
| // NOTE: SGIS_multitexture enums also clash with GL_SGIX_async_pixel |
| |
| // NOTE: Quake2 ran *slower* with this enabled, so I've |
| // disabled it for now. |
| // To enable, uncomment: |
| // _mesa_add_extension(ctx, GL_TRUE, szGL_SGIS_multitexture, 0); |
| |
| //--------------------------------------------------------------------------- |
| |
| enum { |
| /* Quake2 GL_SGIS_multitexture */ |
| GL_SELECTED_TEXTURE_SGIS = 0x835B, |
| GL_SELECTED_TEXTURE_COORD_SET_SGIS = 0x835C, |
| GL_MAX_TEXTURES_SGIS = 0x835D, |
| GL_TEXTURE0_SGIS = 0x835E, |
| GL_TEXTURE1_SGIS = 0x835F, |
| GL_TEXTURE2_SGIS = 0x8360, |
| GL_TEXTURE3_SGIS = 0x8361, |
| GL_TEXTURE_COORD_SET_SOURCE_SGIS = 0x8363, |
| }; |
| |
| //--------------------------------------------------------------------------- |
| |
| void APIENTRY gldSelectTextureSGIS( |
| GLenum target) |
| { |
| GLenum ARB_target = GL_TEXTURE0_ARB + (target - GL_TEXTURE0_SGIS); |
| glActiveTextureARB(ARB_target); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void APIENTRY gldMTexCoord2fSGIS( |
| GLenum target, |
| GLfloat s, |
| GLfloat t) |
| { |
| GLenum ARB_target = GL_TEXTURE0_ARB + (target - GL_TEXTURE0_SGIS); |
| glMultiTexCoord2fARB(ARB_target, s, t); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void APIENTRY gldMTexCoord2fvSGIS( |
| GLenum target, |
| const GLfloat *v) |
| { |
| GLenum ARB_target = GL_TEXTURE0_ARB + (target - GL_TEXTURE0_SGIS); |
| glMultiTexCoord2fvARB(ARB_target, v); |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Extensions |
| //--------------------------------------------------------------------------- |
| |
| typedef struct { |
| PROC proc; |
| char *name; |
| } GLD_extension; |
| |
| GLD_extension GLD_extList[] = { |
| #ifdef GL_EXT_polygon_offset |
| { (PROC)glPolygonOffsetEXT, "glPolygonOffsetEXT" }, |
| #endif |
| { (PROC)glBlendEquationEXT, "glBlendEquationEXT" }, |
| { (PROC)glBlendColorEXT, "glBlendColorExt" }, |
| { (PROC)glVertexPointerEXT, "glVertexPointerEXT" }, |
| { (PROC)glNormalPointerEXT, "glNormalPointerEXT" }, |
| { (PROC)glColorPointerEXT, "glColorPointerEXT" }, |
| { (PROC)glIndexPointerEXT, "glIndexPointerEXT" }, |
| { (PROC)glTexCoordPointerEXT, "glTexCoordPointer" }, |
| { (PROC)glEdgeFlagPointerEXT, "glEdgeFlagPointerEXT" }, |
| { (PROC)glGetPointervEXT, "glGetPointervEXT" }, |
| { (PROC)glArrayElementEXT, "glArrayElementEXT" }, |
| { (PROC)glDrawArraysEXT, "glDrawArrayEXT" }, |
| { (PROC)glAreTexturesResidentEXT, "glAreTexturesResidentEXT" }, |
| { (PROC)glBindTextureEXT, "glBindTextureEXT" }, |
| { (PROC)glDeleteTexturesEXT, "glDeleteTexturesEXT" }, |
| { (PROC)glGenTexturesEXT, "glGenTexturesEXT" }, |
| { (PROC)glIsTextureEXT, "glIsTextureEXT" }, |
| { (PROC)glPrioritizeTexturesEXT, "glPrioritizeTexturesEXT" }, |
| { (PROC)glCopyTexSubImage3DEXT, "glCopyTexSubImage3DEXT" }, |
| { (PROC)glTexImage3DEXT, "glTexImage3DEXT" }, |
| { (PROC)glTexSubImage3DEXT, "glTexSubImage3DEXT" }, |
| { (PROC)glPointParameterfEXT, "glPointParameterfEXT" }, |
| { (PROC)glPointParameterfvEXT, "glPointParameterfvEXT" }, |
| |
| { (PROC)glLockArraysEXT, "glLockArraysEXT" }, |
| { (PROC)glUnlockArraysEXT, "glUnlockArraysEXT" }, |
| { NULL, "\0" } |
| }; |
| |
| GLD_extension GLD_multitexList[] = { |
| /* |
| { (PROC)glMultiTexCoord1dSGIS, "glMTexCoord1dSGIS" }, |
| { (PROC)glMultiTexCoord1dvSGIS, "glMTexCoord1dvSGIS" }, |
| { (PROC)glMultiTexCoord1fSGIS, "glMTexCoord1fSGIS" }, |
| { (PROC)glMultiTexCoord1fvSGIS, "glMTexCoord1fvSGIS" }, |
| { (PROC)glMultiTexCoord1iSGIS, "glMTexCoord1iSGIS" }, |
| { (PROC)glMultiTexCoord1ivSGIS, "glMTexCoord1ivSGIS" }, |
| { (PROC)glMultiTexCoord1sSGIS, "glMTexCoord1sSGIS" }, |
| { (PROC)glMultiTexCoord1svSGIS, "glMTexCoord1svSGIS" }, |
| { (PROC)glMultiTexCoord2dSGIS, "glMTexCoord2dSGIS" }, |
| { (PROC)glMultiTexCoord2dvSGIS, "glMTexCoord2dvSGIS" }, |
| { (PROC)glMultiTexCoord2fSGIS, "glMTexCoord2fSGIS" }, |
| { (PROC)glMultiTexCoord2fvSGIS, "glMTexCoord2fvSGIS" }, |
| { (PROC)glMultiTexCoord2iSGIS, "glMTexCoord2iSGIS" }, |
| { (PROC)glMultiTexCoord2ivSGIS, "glMTexCoord2ivSGIS" }, |
| { (PROC)glMultiTexCoord2sSGIS, "glMTexCoord2sSGIS" }, |
| { (PROC)glMultiTexCoord2svSGIS, "glMTexCoord2svSGIS" }, |
| { (PROC)glMultiTexCoord3dSGIS, "glMTexCoord3dSGIS" }, |
| { (PROC)glMultiTexCoord3dvSGIS, "glMTexCoord3dvSGIS" }, |
| { (PROC)glMultiTexCoord3fSGIS, "glMTexCoord3fSGIS" }, |
| { (PROC)glMultiTexCoord3fvSGIS, "glMTexCoord3fvSGIS" }, |
| { (PROC)glMultiTexCoord3iSGIS, "glMTexCoord3iSGIS" }, |
| { (PROC)glMultiTexCoord3ivSGIS, "glMTexCoord3ivSGIS" }, |
| { (PROC)glMultiTexCoord3sSGIS, "glMTexCoord3sSGIS" }, |
| { (PROC)glMultiTexCoord3svSGIS, "glMTexCoord3svSGIS" }, |
| { (PROC)glMultiTexCoord4dSGIS, "glMTexCoord4dSGIS" }, |
| { (PROC)glMultiTexCoord4dvSGIS, "glMTexCoord4dvSGIS" }, |
| { (PROC)glMultiTexCoord4fSGIS, "glMTexCoord4fSGIS" }, |
| { (PROC)glMultiTexCoord4fvSGIS, "glMTexCoord4fvSGIS" }, |
| { (PROC)glMultiTexCoord4iSGIS, "glMTexCoord4iSGIS" }, |
| { (PROC)glMultiTexCoord4ivSGIS, "glMTexCoord4ivSGIS" }, |
| { (PROC)glMultiTexCoord4sSGIS, "glMTexCoord4sSGIS" }, |
| { (PROC)glMultiTexCoord4svSGIS, "glMTexCoord4svSGIS" }, |
| { (PROC)glMultiTexCoordPointerSGIS, "glMTexCoordPointerSGIS" }, |
| { (PROC)glSelectTextureSGIS, "glSelectTextureSGIS" }, |
| { (PROC)glSelectTextureCoordSetSGIS, "glSelectTextureCoordSetSGIS" }, |
| */ |
| { (PROC)glActiveTextureARB, "glActiveTextureARB" }, |
| { (PROC)glClientActiveTextureARB, "glClientActiveTextureARB" }, |
| { (PROC)glMultiTexCoord1dARB, "glMultiTexCoord1dARB" }, |
| { (PROC)glMultiTexCoord1dvARB, "glMultiTexCoord1dvARB" }, |
| { (PROC)glMultiTexCoord1fARB, "glMultiTexCoord1fARB" }, |
| { (PROC)glMultiTexCoord1fvARB, "glMultiTexCoord1fvARB" }, |
| { (PROC)glMultiTexCoord1iARB, "glMultiTexCoord1iARB" }, |
| { (PROC)glMultiTexCoord1ivARB, "glMultiTexCoord1ivARB" }, |
| { (PROC)glMultiTexCoord1sARB, "glMultiTexCoord1sARB" }, |
| { (PROC)glMultiTexCoord1svARB, "glMultiTexCoord1svARB" }, |
| { (PROC)glMultiTexCoord2dARB, "glMultiTexCoord2dARB" }, |
| { (PROC)glMultiTexCoord2dvARB, "glMultiTexCoord2dvARB" }, |
| { (PROC)glMultiTexCoord2fARB, "glMultiTexCoord2fARB" }, |
| { (PROC)glMultiTexCoord2fvARB, "glMultiTexCoord2fvARB" }, |
| { (PROC)glMultiTexCoord2iARB, "glMultiTexCoord2iARB" }, |
| { (PROC)glMultiTexCoord2ivARB, "glMultiTexCoord2ivARB" }, |
| { (PROC)glMultiTexCoord2sARB, "glMultiTexCoord2sARB" }, |
| { (PROC)glMultiTexCoord2svARB, "glMultiTexCoord2svARB" }, |
| { (PROC)glMultiTexCoord3dARB, "glMultiTexCoord3dARB" }, |
| { (PROC)glMultiTexCoord3dvARB, "glMultiTexCoord3dvARB" }, |
| { (PROC)glMultiTexCoord3fARB, "glMultiTexCoord3fARB" }, |
| { (PROC)glMultiTexCoord3fvARB, "glMultiTexCoord3fvARB" }, |
| { (PROC)glMultiTexCoord3iARB, "glMultiTexCoord3iARB" }, |
| { (PROC)glMultiTexCoord3ivARB, "glMultiTexCoord3ivARB" }, |
| { (PROC)glMultiTexCoord3sARB, "glMultiTexCoord3sARB" }, |
| { (PROC)glMultiTexCoord3svARB, "glMultiTexCoord3svARB" }, |
| { (PROC)glMultiTexCoord4dARB, "glMultiTexCoord4dARB" }, |
| { (PROC)glMultiTexCoord4dvARB, "glMultiTexCoord4dvARB" }, |
| { (PROC)glMultiTexCoord4fARB, "glMultiTexCoord4fARB" }, |
| { (PROC)glMultiTexCoord4fvARB, "glMultiTexCoord4fvARB" }, |
| { (PROC)glMultiTexCoord4iARB, "glMultiTexCoord4iARB" }, |
| { (PROC)glMultiTexCoord4ivARB, "glMultiTexCoord4ivARB" }, |
| { (PROC)glMultiTexCoord4sARB, "glMultiTexCoord4sARB" }, |
| { (PROC)glMultiTexCoord4svARB, "glMultiTexCoord4svARB" }, |
| |
| // Descent3 doesn't use correct string, hence this hack |
| { (PROC)glMultiTexCoord4fARB, "glMultiTexCoord4f" }, |
| |
| // Quake2 SGIS multitexture |
| { (PROC)gldSelectTextureSGIS, "glSelectTextureSGIS" }, |
| { (PROC)gldMTexCoord2fSGIS, "glMTexCoord2fSGIS" }, |
| { (PROC)gldMTexCoord2fvSGIS, "glMTexCoord2fvSGIS" }, |
| |
| { NULL, "\0" } |
| }; |
| |
| //--------------------------------------------------------------------------- |
| |
| PROC gldGetProcAddress_DX( |
| LPCSTR a) |
| { |
| int i; |
| PROC proc = NULL; |
| |
| for (i=0; GLD_extList[i].proc; i++) { |
| if (!strcmp(a, GLD_extList[i].name)) { |
| proc = GLD_extList[i].proc; |
| break; |
| } |
| } |
| |
| if (glb.bMultitexture) { |
| for (i=0; GLD_multitexList[i].proc; i++) { |
| if (!strcmp(a, GLD_multitexList[i].name)) { |
| proc = GLD_multitexList[i].proc; |
| break; |
| } |
| } |
| } |
| |
| gldLogPrintf(GLDLOG_INFO, "GetProcAddress: %s (%s)", a, proc ? "OK" : "Failed"); |
| |
| return proc; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gldEnableExtensions_DX7( |
| struct gl_context *ctx) |
| { |
| GLuint i; |
| |
| // Mesa enables some extensions by default. |
| // This table decides which ones we want to switch off again. |
| |
| // NOTE: GL_EXT_compiled_vertex_array appears broken. |
| |
| const char *gld_disable_extensions[] = { |
| // "GL_ARB_transpose_matrix", |
| // "GL_EXT_compiled_vertex_array", |
| // "GL_EXT_polygon_offset", |
| // "GL_EXT_rescale_normal", |
| "GL_EXT_texture3D", |
| // "GL_NV_texgen_reflection", |
| "GL_EXT_abgr", |
| "GL_EXT_bgra", |
| NULL |
| }; |
| |
| const char *gld_multitex_extensions[] = { |
| "GL_ARB_multitexture", // Quake 3 |
| NULL |
| }; |
| |
| // Quake 2 engines |
| const char *szGL_SGIS_multitexture = "GL_SGIS_multitexture"; |
| |
| const char *gld_enable_extensions[] = { |
| "GL_EXT_texture_env_add", // Quake 3 |
| "GL_ARB_texture_env_add", // Quake 3 |
| NULL |
| }; |
| |
| for (i=0; gld_disable_extensions[i]; i++) { |
| _mesa_disable_extension(ctx, gld_disable_extensions[i]); |
| } |
| |
| for (i=0; gld_enable_extensions[i]; i++) { |
| _mesa_enable_extension(ctx, gld_enable_extensions[i]); |
| } |
| |
| if (glb.bMultitexture) { |
| for (i=0; gld_multitex_extensions[i]; i++) { |
| _mesa_enable_extension(ctx, gld_multitex_extensions[i]); |
| } |
| |
| // GL_SGIS_multitexture |
| // NOTE: Quake2 ran *slower* with this enabled, so I've |
| // disabled it for now. |
| // Fair bit slower on GeForce256, |
| // Much slower on 3dfx Voodoo5 5500. |
| // _mesa_add_extension(ctx, GL_TRUE, szGL_SGIS_multitexture, 0); |
| |
| } |
| |
| _mesa_enable_imaging_extensions(ctx); |
| _mesa_enable_1_3_extensions(ctx); |
| _mesa_enable_1_4_extensions(ctx); |
| } |
| |
| //--------------------------------------------------------------------------- |