[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