[dx101] extensions fixes
Raphael
fenix at club-internet.fr
Mon Mar 29 18:12:38 CST 2004
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On Tuesday 30 March 2004 02:08, Vincent Béron wrote:
> Le lun 29/03/2004 à 18:57, Raphael a écrit :
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > Hi all,
> >
> > Changelog:
> > - more Extensions work (begin to detect ATI extensions)
> > - try to fix D3DTADDRESS_BORDER, D3DTADDRESS_MIRROR,
> > D3DTADDRESS_MIRRORONCE using OpenGL extensions
> > - better set_tex_op: now use Runtime Extension support (and not compile
> > support)
>
> Would be better with the patch...
>
> Vincent
Oupss, i'm tired :(
Now with patch
Thx
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
iD8DBQFAaLt3p7NA3AmQTU4RAtvIAJ49ruCUkgc8vv0KY+3c607LvGazjgCeI19I
6wBoGz73g6ZUSjsLjO/4nGs=
=vmus
-----END PGP SIGNATURE-----
-------------- next part --------------
? d3d8.spec.c
? utils_test.c
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.48
diff -u -r1.48 d3d8_private.h
--- d3d8_private.h 6 Jan 2004 22:08:34 -0000 1.48
+++ d3d8_private.h 29 Mar 2004 23:53:59 -0000
@@ -384,6 +384,7 @@
GLint cursor;
UINT dummyTextureName[8];
+
};
/* IUnknown: */
Index: d3dcore_gl.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3dcore_gl.h,v
retrieving revision 1.6
diff -u -r1.6 d3dcore_gl.h
--- d3dcore_gl.h 27 Mar 2004 20:42:14 -0000 1.6
+++ d3dcore_gl.h 29 Mar 2004 23:53:59 -0000
@@ -78,6 +78,7 @@
#endif
typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
typedef void (APIENTRY * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params);
+/* GL_EXT_texture_env_combine */
#ifndef GL_EXT_texture_env_combine
#define GL_EXT_texture_env_combine 1
#define GL_COMBINE_EXT 0x8570
@@ -131,10 +132,34 @@
#endif
/* GL_EXT_texture_lod_bias */
#ifndef GL_EXT_texture_lod_bias
+#define GL_EXT_texture_lod_bias 1
#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD
#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500
#define GL_TEXTURE_LOD_BIAS_EXT 0x8501
#endif
+/* GL_ARB_texture_border_clamp */
+#ifndef GL_ARB_texture_border_clamp
+#define GL_ARB_texture_border_clamp 1
+#define GL_CLAMP_TO_BORDER_ARB 0x812D
+#endif
+/* GL_ATI_texture_mirror_once */
+#ifndef GL_ATI_texture_mirror_once
+#define GL_ATI_texture_mirror_once 1
+#define GL_MIRROR_CLAMP_ATI 0x8742
+#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743
+#endif
+/* GL_ARB_texture_env_dot3 */
+#ifndef GL_ARB_texture_env_dot3
+#define GL_ARB_texture_env_dot3 1
+#define GL_DOT3_RGB_ARB 0x86AE
+#define GL_DOT3_RGBA_ARB 0x86AF
+#endif
+/* GL_EXT_texture_env_dot3 */
+#ifndef GL_EXT_texture_env_dot3
+#define GL_EXT_texture_env_dot3 1
+#define GL_DOT3_RGB_EXT 0x8740
+#define GL_DOT3_RGBA_EXT 0x8741
+#endif
/*******
* OpenGL Official Version
@@ -195,8 +220,10 @@
ARB_POINT_PARAMETERS,
ARB_TEXTURE_COMPRESSION,
ARB_TEXTURE_CUBE_MAP,
+ ARB_TEXTURE_ENV_ADD,
ARB_TEXTURE_ENV_COMBINE,
ARB_TEXTURE_ENV_DOT3,
+ ARB_TEXTURE_BORDER_CLAMP,
ARB_VERTEX_PROGRAM,
ARB_VERTEX_BLEND,
/* EXT */
@@ -208,11 +235,17 @@
EXT_TEXTURE_FILTER_ANISOTROPIC,
EXT_TEXTURE_LOD,
EXT_TEXTURE_LOD_BIAS,
+ EXT_TEXTURE_ENV_ADD,
+ EXT_TEXTURE_ENV_COMBINE,
+ EXT_TEXTURE_ENV_DOT3,
EXT_VERTEX_WEIGHTING,
/* NVIDIA */
+ NV_TEXTURE_ENV_COMBINE4,
NV_FRAGMENT_PROGRAM,
NV_VERTEX_PROGRAM,
/* ATI */
+ ATI_TEXTURE_ENV_COMBINE3,
+ ATI_TEXTURE_MIRROR_ONCE,
EXT_VERTEX_SHADER,
OPENGL_SUPPORTED_EXT_END
@@ -330,7 +363,7 @@
GL_VSVersion vs_nv_version;
GL_VSVersion vs_ati_version;
- BOOL supported[30];
+ BOOL supported[40];
/** OpenGL EXT and ARB functions ptr */
GL_EXT_FUNCS_GEN;
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.99
diff -u -r1.99 device.c
--- device.c 27 Mar 2004 20:42:14 -0000 1.99
+++ device.c 29 Mar 2004 23:54:05 -0000
@@ -3361,7 +3361,6 @@
}
break;
-
case D3DTSS_ALPHAOP :
case D3DTSS_COLOROP :
{
@@ -3438,18 +3437,45 @@
case D3DTSS_ADDRESSW :
{
GLint wrapParm = GL_REPEAT;
+
switch (Value) {
case D3DTADDRESS_WRAP: wrapParm = GL_REPEAT; break;
case D3DTADDRESS_CLAMP: wrapParm = GL_CLAMP_TO_EDGE; break;
- case D3DTADDRESS_BORDER: wrapParm = GL_REPEAT; break; /* FIXME: Not right, but better */
+ case D3DTADDRESS_BORDER:
+ {
+ if (GL_SUPPORT(ARB_TEXTURE_BORDER_CLAMP)) {
+ wrapParm = GL_CLAMP_TO_BORDER_ARB;
+ } else {
+ /* FIXME: Not right, but better */
+ FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
+ wrapParm = GL_REPEAT;
+ }
+ }
+ break;
+ case D3DTADDRESS_MIRROR:
+ {
#if defined(GL_VERSION_1_4)
- case D3DTADDRESS_MIRROR: wrapParm = GL_MIRRORED_REPEAT; break;
+ wrapParm = GL_MIRRORED_REPEAT;
#elif defined(GL_ARB_texture_mirrored_repeat)
- case D3DTADDRESS_MIRROR: wrapParm = GL_MIRRORED_REPEAT_ARB; break;
+ wrapParm = GL_MIRRORED_REPEAT_ARB;
#else
- case D3DTADDRESS_MIRROR: /* Unsupported in OpenGL pre-1.4 */
+ /* Unsupported in OpenGL pre-1.4 */
+ FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
+ wrapParm = GL_REPEAT;
#endif
- case D3DTADDRESS_MIRRORONCE: /* Unsupported in OpenGL */
+ }
+ break;
+ case D3DTADDRESS_MIRRORONCE:
+ {
+ if (GL_SUPPORT(ATI_TEXTURE_MIRROR_ONCE)) {
+ wrapParm = GL_MIRROR_CLAMP_TO_EDGE_ATI;
+ } else {
+ FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
+ wrapParm = GL_REPEAT;
+ }
+ }
+ break;
+
default:
FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
wrapParm = GL_REPEAT;
Index: directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.58
diff -u -r1.58 directx.c
--- directx.c 23 Jan 2004 01:51:34 -0000 1.58
+++ directx.c 29 Mar 2004 23:54:06 -0000
@@ -769,14 +769,18 @@
} else if (strcmp(ThisExtn, "GL_ARB_texture_compression") == 0) {
FIXME(" FOUND: ARB Texture Compression support\n");
This->gl_info.supported[ARB_TEXTURE_COMPRESSION] = TRUE;
+ } else if (strcmp(ThisExtn, "GL_ARB_texture_env_add") == 0) {
+ FIXME(" FOUND: ARB Texture Env Add support\n");
+ This->gl_info.supported[ARB_TEXTURE_ENV_ADD] = TRUE;
} else if (strcmp(ThisExtn, "GL_ARB_texture_env_combine") == 0) {
- FIXME(" FOUND: EXT Texture Env combine support\n");
+ FIXME(" FOUND: ARB Texture Env combine support\n");
This->gl_info.supported[ARB_TEXTURE_ENV_COMBINE] = TRUE;
} else if (strcmp(ThisExtn, "GL_ARB_texture_env_dot3") == 0) {
- if (FALSE == This->gl_info.supported[ARB_TEXTURE_ENV_DOT3]) {
- FIXME(" FOUND: EXT Dot3 support\n");
- This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
- }
+ FIXME(" FOUND: ARB Dot3 support\n");
+ This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
+ } else if (strcmp(ThisExtn, "GL_ARB_texture_border_clamp") == 0) {
+ FIXME(" FOUND: ARB Texture border clamp support\n");
+ This->gl_info.supported[ARB_TEXTURE_BORDER_CLAMP] = TRUE;
} else if (strstr(ThisExtn, "GL_ARB_vertex_program")) {
This->gl_info.vs_arb_version = VS_VERSION_11;
FIXME(" FOUND: ARB Vertex Shader support - version=%02x\n", This->gl_info.vs_arb_version);
@@ -802,11 +806,15 @@
FIXME(" FOUND: EXT Texture S3TC compression support\n");
This->gl_info.supported[EXT_TEXTURE_COMPRESSION_S3TC] = TRUE;
#endif
+ } else if (strcmp(ThisExtn, "GL_EXT_texture_env_add") == 0) {
+ FIXME(" FOUND: EXT Texture Env Add support\n");
+ This->gl_info.supported[EXT_TEXTURE_ENV_ADD] = TRUE;
+ } else if (strcmp(ThisExtn, "GL_EXT_texture_env_combine") == 0) {
+ FIXME(" FOUND: EXT Texture Env combine support\n");
+ This->gl_info.supported[EXT_TEXTURE_ENV_COMBINE] = TRUE;
} else if (strcmp(ThisExtn, "GL_EXT_texture_env_dot3") == 0) {
- if (FALSE == This->gl_info.supported[ARB_TEXTURE_ENV_DOT3]) {
- FIXME(" FOUND: EXT Dot3 support\n");
- This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE;
- }
+ FIXME(" FOUND: EXT Dot3 support\n");
+ This->gl_info.supported[EXT_TEXTURE_ENV_DOT3] = TRUE;
} else if (strcmp(ThisExtn, "GL_EXT_texture_filter_anisotropic") == 0) {
FIXME(" FOUND: EXT Texture Anisotropic filter support\n");
This->gl_info.supported[EXT_TEXTURE_FILTER_ANISOTROPIC] = TRUE;
@@ -823,6 +831,9 @@
/**
* NVIDIA
*/
+ } else if (strcmp(ThisExtn, "GL_NV_texture_env_combine4") == 0) {
+ FIXME(" FOUND: NVIDIA (NV) Texture Env combine (4) support\n");
+ This->gl_info.supported[NV_TEXTURE_ENV_COMBINE4] = TRUE;
} else if (strstr(ThisExtn, "GL_NV_fragment_program")) {
This->gl_info.ps_nv_version = PS_VERSION_11;
FIXME(" FOUND: NVIDIA (NV) Pixel Shader support - version=%02x\n", This->gl_info.ps_nv_version);
@@ -837,6 +848,12 @@
* ATI
*/
/** TODO */
+ } else if (strcmp(ThisExtn, "GL_ATI_texture_env_combine3") == 0) {
+ FIXME(" FOUND: ATI Texture Env combine (3) support\n");
+ This->gl_info.supported[ATI_TEXTURE_ENV_COMBINE3] = TRUE;
+ } else if (strcmp(ThisExtn, "GL_ATI_texture_mirror_once") == 0) {
+ FIXME(" FOUND: ATI Texture Mirror Once support\n");
+ This->gl_info.supported[ATI_TEXTURE_MIRROR_ONCE] = TRUE;
} else if (strcmp(ThisExtn, "GL_EXT_vertex_shader") == 0) {
This->gl_info.vs_ati_version = VS_VERSION_11;
FIXME(" FOUND: ATI (EXT) Vertex Shader support - version=%02x\n", This->gl_info.vs_ati_version);
Index: utils.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/utils.c,v
retrieving revision 1.14
diff -u -r1.14 utils.c
--- utils.c 23 Mar 2004 23:20:16 -0000 1.14
+++ utils.c 29 Mar 2004 23:54:08 -0000
@@ -671,6 +671,7 @@
}
}
+
/* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
#if defined (GL_VERSION_1_3)
# define useext(A) A
@@ -964,8 +965,11 @@
break;
case D3DTOP_DOTPRODUCT3:
if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA");
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
+ } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
} else {
FIXME("This version of opengl does not support GL_DOT3\n");
}
@@ -1003,297 +1007,293 @@
}
if (Handled) {
- BOOL combineOK = TRUE;
-#if defined(GL_NV_texture_env_combine4)
- DWORD op2;
-
- if (isAlpha) {
- op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_COLOROP];
- } else {
- op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_ALPHAOP];
- }
-
- /* Note: If COMBINE4 in effect can't go back to combine! */
- switch (op2)
- {
- case D3DTOP_ADDSMOOTH:
- case D3DTOP_BLENDTEXTUREALPHAPM:
- case D3DTOP_MODULATEALPHA_ADDCOLOR:
- case D3DTOP_MODULATECOLOR_ADDALPHA:
- case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
- case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
- case D3DTOP_MULTIPLYADD:
- /* Ignore those implemented in both cases */
- switch (op) {
- case D3DTOP_SELECTARG1:
- case D3DTOP_SELECTARG2:
- combineOK = FALSE;
- Handled = FALSE;
- break;
- default:
- FIXME("Cant have COMBINE4 and COMBINE in efferct together, thisop=%d, otherop=%ld, isAlpha(%d)\n",
- op, op2, isAlpha);
-
- LEAVE_GL();
- return;
- }
- }
-#endif
-
- if (combineOK == TRUE) {
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
- checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
-
- LEAVE_GL();
- return;
- }
+ BOOL combineOK = TRUE;
+ if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
+ DWORD op2;
+
+ if (isAlpha) {
+ op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_COLOROP];
+ } else {
+ op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_ALPHAOP];
+ }
+
+ /* Note: If COMBINE4 in effect can't go back to combine! */
+ switch (op2) {
+ case D3DTOP_ADDSMOOTH:
+ case D3DTOP_BLENDTEXTUREALPHAPM:
+ case D3DTOP_MODULATEALPHA_ADDCOLOR:
+ case D3DTOP_MODULATECOLOR_ADDALPHA:
+ case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
+ case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
+ case D3DTOP_MULTIPLYADD:
+ /* Ignore those implemented in both cases */
+ switch (op) {
+ case D3DTOP_SELECTARG1:
+ case D3DTOP_SELECTARG2:
+ combineOK = FALSE;
+ Handled = FALSE;
+ break;
+ default:
+ FIXME("Cant have COMBINE4 and COMBINE in effect together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
+ LEAVE_GL();
+ return;
+ }
+ }
+ }
+
+ if (combineOK == TRUE) {
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
+ checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
+
+ LEAVE_GL();
+ return;
+ }
}
/* Other texture operations require special extensions: */
-#if defined(GL_NV_texture_env_combine4)
- if (isAlpha) {
- opr = GL_SRC_ALPHA;
- invopr = GL_ONE_MINUS_SRC_ALPHA;
- src3_target = GL_SOURCE3_ALPHA_NV;
- opr3_target = GL_OPERAND3_ALPHA_NV;
- }
- else {
- opr = GL_SRC_COLOR;
- invopr = GL_ONE_MINUS_SRC_COLOR;
- src3_target = GL_SOURCE3_RGB_NV;
- opr3_target = GL_OPERAND3_RGB_NV;
- }
- Handled = TRUE; /* Again, assume handled */
- switch (op) {
- case D3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */
- case D3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- if (op == D3DTOP_SELECTARG1) {
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
- } else {
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
- }
- glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
- break;
-
- case D3DTOP_ADDSMOOTH:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
- switch (opr1) {
- case GL_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_COLOR; break;
- case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_SRC_COLOR; break;
- case GL_SRC_ALPHA: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_ALPHA: opr1 = GL_SRC_ALPHA; break;
- }
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
- case D3DTOP_BLENDTEXTUREALPHAPM:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
- checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
- case D3DTOP_MODULATEALPHA_ADDCOLOR:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */
- glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */
- checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */
- glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
- switch (opr1) {
- case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
- }
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
- case D3DTOP_MODULATECOLOR_ADDALPHA:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
- switch (opr1) {
- case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
- }
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
- case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
- switch (opr1) {
- case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
- case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
- }
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
- case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- switch (opr1) {
- case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
- case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
- case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
- }
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
- glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
- switch (opr1) {
- case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
- case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
- }
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
- case D3DTOP_MULTIPLYADD:
- glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
- checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
- glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
- checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
- glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
- checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
- glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
- checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
- glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
- checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
- glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
- checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
- glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
- checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
- glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
- checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
- glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
- checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
- glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
- checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
- break;
+ if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
+ if (isAlpha) {
+ opr = GL_SRC_ALPHA;
+ invopr = GL_ONE_MINUS_SRC_ALPHA;
+ src3_target = GL_SOURCE3_ALPHA_NV;
+ opr3_target = GL_OPERAND3_ALPHA_NV;
+ } else {
+ opr = GL_SRC_COLOR;
+ invopr = GL_ONE_MINUS_SRC_COLOR;
+ src3_target = GL_SOURCE3_RGB_NV;
+ opr3_target = GL_OPERAND3_RGB_NV;
+ }
+ Handled = TRUE; /* Again, assume handled */
+ switch (op) {
+ case D3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */
+ case D3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ if (op == D3DTOP_SELECTARG1) {
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
+ } else {
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
+ }
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
+ break;
+
+ case D3DTOP_ADDSMOOTH:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
+ switch (opr1) {
+ case GL_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_COLOR; break;
+ case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_SRC_COLOR; break;
+ case GL_SRC_ALPHA: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_ALPHA: opr1 = GL_SRC_ALPHA; break;
+ }
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
+ case D3DTOP_BLENDTEXTUREALPHAPM:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
+ case D3DTOP_MODULATEALPHA_ADDCOLOR:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
+ switch (opr1) {
+ case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
+ }
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
+ case D3DTOP_MODULATECOLOR_ADDALPHA:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
+ switch (opr1) {
+ case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
+ }
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
+ case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
+ switch (opr1) {
+ case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
+ case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
+ }
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
+ case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ switch (opr1) {
+ case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
+ case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
+ case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
+ }
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
+ switch (opr1) {
+ case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
+ case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
+ }
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
+ case D3DTOP_MULTIPLYADD:
+ glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
+ checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
+ glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
+ checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
+ glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
+ checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
+ glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
+ checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
+ glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
+ checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
+ glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
+ checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
+ glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
+ checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
+ glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
+ checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
+ glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
+ checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
+ glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
+ checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
+ break;
- default:
- Handled = FALSE;
- }
- if (Handled) {
+ default:
+ Handled = FALSE;
+ }
+ if (Handled) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
-
+
LEAVE_GL();
return;
- }
-#endif /* GL_NV_texture_env_combine4 */
-
+ }
+ } /* GL_NV_texture_env_combine4 */
+
LEAVE_GL();
-
- /* After all the extensions, if still unhandled, report fixme */
- FIXME("Unhandled texture operation %d\n", op);
+
+ /* After all the extensions, if still unhandled, report fixme */
+ FIXME("Unhandled texture operation %d\n", op);
}
#endif
More information about the wine-patches
mailing list