[PATCH] WineD3D: Fake GL_ARB_multitexture=0A=

Stefan Doesinger stefan at codeweavers.com
Tue Dec 16 13:18:49 CST 2008


=0A=
Cards and drivers which don't support GL_ARB_multitexture should=0A=
be pretty rare these days(even tnt2 and mach64 cards support it),=0A=
so we want avoid burdening the code with all the if checks.=0A=
=0A=
This patch adds a faked implementation for GL_ARB_multitexture=0A=
that forwards texture 0 operations to the non-multitexture=0A=
functions and outputs an error on others.=0A=
---=0A=
 dlls/wined3d/Makefile.in             |    1 +=0A=
 dlls/wined3d/context.c               |   58 +++++------=0A=
 dlls/wined3d/device.c                |   24 ++---=0A=
 dlls/wined3d/directx.c               |   26 +-----=0A=
 dlls/wined3d/drawprim.c              |   12 +--=0A=
 dlls/wined3d/gl_compat.c             |  181 =
++++++++++++++++++++++++++++++++++=0A=
 dlls/wined3d/nvidia_texture_shader.c |   13 +--=0A=
 dlls/wined3d/state.c                 |   82 ++++------------=0A=
 dlls/wined3d/surface.c               |   14 +--=0A=
 dlls/wined3d/wined3d_private.h       |    2 +-=0A=
 10 files changed, 253 insertions(+), 160 deletions(-)=0A=
 create mode 100644 dlls/wined3d/gl_compat.c=0A=
=0A=
diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in=0A=
index dd0984e..1653fde 100644=0A=
--- a/dlls/wined3d/Makefile.in=0A=
+++ b/dlls/wined3d/Makefile.in=0A=
@@ -17,6 +17,7 @@ C_SRCS =3D \=0A=
 	device.c \=0A=
 	directx.c \=0A=
 	drawprim.c \=0A=
+	gl_compat.c \=0A=
 	glsl_shader.c \=0A=
 	indexbuffer.c \=0A=
 	nvidia_texture_shader.c \=0A=
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c=0A=
index 05afe5d..a34f877 100644=0A=
--- a/dlls/wined3d/context.c=0A=
+++ b/dlls/wined3d/context.c=0A=
@@ -1066,42 +1066,40 @@ static inline void =
SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex=0A=
 =0A=
     /* Disable all textures. The caller can then bind a texture it =
wants to blit=0A=
      * from=0A=
+     *=0A=
+     * The blitting code uses (for now) the fixed function pipeline, so =
make sure to reset all fixed=0A=
+     * function texture unit. No need to care for higher samplers=0A=
      */=0A=
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        /* The blitting code uses (for now) the fixed function =
pipeline, so make sure to reset all fixed=0A=
-         * function texture unit. No need to care for higher samplers=0A=
-         */=0A=
-        for(i =3D GL_LIMITS(textures) - 1; i > 0 ; i--) {=0A=
-            sampler =3D This->rev_tex_unit_map[i];=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
-            checkGLcall("glActiveTextureARB");=0A=
-=0A=
-            if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
-                glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
-                checkGLcall("glDisable GL_TEXTURE_CUBE_MAP_ARB");=0A=
-            }=0A=
-            glDisable(GL_TEXTURE_3D);=0A=
-            checkGLcall("glDisable GL_TEXTURE_3D");=0A=
-            if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
-                glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
-                checkGLcall("glDisable GL_TEXTURE_RECTANGLE_ARB");=0A=
-            }=0A=
-            glDisable(GL_TEXTURE_2D);=0A=
-            checkGLcall("glDisable GL_TEXTURE_2D");=0A=
+    for(i =3D GL_LIMITS(textures) - 1; i > 0 ; i--) {=0A=
+        sampler =3D This->rev_tex_unit_map[i];=0A=
+        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
+        checkGLcall("glActiveTextureARB");=0A=
 =0A=
-            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);=0A=
-            checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
GL_REPLACE);");=0A=
+        if(GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) {=0A=
+            glDisable(GL_TEXTURE_CUBE_MAP_ARB);=0A=
+            checkGLcall("glDisable GL_TEXTURE_CUBE_MAP_ARB");=0A=
+        }=0A=
+        glDisable(GL_TEXTURE_3D);=0A=
+        checkGLcall("glDisable GL_TEXTURE_3D");=0A=
+        if(GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) {=0A=
+            glDisable(GL_TEXTURE_RECTANGLE_ARB);=0A=
+            checkGLcall("glDisable GL_TEXTURE_RECTANGLE_ARB");=0A=
+        }=0A=
+        glDisable(GL_TEXTURE_2D);=0A=
+        checkGLcall("glDisable GL_TEXTURE_2D");=0A=
 =0A=
-            if (sampler !=3D -1) {=0A=
-                if (sampler < MAX_TEXTURES) {=0A=
-                    Context_MarkStateDirty(context, =
STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP), StateTable);=0A=
-                }=0A=
-                Context_MarkStateDirty(context, STATE_SAMPLER(sampler), =
StateTable);=0A=
+        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);=0A=
+        checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
GL_REPLACE);");=0A=
+=0A=
+        if (sampler !=3D -1) {=0A=
+            if (sampler < MAX_TEXTURES) {=0A=
+                Context_MarkStateDirty(context, =
STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP), StateTable);=0A=
             }=0A=
+            Context_MarkStateDirty(context, STATE_SAMPLER(sampler), =
StateTable);=0A=
         }=0A=
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));=0A=
-        checkGLcall("glActiveTextureARB");=0A=
     }=0A=
+    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));=0A=
+    checkGLcall("glActiveTextureARB");=0A=
 =0A=
     sampler =3D This->rev_tex_unit_map[0];=0A=
 =0A=
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c=0A=
index a99ff56..cfec14f 100644=0A=
--- a/dlls/wined3d/device.c=0A=
+++ b/dlls/wined3d/device.c=0A=
@@ -2028,12 +2028,8 @@ static void =
create_dummy_textures(IWineD3DDeviceImpl *This) {=0A=
         GLubyte white =3D 255;=0A=
 =0A=
         /* Make appropriate texture active */=0A=
-        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
-            checkGLcall("glActiveTextureARB");=0A=
-        } else if (i > 0) {=0A=
-            FIXME("Program using multiple concurrent textures which =
this opengl implementation doesn't support\n");=0A=
-        }=0A=
+        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
+        checkGLcall("glActiveTextureARB");=0A=
 =0A=
         /* Generate an opengl texture name */=0A=
         glGenTextures(1, &This->dummyTextureName[i]);=0A=
@@ -5886,12 +5882,10 @@ static HRESULT  WINAPI  =
IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,=0A=
 =0A=
     ActivateContext(This, This->lastActiveRenderTarget, =
CTXUSAGE_RESOURCELOAD);=0A=
 =0A=
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        ENTER_GL();=0A=
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));=0A=
-        checkGLcall("glActiveTextureARB");=0A=
-        LEAVE_GL();=0A=
-    }=0A=
+    ENTER_GL();=0A=
+    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));=0A=
+    checkGLcall("glActiveTextureARB");=0A=
+    LEAVE_GL();=0A=
 =0A=
     /* Make sure the surface is loaded and up to date */=0A=
     IWineD3DSurface_PreLoad(pDestinationSurface);=0A=
@@ -6761,10 +6755,8 @@ static HRESULT  WINAPI  =
IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i=0A=
                 }=0A=
 =0A=
                 /* Make sure that a proper texture unit is selected */=0A=
-                if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-                    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));=0A=
-                    checkGLcall("glActiveTextureARB");=0A=
-                }=0A=
+                GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));=0A=
+                checkGLcall("glActiveTextureARB");=0A=
                 sampler =3D This->rev_tex_unit_map[0];=0A=
                 if (sampler !=3D -1) {=0A=
                     IWineD3DDeviceImpl_MarkStateDirty(This, =
STATE_SAMPLER(sampler));=0A=
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c=0A=
index cb66128..525a340 100644=0A=
--- a/dlls/wined3d/directx.c=0A=
+++ b/dlls/wined3d/directx.c=0A=
@@ -187,7 +187,6 @@ glAttribFunc diffuse_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 glAttribFunc specular_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 glAttribFunc normal_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 glMultiTexCoordFunc multi_texcoord_funcs[WINED3DDECLTYPE_UNUSED];=0A=
-glAttribFunc texcoord_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 =0A=
 /**=0A=
  * Note: GL seems to trap if GetDeviceCaps is called before any HWND's =
created,=0A=
@@ -4154,30 +4153,6 @@ static void fillGLAttribFuncs(const =
WineD3D_GL_Info *gl_info)=0A=
         multi_texcoord_funcs[WINED3DDECLTYPE_FLOAT16_2] =3D =
invalid_texcoord_func;=0A=
         multi_texcoord_funcs[WINED3DDECLTYPE_FLOAT16_4] =3D =
invalid_texcoord_func;=0A=
     }=0A=
-=0A=
-    texcoord_funcs[WINED3DDECLTYPE_FLOAT1]      =3D =
(glAttribFunc)glTexCoord1fv;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_FLOAT2]      =3D =
(glAttribFunc)glTexCoord2fv;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_FLOAT3]      =3D =
(glAttribFunc)glTexCoord3fv;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_FLOAT4]      =3D =
(glAttribFunc)glTexCoord4fv;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_D3DCOLOR]    =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_UBYTE4]      =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_SHORT2]      =3D =
(glAttribFunc)glTexCoord2sv;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_SHORT4]      =3D =
(glAttribFunc)glTexCoord4sv;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_UBYTE4N]     =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_SHORT2N]     =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_SHORT4N]     =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_USHORT2N]    =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_USHORT4N]    =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_UDEC3]       =3D invalid_func;=0A=
-    texcoord_funcs[WINED3DDECLTYPE_DEC3N]       =3D invalid_func;=0A=
-    if (GL_SUPPORT(NV_HALF_FLOAT))=0A=
-    {=0A=
-        texcoord_funcs[WINED3DDECLTYPE_FLOAT16_2]   =3D =
(glAttribFunc)GL_EXTCALL(glTexCoord2hvNV);=0A=
-        texcoord_funcs[WINED3DDECLTYPE_FLOAT16_4]   =3D =
(glAttribFunc)GL_EXTCALL(glTexCoord4hvNV);=0A=
-    } else {=0A=
-        texcoord_funcs[WINED3DDECLTYPE_FLOAT16_2]   =3D invalid_func;=0A=
-        texcoord_funcs[WINED3DDECLTYPE_FLOAT16_4]   =3D invalid_func;=0A=
-    }=0A=
 }=0A=
 =0A=
 #define PUSH1(att)        attribs[nAttribs++] =3D (att);=0A=
@@ -4375,6 +4350,7 @@ BOOL InitAdapters(void) {=0A=
         }=0A=
 =0A=
         fixup_extensions(&Adapters[0].gl_info);=0A=
+        add_gl_compat_wrappers(&Adapters[0].gl_info);=0A=
 =0A=
         WineD3D_ReleaseFakeGLContext();=0A=
 =0A=
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c=0A=
index 243ed61..89ab706 100644=0A=
--- a/dlls/wined3d/drawprim.c=0A=
+++ b/dlls/wined3d/drawprim.c=0A=
@@ -440,21 +440,15 @@ static void drawStridedSlow(IWineD3DDevice *iface, =
const WineDirect3DVertexStrid=0A=
         {=0A=
             int coord_idx;=0A=
             const void *ptr;=0A=
+            int texture_idx;=0A=
 =0A=
             if (!(tmp_tex_mask & 1)) continue;=0A=
 =0A=
             coord_idx =3D =
This->stateBlock->textureState[texture][WINED3DTSS_TEXCOORDINDEX];=0A=
             ptr =3D texCoords[coord_idx] + (SkipnStrides * =
sd->u.s.texCoords[coord_idx].dwStride);=0A=
 =0A=
-            if (GL_SUPPORT(ARB_MULTITEXTURE))=0A=
-            {=0A=
-                int texture_idx =3D This->texUnitMap[texture];=0A=
-                =
multi_texcoord_funcs[sd->u.s.texCoords[coord_idx].dwType](GL_TEXTURE0_ARB=
 + texture_idx, ptr);=0A=
-            }=0A=
-            else=0A=
-            {=0A=
-                =
texcoord_funcs[sd->u.s.texCoords[coord_idx].dwType](ptr);=0A=
-            }=0A=
+            texture_idx =3D This->texUnitMap[texture];=0A=
+            =
multi_texcoord_funcs[sd->u.s.texCoords[coord_idx].dwType](GL_TEXTURE0_ARB=
 + texture_idx, ptr);=0A=
         }=0A=
 =0A=
         /* Diffuse -------------------------------- */=0A=
diff --git a/dlls/wined3d/gl_compat.c b/dlls/wined3d/gl_compat.c=0A=
new file mode 100644=0A=
index 0000000..c723de5=0A=
--- /dev/null=0A=
+++ b/dlls/wined3d/gl_compat.c=0A=
@@ -0,0 +1,181 @@=0A=
+/*=0A=
+ * Compatibility functions for older GL implementations=0A=
+ *=0A=
+ * Copyright 2008 Stefan D=C3=B6singer for CodeWeavers=0A=
+ *=0A=
+ * This library is free software; you can redistribute it and/or=0A=
+ * modify it under the terms of the GNU Lesser General Public=0A=
+ * License as published by the Free Software Foundation; either=0A=
+ * version 2.1 of the License, or (at your option) any later version.=0A=
+ *=0A=
+ * This library is distributed in the hope that it will be useful,=0A=
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of=0A=
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU=0A=
+ * Lesser General Public License for more details.=0A=
+ *=0A=
+ * You should have received a copy of the GNU Lesser General Public=0A=
+ * License along with this library; if not, write to the Free Software=0A=
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA =
02110-1301, USA=0A=
+ */=0A=
+=0A=
+#include "config.h"=0A=
+#include <stdio.h>=0A=
+#ifdef HAVE_FLOAT_H=0A=
+# include <float.h>=0A=
+#endif=0A=
+#include "wined3d_private.h"=0A=
+=0A=
+WINE_DEFAULT_DEBUG_CHANNEL(gl_compat);=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord1fARB(GLenum target, GLfloat =
s) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord1f(s);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord1fvARB(GLenum target, const =
GLfloat *v) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord1fv(v);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord2fARB(GLenum target, GLfloat =
s, GLfloat t) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord2f(s, t);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord2fvARB(GLenum target, const =
GLfloat *v) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord2fv(v);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord3fARB(GLenum target, GLfloat =
s, GLfloat t, GLfloat r) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord3f(s, t, r);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord3fvARB(GLenum target, const =
GLfloat *v) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord3fv(v);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord4fARB(GLenum target, GLfloat =
s, GLfloat t, GLfloat r, GLfloat q) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord4f(s, t, r, q);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord4fvARB(GLenum target, const =
GLfloat *v) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord4fv(v);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord2svARB(GLenum target, const =
const GLshort *v) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord2sv(v);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glMultiTexCoord4svARB(GLenum target, const =
const GLshort *v) {=0A=
+    if(target !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+    glTexCoord4sv(v);=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glActiveTextureARB(GLenum texture) {=0A=
+    if(texture !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+}=0A=
+=0A=
+static void WINE_GLAPI wine_glClientActiveTextureARB(GLenum texture) {=0A=
+    if(texture !=3D GL_TEXTURE0) {=0A=
+        ERR("Texture unit > 0 used, but GL_ARB_multitexture is not =
supported\n");=0A=
+        return;=0A=
+    }=0A=
+}=0A=
+=0A=
+void (WINE_GLAPI *old_multitex_glGetIntegerv) (GLenum pname, GLint* =
params) =3D NULL;=0A=
+void WINE_GLAPI wine_glGetIntegerv(GLenum pname, GLint* params) {=0A=
+    switch(pname) {=0A=
+        case GL_ACTIVE_TEXTURE:         *params =3D 0;    break;=0A=
+        case GL_MAX_TEXTURE_UNITS_ARB:  *params =3D 1;    break;=0A=
+        default: old_multitex_glGetIntegerv(pname, params);=0A=
+    }=0A=
+}=0A=
+=0A=
+void (WINE_GLAPI *old_multitex_glGetFloatv) (GLenum pname, GLfloat* =
params) =3D NULL;=0A=
+void WINE_GLAPI wine_glGetFloatv(GLenum pname, GLfloat* params) {=0A=
+    if(pname =3D=3D GL_ACTIVE_TEXTURE) *params =3D 0.0;=0A=
+    else old_multitex_glGetFloatv(pname, params);=0A=
+}=0A=
+=0A=
+void (WINE_GLAPI *old_multitex_glGetDoublev) (GLenum pname, GLdouble* =
params) =3D NULL;=0A=
+void WINE_GLAPI wine_glGetDoublev(GLenum pname, GLdouble* params) {=0A=
+    if(pname =3D=3D GL_ACTIVE_TEXTURE) *params =3D 0.0;=0A=
+    else old_multitex_glGetDoublev(pname, params);=0A=
+}=0A=
+=0A=
+#define GLINFO_LOCATION (*gl_info)=0A=
+void add_gl_compat_wrappers(WineD3D_GL_Info *gl_info) {=0A=
+    if(!GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
+        gl_info->glActiveTextureARB         =3D wine_glActiveTextureARB;=0A=
+        gl_info->glClientActiveTextureARB   =3D =
wine_glClientActiveTextureARB;=0A=
+        gl_info->glMultiTexCoord1fARB       =3D =
wine_glMultiTexCoord1fARB;=0A=
+        gl_info->glMultiTexCoord1fvARB      =3D =
wine_glMultiTexCoord1fvARB;=0A=
+        gl_info->glMultiTexCoord2fARB       =3D =
wine_glMultiTexCoord2fARB;=0A=
+        gl_info->glMultiTexCoord2fvARB      =3D =
wine_glMultiTexCoord2fvARB;=0A=
+        gl_info->glMultiTexCoord3fARB       =3D =
wine_glMultiTexCoord3fARB;=0A=
+        gl_info->glMultiTexCoord3fvARB      =3D =
wine_glMultiTexCoord3fvARB;=0A=
+        gl_info->glMultiTexCoord4fARB       =3D =
wine_glMultiTexCoord4fARB;=0A=
+        gl_info->glMultiTexCoord4fvARB      =3D =
wine_glMultiTexCoord4fvARB;=0A=
+        gl_info->glMultiTexCoord2svARB      =3D =
wine_glMultiTexCoord2svARB;=0A=
+        gl_info->glMultiTexCoord4svARB      =3D =
wine_glMultiTexCoord4svARB;=0A=
+        if(old_multitex_glGetIntegerv) {=0A=
+            FIXME("GL_ARB_multitexture glGetIntegerv hook already =
applied\n");=0A=
+        } else {=0A=
+            old_multitex_glGetIntegerv =3D glGetIntegerv;=0A=
+            glGetIntegerv =3D wine_glGetIntegerv;=0A=
+        }=0A=
+        if(old_multitex_glGetFloatv) {=0A=
+            FIXME("GL_ARB_multitexture glGetGloatv hook already =
applied\n");=0A=
+        } else {=0A=
+            old_multitex_glGetFloatv =3D glGetFloatv;=0A=
+            glGetFloatv =3D wine_glGetFloatv;=0A=
+        }=0A=
+        if(old_multitex_glGetDoublev) {=0A=
+            FIXME("GL_ARB_multitexture glGetDoublev hook already =
applied\n");=0A=
+        } else {=0A=
+            old_multitex_glGetDoublev =3D glGetDoublev;=0A=
+            glGetDoublev =3D wine_glGetDoublev;=0A=
+        }=0A=
+        gl_info->supported[ARB_MULTITEXTURE] =3D TRUE;=0A=
+    }=0A=
+}=0A=
+#undef GLINFO_LOCATION=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index 1b31c74..989cc5e 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -466,17 +466,12 @@ static void nvrc_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3=0A=
     if (stage !=3D mapped_stage) WARN("Using non 1:1 mapping: %d -> =
%d!\n", stage, mapped_stage);=0A=
 =0A=
     if (mapped_stage !=3D -1) {=0A=
-        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-            if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
-                FIXME("Attempt to enable unsupported stage!\n");=0A=
-                return;=0A=
-            }=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
-            checkGLcall("glActiveTextureARB");=0A=
-        } else if (stage > 0) {=0A=
-            WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+        if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
+            FIXME("Attempt to enable unsupported stage!\n");=0A=
             return;=0A=
         }=0A=
+        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
+        checkGLcall("glActiveTextureARB");=0A=
     }=0A=
 =0A=
     if(stateblock->lowest_disabled_stage > 0) {=0A=
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c=0A=
index f76ccac..92ec536 100644=0A=
--- a/dlls/wined3d/state.c=0A=
+++ b/dlls/wined3d/state.c=0A=
@@ -753,14 +753,10 @@ static void state_texfactor(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Win=0A=
     /* And now the default texture color as well */=0A=
     for (i =3D 0; i < GL_LIMITS(texture_stages); i++) {=0A=
         /* Note the WINED3DRS value applies to all textures, but GL has =
one=0A=
-            * per texture, so apply it now ready to be used!=0A=
-            */=0A=
-        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
-            checkGLcall("glActiveTextureARB");=0A=
-        } else if (i>0) {=0A=
-            FIXME("Program using multiple concurrent textures which =
this opengl implementation doesn't support\n");=0A=
-        }=0A=
+         * per texture, so apply it now ready to be used!=0A=
+         */=0A=
+        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));=0A=
+        checkGLcall("glActiveTextureARB");=0A=
 =0A=
         glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);=0A=
         checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, =
color);");=0A=
@@ -2925,17 +2921,12 @@ static void tex_colorop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3D=0A=
     if (stage !=3D mapped_stage) WARN("Using non 1:1 mapping: %d -> =
%d!\n", stage, mapped_stage);=0A=
 =0A=
     if (mapped_stage !=3D -1) {=0A=
-        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-            if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
-                FIXME("Attempt to enable unsupported stage!\n");=0A=
-                return;=0A=
-            }=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
-            checkGLcall("glActiveTextureARB");=0A=
-        } else if (stage > 0) {=0A=
-            WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+        if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
+            FIXME("Attempt to enable unsupported stage!\n");=0A=
             return;=0A=
         }=0A=
+        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
+        checkGLcall("glActiveTextureARB");=0A=
     }=0A=
 =0A=
     if(stage >=3D stateblock->lowest_disabled_stage) {=0A=
@@ -2982,18 +2973,12 @@ void tex_alphaop(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3DContext=0A=
     TRACE("Setting alpha op for stage %d\n", stage);=0A=
     /* Do not care for enabled / disabled stages, just assign the =
settings. colorop disables / enables required stuff */=0A=
     if (mapped_stage !=3D -1) {=0A=
-        if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-            if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
-                FIXME("Attempt to enable unsupported stage!\n");=0A=
-                return;=0A=
-            }=0A=
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + =
mapped_stage));=0A=
-            checkGLcall("glActiveTextureARB");=0A=
-        } else if (stage > 0) {=0A=
-            /* We can't do anything here */=0A=
-            WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+        if (tex_used && mapped_stage >=3D GL_LIMITS(textures)) {=0A=
+            FIXME("Attempt to enable unsupported stage!\n");=0A=
             return;=0A=
         }=0A=
+        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
+        checkGLcall("glActiveTextureARB");=0A=
     }=0A=
 =0A=
     op =3D stateblock->textureState[stage][WINED3DTSS_ALPHAOP];=0A=
@@ -3093,17 +3078,11 @@ static void transform_texture(DWORD state, =
IWineD3DStateBlockImpl *stateblock, W=0A=
 =0A=
     if (mapped_stage =3D=3D -1) return;=0A=
 =0A=
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        if(mapped_stage >=3D GL_LIMITS(textures)) {=0A=
-            return;=0A=
-        }=0A=
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
-        checkGLcall("glActiveTextureARB");=0A=
-    } else if (mapped_stage > 0) {=0A=
-        /* We can't do anything here */=0A=
-        WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+    if(mapped_stage >=3D GL_LIMITS(textures)) {=0A=
         return;=0A=
     }=0A=
+    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
+    checkGLcall("glActiveTextureARB");=0A=
     generated =3D =
(stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX] & =
0xFFFF0000) !=3D WINED3DTSS_TCI_PASSTHRU;=0A=
     coordIdx =3D =
min(stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX & =
0x0000FFFF], MAX_TEXTURES - 1);=0A=
 =0A=
@@ -3141,13 +3120,6 @@ static void loadTexCoords(IWineD3DStateBlockImpl =
*stateblock, const WineDirect3D=0A=
     unsigned int mapped_stage =3D 0;=0A=
     unsigned int textureNo =3D 0;=0A=
 =0A=
-    /* The code below uses glClientActiveTexture and glMultiTexCoord* =
which are all part of the GL_ARB_multitexture extension. */=0A=
-    /* Abort if we don't support the extension. */=0A=
-    if (!GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        FIXME("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
-        return;=0A=
-    }=0A=
-=0A=
     for (textureNo =3D 0; textureNo < GL_LIMITS(texture_stages); =
++textureNo) {=0A=
         int coordIdx =3D =
stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];=0A=
 =0A=
@@ -3201,17 +3173,11 @@ static void tex_coordindex(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Wine=0A=
         return;=0A=
     }=0A=
 =0A=
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        if(mapped_stage >=3D GL_LIMITS(fragment_samplers)) {=0A=
-            return;=0A=
-        }=0A=
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
-        checkGLcall("glActiveTextureARB");=0A=
-    } else if (stage > 0) {=0A=
-        /* We can't do anything here */=0A=
-        WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+    if(mapped_stage >=3D GL_LIMITS(fragment_samplers)) {=0A=
         return;=0A=
     }=0A=
+    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
+    checkGLcall("glActiveTextureARB");=0A=
 =0A=
     /* Values 0-7 are indexes into the FVF tex coords - See comments in =
DrawPrimitive=0A=
      *=0A=
@@ -3445,17 +3411,11 @@ static void sampler(DWORD state, =
IWineD3DStateBlockImpl *stateblock, WineD3DCont=0A=
         return;=0A=
     }=0A=
 =0A=
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        if (mapped_stage >=3D GL_LIMITS(combined_samplers)) {=0A=
-            return;=0A=
-        }=0A=
-        GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
-        checkGLcall("glActiveTextureARB");=0A=
-    } else if (sampler > 0) {=0A=
-        /* We can't do anything here */=0A=
-        WARN("Program using multiple concurrent textures which this =
opengl implementation doesn't support\n");=0A=
+    if (mapped_stage >=3D GL_LIMITS(combined_samplers)) {=0A=
         return;=0A=
     }=0A=
+    GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));=0A=
+    checkGLcall("glActiveTextureARB");=0A=
 =0A=
     if(stateblock->textures[sampler]) {=0A=
         IWineD3DBaseTexture_PreLoad(stateblock->textures[sampler]);=0A=
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c=0A=
index 0191403..b43697e 100644=0A=
--- a/dlls/wined3d/surface.c=0A=
+++ b/dlls/wined3d/surface.c=0A=
@@ -99,15 +99,11 @@ static void =
surface_bind_and_dirtify(IWineD3DSurfaceImpl *This) {=0A=
      *=0A=
      * TODO: Track the current active texture per GL context instead of =
using glGet=0A=
      */=0A=
-    if (GL_SUPPORT(ARB_MULTITEXTURE)) {=0A=
-        GLint active_texture;=0A=
-        ENTER_GL();=0A=
-        glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);=0A=
-        LEAVE_GL();=0A=
-        active_sampler =3D =
This->resource.wineD3DDevice->rev_tex_unit_map[active_texture - =
GL_TEXTURE0_ARB];=0A=
-    } else {=0A=
-        active_sampler =3D 0;=0A=
-    }=0A=
+    GLint active_texture;=0A=
+    ENTER_GL();=0A=
+    glGetIntegerv(GL_ACTIVE_TEXTURE, &active_texture);=0A=
+    LEAVE_GL();=0A=
+    active_sampler =3D =
This->resource.wineD3DDevice->rev_tex_unit_map[active_texture - =
GL_TEXTURE0_ARB];=0A=
 =0A=
     if (active_sampler !=3D -1) {=0A=
         IWineD3DDeviceImpl_MarkStateDirty(This->resource.wineD3DDevice, =
STATE_SAMPLER(active_sampler));=0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index 0b444bb..4aefe55 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -637,7 +637,6 @@ extern glAttribFunc =
diffuse_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 extern glAttribFunc specular_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 extern glAttribFunc normal_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3DDECLTYPE_UNUSED];=0A=
-extern glAttribFunc texcoord_funcs[WINED3DDECLTYPE_UNUSED];=0A=
 =0A=
 #define eps 1e-8=0A=
 =0A=
@@ -889,6 +888,7 @@ struct WineD3DAdapter=0A=
 extern BOOL InitAdapters(void);=0A=
 extern BOOL initPixelFormats(WineD3D_GL_Info *gl_info);=0A=
 extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, =
long glram);=0A=
+extern void add_gl_compat_wrappers(WineD3D_GL_Info *gl_info);=0A=
 =0A=
 =
/************************************************************************=
*****=0A=
  * High order patch management=0A=
-- =0A=
1.5.6.4=0A=
=0A=

------=_NextPart_000_00EB_01C95F81.28FE1590--




More information about the wine-patches mailing list