[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