[PATCH] WineD3D: Move set_tex_op(_nvrc) to their specific files=0A=

Stefan Doesinger stefan at codeweavers.com
Sat Jul 12 11:45:33 CDT 2008


=0A=
I don't think they have to be in utils.c=0A=
---=0A=
 dlls/wined3d/nvidia_texture_shader.c |  385 +++++++++=0A=
 dlls/wined3d/state.c                 | 1109 +++++++++++++++++++++++++=0A=
 dlls/wined3d/utils.c                 | 1496 =
+---------------------------------=0A=
 dlls/wined3d/wined3d_private.h       |    3 +-=0A=
 4 files changed, 1499 insertions(+), 1494 deletions(-)=0A=
=0A=
diff --git a/dlls/wined3d/nvidia_texture_shader.c =
b/dlls/wined3d/nvidia_texture_shader.c=0A=
index 6844a9b..e217678 100644=0A=
--- a/dlls/wined3d/nvidia_texture_shader.c=0A=
+++ b/dlls/wined3d/nvidia_texture_shader.c=0A=
@@ -65,6 +65,391 @@ void nvts_activate_dimensions(DWORD stage, =
IWineD3DStateBlockImpl *stateblock, W=0A=
     }=0A=
 }=0A=
 =0A=
+typedef struct {=0A=
+    GLenum input[3];=0A=
+    GLenum mapping[3];=0A=
+    GLenum component_usage[3];=0A=
+} tex_op_args;=0A=
+=0A=
+static GLenum d3dta_to_combiner_input(DWORD d3dta, DWORD stage, INT =
texture_idx) {=0A=
+    switch (d3dta) {=0A=
+        case WINED3DTA_DIFFUSE:=0A=
+            return GL_PRIMARY_COLOR_NV;=0A=
+=0A=
+        case WINED3DTA_CURRENT:=0A=
+            if (stage) return GL_SPARE0_NV;=0A=
+            else return GL_PRIMARY_COLOR_NV;=0A=
+=0A=
+        case WINED3DTA_TEXTURE:=0A=
+            if (texture_idx > -1) return GL_TEXTURE0_ARB + texture_idx;=0A=
+            else return GL_PRIMARY_COLOR_NV;=0A=
+=0A=
+        case WINED3DTA_TFACTOR:=0A=
+            return GL_CONSTANT_COLOR0_NV;=0A=
+=0A=
+        case WINED3DTA_SPECULAR:=0A=
+            return GL_SECONDARY_COLOR_NV;=0A=
+=0A=
+        case WINED3DTA_TEMP:=0A=
+            return GL_SPARE1_NV;=0A=
+=0A=
+        case WINED3DTA_CONSTANT:=0A=
+            /* TODO: Support per stage constants (WINED3DTSS_CONSTANT, =
NV_register_combiners2) */=0A=
+            FIXME("WINED3DTA_CONSTANT, not properly supported.\n");=0A=
+            return GL_CONSTANT_COLOR1_NV;=0A=
+=0A=
+        default:=0A=
+            FIXME("Unrecognized texture arg %#x\n", d3dta);=0A=
+            return GL_TEXTURE;=0A=
+    }=0A=
+}=0A=
+=0A=
+static GLenum invert_mapping(GLenum mapping) {=0A=
+    if (mapping =3D=3D GL_UNSIGNED_INVERT_NV) return =
GL_SIGNED_IDENTITY_NV;=0A=
+    else if (mapping =3D=3D GL_SIGNED_IDENTITY_NV) return =
GL_UNSIGNED_INVERT_NV;=0A=
+=0A=
+    FIXME("Unhandled mapping %#x\n", mapping);=0A=
+    return mapping;=0A=
+}=0A=
+=0A=
+static void get_src_and_opr_nvrc(DWORD stage, DWORD arg, BOOL is_alpha, =
GLenum* input, GLenum* mapping, GLenum *component_usage, INT =
texture_idx) {=0A=
+    /* The WINED3DTA_COMPLEMENT flag specifies the complement of the =
input should=0A=
+    * be used. */=0A=
+    if (arg & WINED3DTA_COMPLEMENT) *mapping =3D GL_UNSIGNED_INVERT_NV;=0A=
+    else *mapping =3D GL_SIGNED_IDENTITY_NV;=0A=
+=0A=
+    /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component =
of the input=0A=
+    * should be used for all input components. */=0A=
+    if (is_alpha || arg & WINED3DTA_ALPHAREPLICATE) *component_usage =
=3D GL_ALPHA;=0A=
+    else *component_usage =3D GL_RGB;=0A=
+=0A=
+    *input =3D d3dta_to_combiner_input(arg & WINED3DTA_SELECTMASK, =
stage, texture_idx);=0A=
+}=0A=
+=0A=
+void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT =
texture_idx, DWORD dst) {=0A=
+    IWineD3DDeviceImpl *This =3D (IWineD3DDeviceImpl*)iface;=0A=
+    tex_op_args tex_op_args =3D {{0}, {0}, {0}};=0A=
+    GLenum portion =3D is_alpha ? GL_ALPHA : GL_RGB;=0A=
+    GLenum target =3D GL_COMBINER0_NV + stage;=0A=
+    GLenum output;=0A=
+    IWineD3DStateBlockImpl *stateblock =3D This->stateBlock; /* For =
GLINFO_LOCATION */=0A=
+=0A=
+    TRACE("stage %d, is_alpha %d, op %s, arg1 %#x, arg2 %#x, arg3 %#x, =
texture_idx %d\n",=0A=
+          stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, =
texture_idx);=0A=
+=0A=
+    /* If a texture stage references an invalid texture unit the stage =
just=0A=
+    * passes through the result from the previous stage */=0A=
+    if (is_invalid_op(This, stage, op, arg1, arg2, arg3)) {=0A=
+        arg1 =3D WINED3DTA_CURRENT;=0A=
+        op =3D WINED3DTOP_SELECTARG1;=0A=
+    }=0A=
+=0A=
+    get_src_and_opr_nvrc(stage, arg1, is_alpha, &tex_op_args.input[0],=0A=
+                         &tex_op_args.mapping[0], =
&tex_op_args.component_usage[0], texture_idx);=0A=
+    get_src_and_opr_nvrc(stage, arg2, is_alpha, &tex_op_args.input[1],=0A=
+                         &tex_op_args.mapping[1], =
&tex_op_args.component_usage[1], texture_idx);=0A=
+    get_src_and_opr_nvrc(stage, arg3, is_alpha, &tex_op_args.input[2],=0A=
+                         &tex_op_args.mapping[2], =
&tex_op_args.component_usage[2], texture_idx);=0A=
+=0A=
+=0A=
+    if(dst =3D=3D WINED3DTA_TEMP) {=0A=
+        output =3D GL_SPARE1_NV;=0A=
+    } else {=0A=
+        output =3D GL_SPARE0_NV;=0A=
+    }=0A=
+=0A=
+    /* This is called by a state handler which has the gl lock held and =
a context for the thread */=0A=
+    switch(op)=0A=
+    {=0A=
+        case WINED3DTOP_DISABLE:=0A=
+            /* Only for alpha */=0A=
+            if (!is_alpha) ERR("Shouldn't be called for =
WINED3DTSS_COLOROP (WINED3DTOP_DISABLE)\n");=0A=
+            /* Input, prev_alpha*1 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, =
GL_ALPHA));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_SPARE0_NV, GL_DISCARD_NV,=0A=
+                       GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_SELECTARG1:=0A=
+        case WINED3DTOP_SELECTARG2:=0A=
+            /* Input, arg*1 */=0A=
+            if (op =3D=3D WINED3DTOP_SELECTARG1) {=0A=
+                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                           tex_op_args.input[0], =
tex_op_args.mapping[0], tex_op_args.component_usage[0]));=0A=
+            } else {=0A=
+                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                           tex_op_args.input[1], =
tex_op_args.mapping[1], tex_op_args.component_usage[1]));=0A=
+            }=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
+                       GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_MODULATE:=0A=
+        case WINED3DTOP_MODULATE2X:=0A=
+        case WINED3DTOP_MODULATE4X:=0A=
+            /* Input, arg1*arg2 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+=0A=
+            /* Output */=0A=
+            if (op =3D=3D WINED3DTOP_MODULATE) {=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
+                           GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
+            } else if (op =3D=3D WINED3DTOP_MODULATE2X) {=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
+                           GL_DISCARD_NV, GL_SCALE_BY_TWO_NV, GL_NONE, =
GL_FALSE, GL_FALSE, GL_FALSE));=0A=
+            } else if (op =3D=3D WINED3DTOP_MODULATE4X) {=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
+                           GL_DISCARD_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, =
GL_FALSE, GL_FALSE, GL_FALSE));=0A=
+            }=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_ADD:=0A=
+        case WINED3DTOP_ADDSIGNED:=0A=
+        case WINED3DTOP_ADDSIGNED2X:=0A=
+            /* Input, arg1*1+arg2*1 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            if (op =3D=3D WINED3DTOP_ADD) {=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                           output, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
+            } else if (op =3D=3D WINED3DTOP_ADDSIGNED) {=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                           output, GL_NONE, =
GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));=0A=
+            } else if (op =3D=3D WINED3DTOP_ADDSIGNED2X) {=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                           output, GL_SCALE_BY_TWO_NV, =
GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));=0A=
+            }=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_SUBTRACT:=0A=
+            /* Input, arg1*1+-arg2*1 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[1], GL_SIGNED_NEGATE_NV, =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_ADDSMOOTH:=0A=
+            /* Input, arg1*1+(1-arg1)*arg2 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[0], =
invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_BLENDDIFFUSEALPHA:=0A=
+        case WINED3DTOP_BLENDTEXTUREALPHA:=0A=
+        case WINED3DTOP_BLENDFACTORALPHA:=0A=
+        case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
+        case WINED3DTOP_BLENDCURRENTALPHA:=0A=
+        {=0A=
+            GLenum alpha_src =3D GL_PRIMARY_COLOR_NV;=0A=
+            if (op =3D=3D WINED3DTOP_BLENDDIFFUSEALPHA) alpha_src =3D =
d3dta_to_combiner_input(WINED3DTA_DIFFUSE, stage, texture_idx);=0A=
+            else if (op =3D=3D WINED3DTOP_BLENDTEXTUREALPHA) alpha_src =
=3D d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);=0A=
+            else if (op =3D=3D WINED3DTOP_BLENDFACTORALPHA) alpha_src =
=3D d3dta_to_combiner_input(WINED3DTA_TFACTOR, stage, texture_idx);=0A=
+            else if (op =3D=3D WINED3DTOP_BLENDTEXTUREALPHAPM) =
alpha_src =3D d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, =
texture_idx);=0A=
+            else if (op =3D=3D WINED3DTOP_BLENDCURRENTALPHA) alpha_src =
=3D d3dta_to_combiner_input(WINED3DTA_CURRENT, stage, texture_idx);=0A=
+            else FIXME("Unhandled WINED3DTOP %s, shouldn't happen\n", =
debug_d3dtop(op));=0A=
+=0A=
+            /* Input, arg1*alpha_src+arg2*(1-alpha_src) */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            if (op =3D=3D WINED3DTOP_BLENDTEXTUREALPHAPM)=0A=
+            {=0A=
+                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                           GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+            } else {=0A=
+                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                           alpha_src, GL_UNSIGNED_IDENTITY_NV, =
GL_ALPHA));=0A=
+            }=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       alpha_src, GL_UNSIGNED_INVERT_NV, GL_ALPHA));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+        }=0A=
+=0A=
+        case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
+            /* Input, arg1_alpha*arg2_rgb+arg1_rgb*1 */=0A=
+            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATEALPHA_ADDCOLOR)\n");=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
GL_ALPHA));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
+            /* Input, arg1_rgb*arg2_rgb+arg1_alpha*1 */=0A=
+            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATECOLOR_ADDALPHA)\n");=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
GL_ALPHA));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
+            /* Input, (1-arg1_alpha)*arg2_rgb+arg1_rgb*1 */=0A=
+            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATEINVALPHA_ADDCOLOR)\n");=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], =
invert_mapping(tex_op_args.mapping[0]), GL_ALPHA));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
+            /* Input, (1-arg1_rgb)*arg2_rgb+arg1_alpha*1 */=0A=
+            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATEINVCOLOR_ADDALPHA)\n");=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], =
invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
GL_ALPHA));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_DOTPRODUCT3:=0A=
+            /* Input, arg1 . arg2 */=0A=
+            /* FIXME: DX7 uses a different calculation? */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[0], GL_EXPAND_NORMAL_NV, =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[1], GL_EXPAND_NORMAL_NV, =
tex_op_args.component_usage[1]));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
+                       GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, =
GL_FALSE, GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_MULTIPLYADD:=0A=
+            /* Input, arg3*1+arg1*arg2 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[2], tex_op_args.mapping[2], =
tex_op_args.component_usage[2]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_LERP:=0A=
+            /* Input, arg3*arg1+(1-arg3)*arg2 */=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                       tex_op_args.input[2], tex_op_args.mapping[2], =
tex_op_args.component_usage[2]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                       tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
+                       tex_op_args.input[2], =
invert_mapping(tex_op_args.mapping[2]), tex_op_args.component_usage[2]));=0A=
+            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
+                       tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
+=0A=
+            /* Output */=0A=
+            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
+                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_BUMPENVMAPLUMINANCE:=0A=
+        case WINED3DTOP_BUMPENVMAP:=0A=
+            if(GL_SUPPORT(NV_TEXTURE_SHADER)) {=0A=
+                /* The bump map stage itself isn't exciting, just read =
the texture. But tell the next stage to=0A=
+                 * perform bump mapping and source from the current =
stage. Pretty much a SELECTARG2.=0A=
+                 * ARG2 is passed through unmodified(apps will most =
likely use D3DTA_CURRENT for arg2, arg1=0A=
+                 * (which will most likely be D3DTA_TEXTURE) is =
available as a texture shader input for the next stage=0A=
+                 */=0A=
+                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
+                           tex_op_args.input[1], =
tex_op_args.mapping[1], tex_op_args.component_usage[1]));=0A=
+                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
+                           GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
+                /* Always pass through to CURRENT, ignore temp arg */=0A=
+                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_SPARE0_NV, GL_DISCARD_NV,=0A=
+                           GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
+                break;=0A=
+            }=0A=
+=0A=
+        default:=0A=
+            FIXME("Unhandled WINED3DTOP: stage %d, is_alpha %d, op %s =
(%#x), arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",=0A=
+                  stage, is_alpha, debug_d3dtop(op), op, arg1, arg2, =
arg3, texture_idx);=0A=
+    }=0A=
+=0A=
+    checkGLcall("set_tex_op_nvrc()\n");=0A=
+=0A=
+}=0A=
+=0A=
+=0A=
 static void nvrc_colorop(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
     DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
     DWORD mapped_stage =3D stateblock->wineD3DDevice->texUnitMap[stage];=0A=
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c=0A=
index 9ff10a1..9e29d78 100644=0A=
--- a/dlls/wined3d/state.c=0A=
+++ b/dlls/wined3d/state.c=0A=
@@ -1840,6 +1840,1115 @@ static void state_ckeyblend(DWORD state, =
IWineD3DStateBlockImpl *stateblock, Win=0A=
     }=0A=
 }=0A=
 =0A=
+/* Set texture operations up - The following avoids lots of ifdefs in =
this routine!*/=0A=
+#if defined (GL_VERSION_1_3)=0A=
+# define useext(A) A=0A=
+#elif defined (GL_EXT_texture_env_combine)=0A=
+# define useext(A) A##_EXT=0A=
+#elif defined (GL_ARB_texture_env_combine)=0A=
+# define useext(A) A##_ARB=0A=
+#endif=0A=
+=0A=
+static void get_src_and_opr(DWORD arg, BOOL is_alpha, GLenum* source, =
GLenum* operand) {=0A=
+    /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component =
of the=0A=
+    * input should be used for all input components. The =
WINED3DTA_COMPLEMENT=0A=
+    * flag specifies the complement of the input should be used. */=0A=
+    BOOL from_alpha =3D is_alpha || arg & WINED3DTA_ALPHAREPLICATE;=0A=
+    BOOL complement =3D arg & WINED3DTA_COMPLEMENT;=0A=
+=0A=
+    /* Calculate the operand */=0A=
+    if (complement) {=0A=
+        if (from_alpha) *operand =3D GL_ONE_MINUS_SRC_ALPHA;=0A=
+        else *operand =3D GL_ONE_MINUS_SRC_COLOR;=0A=
+    } else {=0A=
+        if (from_alpha) *operand =3D GL_SRC_ALPHA;=0A=
+        else *operand =3D GL_SRC_COLOR;=0A=
+    }=0A=
+=0A=
+    /* Calculate the source */=0A=
+    switch (arg & WINED3DTA_SELECTMASK) {=0A=
+        case WINED3DTA_CURRENT: *source =3D GL_PREVIOUS_EXT; break;=0A=
+        case WINED3DTA_DIFFUSE: *source =3D GL_PRIMARY_COLOR_EXT; break;=0A=
+        case WINED3DTA_TEXTURE: *source =3D GL_TEXTURE; break;=0A=
+        case WINED3DTA_TFACTOR: *source =3D GL_CONSTANT_EXT; break;=0A=
+        case WINED3DTA_SPECULAR:=0A=
+            /*=0A=
+            * According to the GL_ARB_texture_env_combine specs, =
SPECULAR is=0A=
+            * 'Secondary color' and isn't supported until base GL =
supports it=0A=
+            * There is no concept of temp registers as far as I can tell=0A=
+            */=0A=
+            FIXME("Unhandled texture arg WINED3DTA_SPECULAR\n");=0A=
+            *source =3D GL_TEXTURE;=0A=
+            break;=0A=
+        default:=0A=
+            FIXME("Unrecognized texture arg %#x\n", arg);=0A=
+            *source =3D GL_TEXTURE;=0A=
+            break;=0A=
+    }=0A=
+}=0A=
+=0A=
+/* Setup the texture operations texture stage states */=0A=
+static void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)=0A=
+{=0A=
+    GLenum src1, src2, src3;=0A=
+    GLenum opr1, opr2, opr3;=0A=
+    GLenum comb_target;=0A=
+    GLenum src0_target, src1_target, src2_target;=0A=
+    GLenum opr0_target, opr1_target, opr2_target;=0A=
+    GLenum scal_target;=0A=
+    GLenum opr=3D0, invopr, src3_target, opr3_target;=0A=
+    BOOL Handled =3D FALSE;=0A=
+    IWineD3DDeviceImpl *This =3D (IWineD3DDeviceImpl *)iface;=0A=
+    IWineD3DStateBlockImpl *stateblock =3D This->stateBlock; /* for =
GLINFO_LOCATION */=0A=
+=0A=
+    TRACE("Alpha?(%d), Stage:%d Op(%s), a1(%d), a2(%d), a3(%d)\n", =
isAlpha, Stage, debug_d3dtop(op), arg1, arg2, arg3);=0A=
+=0A=
+    /* This is called by a state handler which has the gl lock held and =
a context for the thread */=0A=
+=0A=
+        /* Note: Operations usually involve two ars, src0 and src1 and =
are operations of=0A=
+    the form (a1 <operation> a2). However, some of the more complex =
operations=0A=
+    take 3 parameters. Instead of the (sensible) addition of a3, =
Microsoft added=0A=
+    in a third parameter called a0. Therefore these are operations of =
the form=0A=
+    a0 <operation> a1 <operation> a2, i.e., the new parameter goes to =
the front.=0A=
+=0A=
+    However, below we treat the new (a0) parameter as src2/opr2, so in =
the actual=0A=
+    functions below, expect their syntax to differ slightly to those =
listed in the=0A=
+    manuals, i.e., replace arg1 with arg3, arg2 with arg1 and arg3 with =
arg2=0A=
+    This affects WINED3DTOP_MULTIPLYADD and WINED3DTOP_LERP             =
        */=0A=
+=0A=
+    if (isAlpha) {=0A=
+        comb_target =3D useext(GL_COMBINE_ALPHA);=0A=
+        src0_target =3D useext(GL_SOURCE0_ALPHA);=0A=
+        src1_target =3D useext(GL_SOURCE1_ALPHA);=0A=
+        src2_target =3D useext(GL_SOURCE2_ALPHA);=0A=
+        opr0_target =3D useext(GL_OPERAND0_ALPHA);=0A=
+        opr1_target =3D useext(GL_OPERAND1_ALPHA);=0A=
+        opr2_target =3D useext(GL_OPERAND2_ALPHA);=0A=
+        scal_target =3D GL_ALPHA_SCALE;=0A=
+    }=0A=
+    else {=0A=
+        comb_target =3D useext(GL_COMBINE_RGB);=0A=
+        src0_target =3D useext(GL_SOURCE0_RGB);=0A=
+        src1_target =3D useext(GL_SOURCE1_RGB);=0A=
+        src2_target =3D useext(GL_SOURCE2_RGB);=0A=
+        opr0_target =3D useext(GL_OPERAND0_RGB);=0A=
+        opr1_target =3D useext(GL_OPERAND1_RGB);=0A=
+        opr2_target =3D useext(GL_OPERAND2_RGB);=0A=
+        scal_target =3D useext(GL_RGB_SCALE);=0A=
+    }=0A=
+=0A=
+        /* If a texture stage references an invalid texture unit the =
stage just=0A=
+        * passes through the result from the previous stage */=0A=
+    if (is_invalid_op(This, Stage, op, arg1, arg2, arg3)) {=0A=
+        arg1 =3D WINED3DTA_CURRENT;=0A=
+        op =3D WINED3DTOP_SELECTARG1;=0A=
+    }=0A=
+=0A=
+        /* From MSDN (WINED3DTSS_ALPHAARG1) :=0A=
+    The default argument is WINED3DTA_TEXTURE. If no texture is set for =
this stage,=0A=
+    then the default argument is WINED3DTA_DIFFUSE.=0A=
+    FIXME? If texture added/removed, may need to reset back as well?    =
*/=0A=
+    if (isAlpha && This->stateBlock->textures[Stage] =3D=3D NULL && =
arg1 =3D=3D WINED3DTA_TEXTURE) {=0A=
+        get_src_and_opr(WINED3DTA_DIFFUSE, isAlpha, &src1, &opr1);=0A=
+    } else {=0A=
+        get_src_and_opr(arg1, isAlpha, &src1, &opr1);=0A=
+    }=0A=
+    get_src_and_opr(arg2, isAlpha, &src2, &opr2);=0A=
+    get_src_and_opr(arg3, isAlpha, &src3, &opr3);=0A=
+=0A=
+    TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, =
src1, opr1, src2, opr2, src3, opr3);=0A=
+=0A=
+    Handled =3D TRUE; /* Assume will be handled */=0A=
+=0A=
+    /* Other texture operations require special extensions: */=0A=
+    if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
+        if (isAlpha) {=0A=
+            opr =3D GL_SRC_ALPHA;=0A=
+            invopr =3D GL_ONE_MINUS_SRC_ALPHA;=0A=
+            src3_target =3D GL_SOURCE3_ALPHA_NV;=0A=
+            opr3_target =3D GL_OPERAND3_ALPHA_NV;=0A=
+        } else {=0A=
+            opr =3D GL_SRC_COLOR;=0A=
+            invopr =3D GL_ONE_MINUS_SRC_COLOR;=0A=
+            src3_target =3D GL_SOURCE3_RGB_NV;=0A=
+            opr3_target =3D GL_OPERAND3_RGB_NV;=0A=
+        }=0A=
+        switch (op) {=0A=
+            case WINED3DTOP_DISABLE: /* Only for alpha */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
+                break;=0A=
+                case WINED3DTOP_SELECTARG1:                             =
             /* =3D a1 * 1 + 0 * 0 */=0A=
+                case WINED3DTOP_SELECTARG2:                             =
             /* =3D a2 * 1 + 0 * 0 */=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                    if (op =3D=3D WINED3DTOP_SELECTARG1) {=0A=
+                        glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                        checkGLcall("GL_TEXTURE_ENV, src0_target, =
src1");=0A=
+                        glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                        checkGLcall("GL_TEXTURE_ENV, opr0_target, =
opr1");=0A=
+                    } else {=0A=
+                        glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);=0A=
+                        checkGLcall("GL_TEXTURE_ENV, src0_target, =
src2");=0A=
+                        glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);=0A=
+                        checkGLcall("GL_TEXTURE_ENV, opr0_target, =
opr2");=0A=
+                    }=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                    glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                    checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
+                    break;=0A=
+=0A=
+            case WINED3DTOP_MODULATE:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* =
Add =3D a0*a1 + a2*a3 */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_MODULATE2X:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* =
Add =3D a0*a1 + a2*a3 */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
+                break;=0A=
+            case WINED3DTOP_MODULATE4X:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* =
Add =3D a0*a1 + a2*a3 */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 4");=0A=
+                break;=0A=
+=0A=
+            case WINED3DTOP_ADD:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+=0A=
+            case WINED3DTOP_ADDSIGNED:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+=0A=
+            case WINED3DTOP_ADDSIGNED2X:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
+                break;=0A=
+=0A=
+            case WINED3DTOP_ADDSMOOTH:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; =
break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+=0A=
+            case WINED3DTOP_BLENDDIFFUSEALPHA:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, =
useext(GL_PRIMARY_COLOR));=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, =
useext(GL_PRIMARY_COLOR)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, =
useext(GL_PRIMARY_COLOR));=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, =
useext(GL_PRIMARY_COLOR)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_BLENDTEXTUREALPHA:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_BLENDFACTORALPHA:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, =
useext(GL_CONSTANT));=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, =
useext(GL_CONSTANT)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, =
useext(GL_CONSTANT));=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, =
useext(GL_CONSTANT)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");  /* =
Add =3D a0*a1 + a2*a3 */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);        /* =
  a0 =3D src1/opr1    */=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");    /* =
  a1 =3D 1 (see docs) */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);        /* =
  a2 =3D arg2         */=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");     =
/*  a3 =3D src1 alpha   */=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, src1");=0A=
+                switch (opr) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; =
break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+            case WINED3DTOP_MULTIPLYADD:=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src3_target, src3");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+                break;=0A=
+=0A=
+            case WINED3DTOP_BUMPENVMAP:=0A=
+            {=0A=
+            }=0A=
+=0A=
+            case WINED3DTOP_BUMPENVMAPLUMINANCE:=0A=
+                FIXME("Implement bump environment mapping in =
GL_NV_texture_env_combine4 path\n");=0A=
+=0A=
+            default:=0A=
+                Handled =3D FALSE;=0A=
+        }=0A=
+        if (Handled) {=0A=
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
GL_COMBINE4_NV);=0A=
+            checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
GL_COMBINE4_NV");=0A=
+=0A=
+            return;=0A=
+        }=0A=
+    } /* GL_NV_texture_env_combine4 */=0A=
+=0A=
+    Handled =3D TRUE; /* Again, assume handled */=0A=
+    switch (op) {=0A=
+        case WINED3DTOP_DISABLE: /* Only for alpha */=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_SELECTARG1:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_SELECTARG2:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_MODULATE:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_MODULATE2X:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
+            break;=0A=
+        case WINED3DTOP_MODULATE4X:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 4");=0A=
+            break;=0A=
+        case WINED3DTOP_ADD:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_ADDSIGNED:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext((GL_ADD_SIGNED)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_ADDSIGNED2X:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
+            break;=0A=
+        case WINED3DTOP_SUBTRACT:=0A=
+            if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_SUBTRACT)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else {=0A=
+                FIXME("This version of opengl does not support =
GL_SUBTRACT\n");=0A=
+            }=0A=
+            break;=0A=
+=0A=
+        case WINED3DTOP_BLENDDIFFUSEALPHA:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src2_target, =
useext(GL_PRIMARY_COLOR));=0A=
+            checkGLcall("GL_TEXTURE_ENV, src2_target, =
GL_PRIMARY_COLOR");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_BLENDTEXTUREALPHA:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_BLENDFACTORALPHA:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));=0A=
+            checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_BLENDCURRENTALPHA:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));=0A=
+            checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_DOTPRODUCT3:=0A=
+            if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_ARB);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_ARB");=0A=
+            } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_EXT);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_EXT");=0A=
+            } else {=0A=
+                FIXME("This version of opengl does not support =
GL_DOT3\n");=0A=
+            }=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_LERP:=0A=
+            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
+            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);=0A=
+            checkGLcall("GL_TEXTURE_ENV, src2_target, src3");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);=0A=
+            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");=0A=
+            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            break;=0A=
+        case WINED3DTOP_ADDSMOOTH:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; =
break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, =
GL_ONE_MINUS_SRC_APHA");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; =
break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
+                switch (opr1) {=0A=
+                    case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                    case GL_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
+                    case GL_ONE_MINUS_SRC_ALPHA: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
+                }=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_MULTIPLYADD:=0A=
+            if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
+                checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src3);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src1_target, src3");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr3);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr3");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
+            } else=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+        case WINED3DTOP_BUMPENVMAPLUMINANCE:=0A=
+            if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {=0A=
+                    /* Some apps use BUMPENVMAPLUMINANCE instead of =
D3DTOP_BUMPENVMAP, although=0A=
+                * they check for the non-luminance cap flag. Well, give =
them what they asked=0A=
+                * for :-)=0A=
+                    */=0A=
+                WARN("Application uses =
WINED3DTOP_BUMPENVMAPLUMINANCE\n");=0A=
+            } else {=0A=
+                Handled =3D FALSE;=0A=
+                break;=0A=
+            }=0A=
+            /* Fall through */=0A=
+        case WINED3DTOP_BUMPENVMAP:=0A=
+            if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {=0A=
+                TRACE("Using ati bumpmap on stage %d, target %d\n", =
Stage, Stage + 1);=0A=
+                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_BUMP_ENVMAP_ATI);=0A=
+                checkGLcall("glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_BUMP_ENVMAP_ATI)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, =
GL_TEXTURE0_ARB + Stage + 1);=0A=
+                checkGLcall("glTexEnvi(GL_TEXTURE_ENV, =
GL_BUMP_TARGET_ATI, GL_TEXTURE0_ARB + Stage + 1)");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src3");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
+                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
+                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
+=0A=
+                Handled =3D TRUE;=0A=
+                break;=0A=
+            } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
+                /* Technically texture shader support without register =
combiners is possible, but not expected to occur=0A=
+                 * on real world cards, so for now a fixme should be =
enough=0A=
+                 */=0A=
+                FIXME("Implement bump mapping with GL_NV_texture_shader =
in non register combiner path\n");=0A=
+            }=0A=
+        default:=0A=
+            Handled =3D FALSE;=0A=
+    }=0A=
+=0A=
+    if (Handled) {=0A=
+        BOOL  combineOK =3D TRUE;=0A=
+        if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
+            DWORD op2;=0A=
+=0A=
+            if (isAlpha) {=0A=
+                op2 =3D =
This->stateBlock->textureState[Stage][WINED3DTSS_COLOROP];=0A=
+            } else {=0A=
+                op2 =3D =
This->stateBlock->textureState[Stage][WINED3DTSS_ALPHAOP];=0A=
+            }=0A=
+=0A=
+            /* Note: If COMBINE4 in effect can't go back to combine! */=0A=
+            switch (op2) {=0A=
+                case WINED3DTOP_ADDSMOOTH:=0A=
+                case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
+                case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
+                case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
+                case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
+                case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
+                case WINED3DTOP_MULTIPLYADD:=0A=
+                    /* Ignore those implemented in both cases */=0A=
+                    switch (op) {=0A=
+                        case WINED3DTOP_SELECTARG1:=0A=
+                        case WINED3DTOP_SELECTARG2:=0A=
+                            combineOK =3D FALSE;=0A=
+                            Handled   =3D FALSE;=0A=
+                            break;=0A=
+                        default:=0A=
+                            FIXME("Can't use COMBINE4 and COMBINE =
together, thisop=3D%s, otherop=3D%s, isAlpha(%d)\n", debug_d3dtop(op), =
debug_d3dtop(op2), isAlpha);=0A=
+                            return;=0A=
+                    }=0A=
+            }=0A=
+        }=0A=
+=0A=
+        if (combineOK) {=0A=
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
useext(GL_COMBINE));=0A=
+            checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
useext(GL_COMBINE)");=0A=
+=0A=
+            return;=0A=
+        }=0A=
+    }=0A=
+=0A=
+    /* After all the extensions, if still unhandled, report fixme */=0A=
+    FIXME("Unhandled texture operation %s\n", debug_d3dtop(op));=0A=
+}=0A=
+=0A=
+=0A=
 static void tex_colorop(DWORD state, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context) {=0A=
     DWORD stage =3D (state - STATE_TEXTURESTAGE(0, 0)) / =
WINED3D_HIGHEST_TEXTURE_STATE;=0A=
     DWORD mapped_stage =3D stateblock->wineD3DDevice->texUnitMap[stage];=0A=
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c=0A=
index 245c2c2..dd18b27 100644=0A=
--- a/dlls/wined3d/utils.c=0A=
+++ b/dlls/wined3d/utils.c=0A=
@@ -942,7 +942,7 @@ const char* debug_d3dtexturestate(DWORD state) {=0A=
   }=0A=
 }=0A=
 =0A=
-static const char* debug_d3dtop(WINED3DTEXTUREOP d3dtop) {=0A=
+const char* debug_d3dtop(WINED3DTEXTUREOP d3dtop) {=0A=
     switch (d3dtop) {=0A=
 #define D3DTOP_TO_STR(u) case u: return #u=0A=
         D3DTOP_TO_STR(WINED3DTOP_DISABLE);=0A=
@@ -1107,68 +1107,7 @@ GLenum CompareFunc(DWORD func) {=0A=
     }=0A=
 }=0A=
 =0A=
-static GLenum d3dta_to_combiner_input(DWORD d3dta, DWORD stage, INT =
texture_idx) {=0A=
-    switch (d3dta) {=0A=
-        case WINED3DTA_DIFFUSE:=0A=
-            return GL_PRIMARY_COLOR_NV;=0A=
-=0A=
-        case WINED3DTA_CURRENT:=0A=
-            if (stage) return GL_SPARE0_NV;=0A=
-            else return GL_PRIMARY_COLOR_NV;=0A=
-=0A=
-        case WINED3DTA_TEXTURE:=0A=
-            if (texture_idx > -1) return GL_TEXTURE0_ARB + texture_idx;=0A=
-            else return GL_PRIMARY_COLOR_NV;=0A=
-=0A=
-        case WINED3DTA_TFACTOR:=0A=
-            return GL_CONSTANT_COLOR0_NV;=0A=
-=0A=
-        case WINED3DTA_SPECULAR:=0A=
-            return GL_SECONDARY_COLOR_NV;=0A=
-=0A=
-        case WINED3DTA_TEMP:=0A=
-            return GL_SPARE1_NV;=0A=
-=0A=
-        case WINED3DTA_CONSTANT:=0A=
-            /* TODO: Support per stage constants (WINED3DTSS_CONSTANT, =
NV_register_combiners2) */=0A=
-            FIXME("WINED3DTA_CONSTANT, not properly supported.\n");=0A=
-            return GL_CONSTANT_COLOR1_NV;=0A=
-=0A=
-        default:=0A=
-            FIXME("Unrecognized texture arg %#x\n", d3dta);=0A=
-            return GL_TEXTURE;=0A=
-    }=0A=
-}=0A=
-=0A=
-static GLenum invert_mapping(GLenum mapping) {=0A=
-    if (mapping =3D=3D GL_UNSIGNED_INVERT_NV) return =
GL_SIGNED_IDENTITY_NV;=0A=
-    else if (mapping =3D=3D GL_SIGNED_IDENTITY_NV) return =
GL_UNSIGNED_INVERT_NV;=0A=
-=0A=
-    FIXME("Unhandled mapping %#x\n", mapping);=0A=
-    return mapping;=0A=
-}=0A=
-=0A=
-static void get_src_and_opr_nvrc(DWORD stage, DWORD arg, BOOL is_alpha, =
GLenum* input, GLenum* mapping, GLenum *component_usage, INT =
texture_idx) {=0A=
-    /* The WINED3DTA_COMPLEMENT flag specifies the complement of the =
input should=0A=
-     * be used. */=0A=
-    if (arg & WINED3DTA_COMPLEMENT) *mapping =3D GL_UNSIGNED_INVERT_NV;=0A=
-    else *mapping =3D GL_SIGNED_IDENTITY_NV;=0A=
-=0A=
-    /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component =
of the input=0A=
-     * should be used for all input components. */=0A=
-    if (is_alpha || arg & WINED3DTA_ALPHAREPLICATE) *component_usage =
=3D GL_ALPHA;=0A=
-    else *component_usage =3D GL_RGB;=0A=
-=0A=
-    *input =3D d3dta_to_combiner_input(arg & WINED3DTA_SELECTMASK, =
stage, texture_idx);=0A=
-}=0A=
-=0A=
-typedef struct {=0A=
-    GLenum input[3];=0A=
-    GLenum mapping[3];=0A=
-    GLenum component_usage[3];=0A=
-} tex_op_args;=0A=
-=0A=
-static BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) {=0A=
+BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) {=0A=
     if (op =3D=3D WINED3DTOP_DISABLE) return FALSE;=0A=
     if (This->stateBlock->textures[stage]) return FALSE;=0A=
 =0A=
@@ -1182,1436 +1121,6 @@ static BOOL is_invalid_op(IWineD3DDeviceImpl =
*This, int stage, WINED3DTEXTUREOP=0A=
     return FALSE;=0A=
 }=0A=
 =0A=
-void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT =
texture_idx, DWORD dst) {=0A=
-    IWineD3DDeviceImpl *This =3D (IWineD3DDeviceImpl*)iface;=0A=
-    tex_op_args tex_op_args =3D {{0}, {0}, {0}};=0A=
-    GLenum portion =3D is_alpha ? GL_ALPHA : GL_RGB;=0A=
-    GLenum target =3D GL_COMBINER0_NV + stage;=0A=
-    GLenum output;=0A=
-=0A=
-    TRACE("stage %d, is_alpha %d, op %s, arg1 %#x, arg2 %#x, arg3 %#x, =
texture_idx %d\n",=0A=
-            stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, =
texture_idx);=0A=
-=0A=
-    /* If a texture stage references an invalid texture unit the stage =
just=0A=
-     * passes through the result from the previous stage */=0A=
-    if (is_invalid_op(This, stage, op, arg1, arg2, arg3)) {=0A=
-        arg1 =3D WINED3DTA_CURRENT;=0A=
-        op =3D WINED3DTOP_SELECTARG1;=0A=
-    }=0A=
-=0A=
-    get_src_and_opr_nvrc(stage, arg1, is_alpha, &tex_op_args.input[0],=0A=
-            &tex_op_args.mapping[0], &tex_op_args.component_usage[0], =
texture_idx);=0A=
-    get_src_and_opr_nvrc(stage, arg2, is_alpha, &tex_op_args.input[1],=0A=
-            &tex_op_args.mapping[1], &tex_op_args.component_usage[1], =
texture_idx);=0A=
-    get_src_and_opr_nvrc(stage, arg3, is_alpha, &tex_op_args.input[2],=0A=
-            &tex_op_args.mapping[2], &tex_op_args.component_usage[2], =
texture_idx);=0A=
-=0A=
-=0A=
-    if(dst =3D=3D WINED3DTA_TEMP) {=0A=
-        output =3D GL_SPARE1_NV;=0A=
-    } else {=0A=
-        output =3D GL_SPARE0_NV;=0A=
-    }=0A=
-=0A=
-    /* This is called by a state handler which has the gl lock held and =
a context for the thread */=0A=
-    switch(op)=0A=
-    {=0A=
-        case WINED3DTOP_DISABLE:=0A=
-            /* Only for alpha */=0A=
-            if (!is_alpha) ERR("Shouldn't be called for =
WINED3DTSS_COLOROP (WINED3DTOP_DISABLE)\n");=0A=
-            /* Input, prev_alpha*1 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_SPARE0_NV, GL_DISCARD_NV,=0A=
-                    GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_SELECTARG1:=0A=
-        case WINED3DTOP_SELECTARG2:=0A=
-            /* Input, arg*1 */=0A=
-            if (op =3D=3D WINED3DTOP_SELECTARG1) {=0A=
-                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                        tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            } else {=0A=
-                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                        tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            }=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
-                    GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_MODULATE:=0A=
-        case WINED3DTOP_MODULATE2X:=0A=
-        case WINED3DTOP_MODULATE4X:=0A=
-            /* Input, arg1*arg2 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-=0A=
-            /* Output */=0A=
-            if (op =3D=3D WINED3DTOP_MODULATE) {=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
-                        GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
-            } else if (op =3D=3D WINED3DTOP_MODULATE2X) {=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
-                        GL_DISCARD_NV, GL_SCALE_BY_TWO_NV, GL_NONE, =
GL_FALSE, GL_FALSE, GL_FALSE));=0A=
-            } else if (op =3D=3D WINED3DTOP_MODULATE4X) {=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
-                        GL_DISCARD_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, =
GL_FALSE, GL_FALSE, GL_FALSE));=0A=
-            }=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_ADD:=0A=
-        case WINED3DTOP_ADDSIGNED:=0A=
-        case WINED3DTOP_ADDSIGNED2X:=0A=
-            /* Input, arg1*1+arg2*1 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            if (op =3D=3D WINED3DTOP_ADD) {=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                           output, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
-            } else if (op =3D=3D WINED3DTOP_ADDSIGNED) {=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                           output, GL_NONE, =
GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));=0A=
-            } else if (op =3D=3D WINED3DTOP_ADDSIGNED2X) {=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                           output, GL_SCALE_BY_TWO_NV, =
GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));=0A=
-            }=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_SUBTRACT:=0A=
-            /* Input, arg1*1+-arg2*1 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[1], GL_SIGNED_NEGATE_NV, =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_ADDSMOOTH:=0A=
-            /* Input, arg1*1+(1-arg1)*arg2 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[0], =
invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_BLENDDIFFUSEALPHA:=0A=
-        case WINED3DTOP_BLENDTEXTUREALPHA:=0A=
-        case WINED3DTOP_BLENDFACTORALPHA:=0A=
-        case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
-        case WINED3DTOP_BLENDCURRENTALPHA:=0A=
-        {=0A=
-            GLenum alpha_src =3D GL_PRIMARY_COLOR_NV;=0A=
-            if (op =3D=3D WINED3DTOP_BLENDDIFFUSEALPHA) alpha_src =3D =
d3dta_to_combiner_input(WINED3DTA_DIFFUSE, stage, texture_idx);=0A=
-            else if (op =3D=3D WINED3DTOP_BLENDTEXTUREALPHA) alpha_src =
=3D d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);=0A=
-            else if (op =3D=3D WINED3DTOP_BLENDFACTORALPHA) alpha_src =
=3D d3dta_to_combiner_input(WINED3DTA_TFACTOR, stage, texture_idx);=0A=
-            else if (op =3D=3D WINED3DTOP_BLENDTEXTUREALPHAPM) =
alpha_src =3D d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, =
texture_idx);=0A=
-            else if (op =3D=3D WINED3DTOP_BLENDCURRENTALPHA) alpha_src =
=3D d3dta_to_combiner_input(WINED3DTA_CURRENT, stage, texture_idx);=0A=
-            else FIXME("Unhandled WINED3DTOP %s, shouldn't happen\n", =
debug_d3dtop(op));=0A=
-=0A=
-            /* Input, arg1*alpha_src+arg2*(1-alpha_src) */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            if (op =3D=3D WINED3DTOP_BLENDTEXTUREALPHAPM)=0A=
-            {=0A=
-                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                        GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-            } else {=0A=
-                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                        alpha_src, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA));=0A=
-            }=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    alpha_src, GL_UNSIGNED_INVERT_NV, GL_ALPHA));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-        }=0A=
-=0A=
-        case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
-            /* Input, arg1_alpha*arg2_rgb+arg1_rgb*1 */=0A=
-            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATEALPHA_ADDCOLOR)\n");=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
GL_ALPHA));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
-            /* Input, arg1_rgb*arg2_rgb+arg1_alpha*1 */=0A=
-            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATECOLOR_ADDALPHA)\n");=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
GL_ALPHA));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
-            /* Input, (1-arg1_alpha)*arg2_rgb+arg1_rgb*1 */=0A=
-            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATEINVALPHA_ADDCOLOR)\n");=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], =
invert_mapping(tex_op_args.mapping[0]), GL_ALPHA));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
-            /* Input, (1-arg1_rgb)*arg2_rgb+arg1_alpha*1 */=0A=
-            if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP =
(WINED3DTOP_MODULATEINVCOLOR_ADDALPHA)\n");=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], =
invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
GL_ALPHA));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_DOTPRODUCT3:=0A=
-            /* Input, arg1 . arg2 */=0A=
-            /* FIXME: DX7 uses a different calculation? */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[0], GL_EXPAND_NORMAL_NV, =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[1], GL_EXPAND_NORMAL_NV, =
tex_op_args.component_usage[1]));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, output, =
GL_DISCARD_NV,=0A=
-                    GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_MULTIPLYADD:=0A=
-            /* Input, arg3*1+arg1*arg2 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[2], tex_op_args.mapping[2], =
tex_op_args.component_usage[2]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_LERP:=0A=
-            /* Input, arg3*arg1+(1-arg3)*arg2 */=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                    tex_op_args.input[2], tex_op_args.mapping[2], =
tex_op_args.component_usage[2]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                    tex_op_args.input[0], tex_op_args.mapping[0], =
tex_op_args.component_usage[0]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_C_NV,=0A=
-                    tex_op_args.input[2], =
invert_mapping(tex_op_args.mapping[2]), tex_op_args.component_usage[2]));=0A=
-            GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_D_NV,=0A=
-                    tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-=0A=
-            /* Output */=0A=
-            GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_DISCARD_NV, GL_DISCARD_NV,=0A=
-                       output, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, =
GL_FALSE));=0A=
-            break;=0A=
-=0A=
-        case WINED3DTOP_BUMPENVMAPLUMINANCE:=0A=
-        case WINED3DTOP_BUMPENVMAP:=0A=
-            if(GL_SUPPORT(NV_TEXTURE_SHADER)) {=0A=
-                /* The bump map stage itself isn't exciting, just read =
the texture. But tell the next stage to=0A=
-                 * perform bump mapping and source from the current =
stage. Pretty much a SELECTARG2.=0A=
-                 * ARG2 is passed through unmodified(apps will most =
likely use D3DTA_CURRENT for arg2, arg1=0A=
-                 * (which will most likely be D3DTA_TEXTURE) is =
available as a texture shader input for the next stage=0A=
-                 */=0A=
-                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_A_NV,=0A=
-                        tex_op_args.input[1], tex_op_args.mapping[1], =
tex_op_args.component_usage[1]));=0A=
-                GL_EXTCALL(glCombinerInputNV(target, portion, =
GL_VARIABLE_B_NV,=0A=
-                        GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));=0A=
-                /* Always pass through to CURRENT, ignore temp arg */=0A=
-                GL_EXTCALL(glCombinerOutputNV(target, portion, =
GL_SPARE0_NV, GL_DISCARD_NV,=0A=
-                        GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, =
GL_FALSE, GL_FALSE));=0A=
-                break;=0A=
-            }=0A=
-=0A=
-        default:=0A=
-            FIXME("Unhandled WINED3DTOP: stage %d, is_alpha %d, op %s =
(%#x), arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",=0A=
-                    stage, is_alpha, debug_d3dtop(op), op, arg1, arg2, =
arg3, texture_idx);=0A=
-    }=0A=
-=0A=
-    checkGLcall("set_tex_op_nvrc()\n");=0A=
-=0A=
-}=0A=
-=0A=
-static void get_src_and_opr(DWORD arg, BOOL is_alpha, GLenum* source, =
GLenum* operand) {=0A=
-    /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component =
of the=0A=
-     * input should be used for all input components. The =
WINED3DTA_COMPLEMENT=0A=
-     * flag specifies the complement of the input should be used. */=0A=
-    BOOL from_alpha =3D is_alpha || arg & WINED3DTA_ALPHAREPLICATE;=0A=
-    BOOL complement =3D arg & WINED3DTA_COMPLEMENT;=0A=
-=0A=
-    /* Calculate the operand */=0A=
-    if (complement) {=0A=
-        if (from_alpha) *operand =3D GL_ONE_MINUS_SRC_ALPHA;=0A=
-        else *operand =3D GL_ONE_MINUS_SRC_COLOR;=0A=
-    } else {=0A=
-        if (from_alpha) *operand =3D GL_SRC_ALPHA;=0A=
-        else *operand =3D GL_SRC_COLOR;=0A=
-    }=0A=
-=0A=
-    /* Calculate the source */=0A=
-    switch (arg & WINED3DTA_SELECTMASK) {=0A=
-        case WINED3DTA_CURRENT: *source =3D GL_PREVIOUS_EXT; break;=0A=
-        case WINED3DTA_DIFFUSE: *source =3D GL_PRIMARY_COLOR_EXT; break;=0A=
-        case WINED3DTA_TEXTURE: *source =3D GL_TEXTURE; break;=0A=
-        case WINED3DTA_TFACTOR: *source =3D GL_CONSTANT_EXT; break;=0A=
-        case WINED3DTA_SPECULAR:=0A=
-            /*=0A=
-             * According to the GL_ARB_texture_env_combine specs, =
SPECULAR is=0A=
-             * 'Secondary color' and isn't supported until base GL =
supports it=0A=
-             * There is no concept of temp registers as far as I can =
tell=0A=
-             */=0A=
-            FIXME("Unhandled texture arg WINED3DTA_SPECULAR\n");=0A=
-            *source =3D GL_TEXTURE;=0A=
-            break;=0A=
-        default:=0A=
-            FIXME("Unrecognized texture arg %#x\n", arg);=0A=
-            *source =3D GL_TEXTURE;=0A=
-            break;=0A=
-    }=0A=
-}=0A=
-=0A=
-/* Set texture operations up - The following avoids lots of ifdefs in =
this routine!*/=0A=
-#if defined (GL_VERSION_1_3)=0A=
-# define useext(A) A=0A=
-#elif defined (GL_EXT_texture_env_combine)=0A=
-# define useext(A) A##_EXT=0A=
-#elif defined (GL_ARB_texture_env_combine)=0A=
-# define useext(A) A##_ARB=0A=
-#endif=0A=
-=0A=
-/* Setup the texture operations texture stage states */=0A=
-void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)=0A=
-{=0A=
-        GLenum src1, src2, src3;=0A=
-        GLenum opr1, opr2, opr3;=0A=
-        GLenum comb_target;=0A=
-        GLenum src0_target, src1_target, src2_target;=0A=
-        GLenum opr0_target, opr1_target, opr2_target;=0A=
-        GLenum scal_target;=0A=
-        GLenum opr=3D0, invopr, src3_target, opr3_target;=0A=
-        BOOL Handled =3D FALSE;=0A=
-        IWineD3DDeviceImpl *This =3D (IWineD3DDeviceImpl *)iface;=0A=
-=0A=
-        TRACE("Alpha?(%d), Stage:%d Op(%s), a1(%d), a2(%d), a3(%d)\n", =
isAlpha, Stage, debug_d3dtop(op), arg1, arg2, arg3);=0A=
-=0A=
-        /* This is called by a state handler which has the gl lock held =
and a context for the thread */=0A=
-=0A=
-        /* Note: Operations usually involve two ars, src0 and src1 and =
are operations of=0A=
-           the form (a1 <operation> a2). However, some of the more =
complex operations=0A=
-           take 3 parameters. Instead of the (sensible) addition of a3, =
Microsoft added=0A=
-           in a third parameter called a0. Therefore these are =
operations of the form=0A=
-           a0 <operation> a1 <operation> a2, i.e., the new parameter =
goes to the front.=0A=
-=0A=
-           However, below we treat the new (a0) parameter as src2/opr2, =
so in the actual=0A=
-           functions below, expect their syntax to differ slightly to =
those listed in the=0A=
-           manuals, i.e., replace arg1 with arg3, arg2 with arg1 and =
arg3 with arg2=0A=
-           This affects WINED3DTOP_MULTIPLYADD and WINED3DTOP_LERP      =
               */=0A=
-=0A=
-        if (isAlpha) {=0A=
-                comb_target =3D useext(GL_COMBINE_ALPHA);=0A=
-                src0_target =3D useext(GL_SOURCE0_ALPHA);=0A=
-                src1_target =3D useext(GL_SOURCE1_ALPHA);=0A=
-                src2_target =3D useext(GL_SOURCE2_ALPHA);=0A=
-                opr0_target =3D useext(GL_OPERAND0_ALPHA);=0A=
-                opr1_target =3D useext(GL_OPERAND1_ALPHA);=0A=
-                opr2_target =3D useext(GL_OPERAND2_ALPHA);=0A=
-                scal_target =3D GL_ALPHA_SCALE;=0A=
-        }=0A=
-        else {=0A=
-                comb_target =3D useext(GL_COMBINE_RGB);=0A=
-                src0_target =3D useext(GL_SOURCE0_RGB);=0A=
-                src1_target =3D useext(GL_SOURCE1_RGB);=0A=
-                src2_target =3D useext(GL_SOURCE2_RGB);=0A=
-                opr0_target =3D useext(GL_OPERAND0_RGB);=0A=
-                opr1_target =3D useext(GL_OPERAND1_RGB);=0A=
-                opr2_target =3D useext(GL_OPERAND2_RGB);=0A=
-                scal_target =3D useext(GL_RGB_SCALE);=0A=
-        }=0A=
-=0A=
-        /* If a texture stage references an invalid texture unit the =
stage just=0A=
-         * passes through the result from the previous stage */=0A=
-        if (is_invalid_op(This, Stage, op, arg1, arg2, arg3)) {=0A=
-            arg1 =3D WINED3DTA_CURRENT;=0A=
-            op =3D WINED3DTOP_SELECTARG1;=0A=
-        }=0A=
-=0A=
-        /* From MSDN (WINED3DTSS_ALPHAARG1) :=0A=
-           The default argument is WINED3DTA_TEXTURE. If no texture is =
set for this stage,=0A=
-                   then the default argument is WINED3DTA_DIFFUSE.=0A=
-                   FIXME? If texture added/removed, may need to reset =
back as well?    */=0A=
-        if (isAlpha && This->stateBlock->textures[Stage] =3D=3D NULL && =
arg1 =3D=3D WINED3DTA_TEXTURE) {=0A=
-            get_src_and_opr(WINED3DTA_DIFFUSE, isAlpha, &src1, &opr1);=0A=
-        } else {=0A=
-            get_src_and_opr(arg1, isAlpha, &src1, &opr1);=0A=
-        }=0A=
-        get_src_and_opr(arg2, isAlpha, &src2, &opr2);=0A=
-        get_src_and_opr(arg3, isAlpha, &src3, &opr3);=0A=
-=0A=
-        TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, =
src1, opr1, src2, opr2, src3, opr3);=0A=
-=0A=
-        Handled =3D TRUE; /* Assume will be handled */=0A=
-=0A=
-        /* Other texture operations require special extensions: */=0A=
-        if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
-          if (isAlpha) {=0A=
-            opr =3D GL_SRC_ALPHA;=0A=
-            invopr =3D GL_ONE_MINUS_SRC_ALPHA;=0A=
-            src3_target =3D GL_SOURCE3_ALPHA_NV;=0A=
-            opr3_target =3D GL_OPERAND3_ALPHA_NV;=0A=
-          } else {=0A=
-            opr =3D GL_SRC_COLOR;=0A=
-            invopr =3D GL_ONE_MINUS_SRC_COLOR;=0A=
-            src3_target =3D GL_SOURCE3_RGB_NV;=0A=
-            opr3_target =3D GL_OPERAND3_RGB_NV;=0A=
-          }=0A=
-          switch (op) {=0A=
-          case WINED3DTOP_DISABLE: /* Only for alpha */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
-            break;=0A=
-          case WINED3DTOP_SELECTARG1:                                   =
       /* =3D a1 * 1 + 0 * 0 */=0A=
-          case WINED3DTOP_SELECTARG2:                                   =
       /* =3D a2 * 1 + 0 * 0 */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            if (op =3D=3D WINED3DTOP_SELECTARG1) {=0A=
-              glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-              checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-              glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-              checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            } else {=0A=
-              glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);=0A=
-              checkGLcall("GL_TEXTURE_ENV, src0_target, src2");=0A=
-              glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);=0A=
-              checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_MODULATE:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add =
=3D a0*a1 + a2*a3 */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_MODULATE2X:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add =
=3D a0*a1 + a2*a3 */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
-            break;=0A=
-          case WINED3DTOP_MODULATE4X:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add =
=3D a0*a1 + a2*a3 */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 4");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_ADD:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_ADDSIGNED:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED)");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_ADDSIGNED2X:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED)");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_ADDSMOOTH:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, src1");=0A=
-            switch (opr1) {=0A=
-            case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; break;=0A=
-            case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; break;=0A=
-            case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_BLENDDIFFUSEALPHA:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, =
useext(GL_PRIMARY_COLOR));=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, =
useext(GL_PRIMARY_COLOR)");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, =
useext(GL_PRIMARY_COLOR));=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, =
useext(GL_PRIMARY_COLOR)");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_BLENDTEXTUREALPHA:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_BLENDFACTORALPHA:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT));=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, =
useext(GL_CONSTANT)");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT));=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, =
useext(GL_CONSTANT)");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, =
GL_ONE_MINUS_SRC_ALPHA");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");  /* Add =
=3D a0*a1 + a2*a3 */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);        /*   =
a0 =3D src1/opr1    */=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");    /*   =
a1 =3D 1 (see docs) */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);        /*   =
a2 =3D arg2         */=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");     /*  =
a3 =3D src1 alpha   */=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, src1");=0A=
-            switch (opr) {=0A=
-            case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src1");=0A=
-            switch (opr1) {=0A=
-            case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, src1");=0A=
-            switch (opr1) {=0A=
-            case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-            case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            switch (opr1) {=0A=
-            case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; break;=0A=
-            case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; break;=0A=
-            case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src1");=0A=
-            switch (opr1) {=0A=
-            case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-            case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-            }=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-          case WINED3DTOP_MULTIPLYADD:=0A=
-            glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-            checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, src3_target, src3");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);=0A=
-            checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");=0A=
-            glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-            checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-            break;=0A=
-=0A=
-          case WINED3DTOP_BUMPENVMAP:=0A=
-            {=0A=
-            }=0A=
-=0A=
-          case WINED3DTOP_BUMPENVMAPLUMINANCE:=0A=
-                FIXME("Implement bump environment mapping in =
GL_NV_texture_env_combine4 path\n");=0A=
-=0A=
-          default:=0A=
-            Handled =3D FALSE;=0A=
-          }=0A=
-          if (Handled) {=0A=
-            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
GL_COMBINE4_NV);=0A=
-            checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
GL_COMBINE4_NV");=0A=
-=0A=
-            return;=0A=
-          }=0A=
-        } /* GL_NV_texture_env_combine4 */=0A=
-=0A=
-        Handled =3D TRUE; /* Again, assume handled */=0A=
-        switch (op) {=0A=
-        case WINED3DTOP_DISABLE: /* Only for alpha */=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, =
GL_PREVIOUS_EXT");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, =
GL_SRC_ALPHA");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_SELECTARG1:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_SELECTARG2:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATE:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATE2X:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATE4X:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 4");=0A=
-                break;=0A=
-        case WINED3DTOP_ADD:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_ADDSIGNED:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext((GL_ADD_SIGNED)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_ADDSIGNED2X:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_ADD_SIGNED)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 2");=0A=
-                break;=0A=
-        case WINED3DTOP_SUBTRACT:=0A=
-          if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_SUBTRACT)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-          } else {=0A=
-                FIXME("This version of opengl does not support =
GL_SUBTRACT\n");=0A=
-          }=0A=
-          break;=0A=
-=0A=
-        case WINED3DTOP_BLENDDIFFUSEALPHA:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src2_target, =
useext(GL_PRIMARY_COLOR));=0A=
-                checkGLcall("GL_TEXTURE_ENV, src2_target, =
GL_PRIMARY_COLOR");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr2_target, =
GL_SRC_ALPHA");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_BLENDTEXTUREALPHA:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr2_target, =
GL_SRC_ALPHA");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_BLENDFACTORALPHA:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src2_target, =
useext(GL_CONSTANT));=0A=
-                checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr2_target, =
GL_SRC_ALPHA");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_BLENDCURRENTALPHA:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src2_target, =
useext(GL_PREVIOUS));=0A=
-                checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr2_target, =
GL_SRC_ALPHA");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_DOTPRODUCT3:=0A=
-                if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_ARB);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_ARB");=0A=
-                } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_EXT);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_DOT3_RGBA_EXT");=0A=
-                } else {=0A=
-                  FIXME("This version of opengl does not support =
GL_DOT3\n");=0A=
-                }=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_LERP:=0A=
-                glTexEnvi(GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE));=0A=
-                checkGLcall("GL_TEXTURE_ENV, comb_target, =
useext(GL_INTERPOLATE)");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src1_target, src2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);=0A=
-                checkGLcall("GL_TEXTURE_ENV, src2_target, src3");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);=0A=
-                checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");=0A=
-                glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                break;=0A=
-        case WINED3DTOP_ADDSMOOTH:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                  switch (opr1) {=0A=
-                  case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; =
break;=0A=
-                  case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; =
break;=0A=
-                  case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
-                  case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
-                  }=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, =
GL_TEXTURE");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, =
GL_ONE_MINUS_SRC_ALPHA);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, =
GL_ONE_MINUS_SRC_APHA");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                  switch (opr1) {=0A=
-                  case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-                  case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-                  case GL_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
-                  case GL_ONE_MINUS_SRC_ALPHA: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-                  }=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
-                  switch (opr1) {=0A=
-                  case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-                  case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-                  case GL_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
-                  case GL_ONE_MINUS_SRC_ALPHA: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-                  }=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                  switch (opr1) {=0A=
-                  case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
-                  case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_ALPHA; =
break;=0A=
-                  case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
-                  case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
-                  }=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                  switch (opr1) {=0A=
-                  case GL_SRC_COLOR: opr =3D GL_ONE_MINUS_SRC_COLOR; =
break;=0A=
-                  case GL_ONE_MINUS_SRC_COLOR: opr =3D GL_SRC_COLOR; =
break;=0A=
-                  case GL_SRC_ALPHA: opr =3D GL_ONE_MINUS_SRC_ALPHA; =
break;=0A=
-                  case GL_ONE_MINUS_SRC_ALPHA: opr =3D GL_SRC_ALPHA; =
break;=0A=
-                  }=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src1");=0A=
-                  switch (opr1) {=0A=
-                  case GL_SRC_COLOR: opr =3D GL_SRC_ALPHA; break;=0A=
-                  case GL_ONE_MINUS_SRC_COLOR: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-                  case GL_SRC_ALPHA: opr =3D GL_SRC_ALPHA; break;=0A=
-                  case GL_ONE_MINUS_SRC_ALPHA: opr =3D =
GL_ONE_MINUS_SRC_ALPHA; break;=0A=
-                  }=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_MULTIPLYADD:=0A=
-                if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, comb_target, =
GL_MODULATE_ADD_ATI");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src1_target, src3);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src1_target, src3");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr3);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr1_target, opr3");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, src2_target, src2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-                  glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);=0A=
-                  checkGLcall("GL_TEXTURE_ENV, scal_target, 1");=0A=
-                } else=0A=
-                  Handled =3D FALSE;=0A=
-                break;=0A=
-        case WINED3DTOP_BUMPENVMAPLUMINANCE:=0A=
-                if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {=0A=
-                    /* Some apps use BUMPENVMAPLUMINANCE instead of =
D3DTOP_BUMPENVMAP, although=0A=
-                     * they check for the non-luminance cap flag. Well, =
give them what they asked=0A=
-                     * for :-)=0A=
-                     */=0A=
-                    WARN("Application uses =
WINED3DTOP_BUMPENVMAPLUMINANCE\n");=0A=
-                } else {=0A=
-                    Handled =3D FALSE;=0A=
-                    break;=0A=
-                }=0A=
-                /* Fall through */=0A=
-        case WINED3DTOP_BUMPENVMAP:=0A=
-                if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {=0A=
-                    TRACE("Using ati bumpmap on stage %d, target %d\n", =
Stage, Stage + 1);=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_BUMP_ENVMAP_ATI);=0A=
-                    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, comb_target, =
GL_BUMP_ENVMAP_ATI)");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, =
GL_TEXTURE0_ARB + Stage + 1);=0A=
-                    checkGLcall("glTexEnvi(GL_TEXTURE_ENV, =
GL_BUMP_TARGET_ATI, GL_TEXTURE0_ARB + Stage + 1)");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);=0A=
-                    checkGLcall("GL_TEXTURE_ENV, src0_target, src3");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);=0A=
-                    checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);=0A=
-                    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);=0A=
-                    checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);=0A=
-                    checkGLcall("GL_TEXTURE_ENV, src0_target, src1");=0A=
-                    glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);=0A=
-                    checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");=0A=
-=0A=
-                    Handled =3D TRUE;=0A=
-                    break;=0A=
-                } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {=0A=
-                    /* Technically texture shader support without =
register combiners is possible, but not expected to occur=0A=
-                     * on real world cards, so for now a fixme should =
be enough=0A=
-                     */=0A=
-                    FIXME("Implement bump mapping with =
GL_NV_texture_shader in non register combiner path\n");=0A=
-                }=0A=
-        default:=0A=
-                Handled =3D FALSE;=0A=
-        }=0A=
-=0A=
-        if (Handled) {=0A=
-          BOOL  combineOK =3D TRUE;=0A=
-          if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {=0A=
-            DWORD op2;=0A=
-=0A=
-            if (isAlpha) {=0A=
-              op2 =3D =
This->stateBlock->textureState[Stage][WINED3DTSS_COLOROP];=0A=
-            } else {=0A=
-              op2 =3D =
This->stateBlock->textureState[Stage][WINED3DTSS_ALPHAOP];=0A=
-            }=0A=
-=0A=
-            /* Note: If COMBINE4 in effect can't go back to combine! */=0A=
-            switch (op2) {=0A=
-            case WINED3DTOP_ADDSMOOTH:=0A=
-            case WINED3DTOP_BLENDTEXTUREALPHAPM:=0A=
-            case WINED3DTOP_MODULATEALPHA_ADDCOLOR:=0A=
-            case WINED3DTOP_MODULATECOLOR_ADDALPHA:=0A=
-            case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:=0A=
-            case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:=0A=
-            case WINED3DTOP_MULTIPLYADD:=0A=
-              /* Ignore those implemented in both cases */=0A=
-              switch (op) {=0A=
-              case WINED3DTOP_SELECTARG1:=0A=
-              case WINED3DTOP_SELECTARG2:=0A=
-                combineOK =3D FALSE;=0A=
-                Handled   =3D FALSE;=0A=
-                break;=0A=
-              default:=0A=
-                FIXME("Can't use COMBINE4 and COMBINE together, =
thisop=3D%s, otherop=3D%s, isAlpha(%d)\n", debug_d3dtop(op), =
debug_d3dtop(op2), isAlpha);=0A=
-                return;=0A=
-              }=0A=
-            }=0A=
-          }=0A=
-=0A=
-          if (combineOK) {=0A=
-            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
useext(GL_COMBINE));=0A=
-            checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, =
useext(GL_COMBINE)");=0A=
-=0A=
-            return;=0A=
-          }=0A=
-        }=0A=
-=0A=
-        /* After all the extensions, if still unhandled, report fixme */=0A=
-        FIXME("Unhandled texture operation %s\n", debug_d3dtop(op));=0A=
-#undef GLINFO_LOCATION=0A=
-}=0A=
-=0A=
 /* Setup this textures matrix according to the texture flags*/=0A=
 void set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype)=0A=
 {=0A=
@@ -2701,6 +1210,7 @@ void set_texture_matrix(const float *smat, DWORD =
flags, BOOL calculatedCoords, B=0A=
     glLoadMatrixf(mat);=0A=
     checkGLcall("glLoadMatrixf(mat)");=0A=
 }=0A=
+#undef GLINFO_LOCATION=0A=
 =0A=
 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info=0A=
 =0A=
diff --git a/dlls/wined3d/wined3d_private.h =
b/dlls/wined3d/wined3d_private.h=0A=
index fdbb4a3..61b2983 100644=0A=
--- a/dlls/wined3d/wined3d_private.h=0A=
+++ b/dlls/wined3d/wined3d_private.h=0A=
@@ -1730,11 +1730,12 @@ const char *debug_fbostatus(GLenum status);=0A=
 const char *debug_glerror(GLenum error);=0A=
 const char *debug_d3dbasis(WINED3DBASISTYPE basis);=0A=
 const char *debug_d3ddegree(WINED3DDEGREETYPE order);=0A=
+const char* debug_d3dtop(WINED3DTEXTUREOP d3dtop);=0A=
 =0A=
 /* Routines for GL <-> D3D values */=0A=
 GLenum StencilOp(DWORD op);=0A=
 GLenum CompareFunc(DWORD func);=0A=
-void   set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);=0A=
+BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);=0A=
 void   set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, =
WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT =
texture_idx, DWORD dst);=0A=
 void   set_texture_matrix(const float *smat, DWORD flags, BOOL =
calculatedCoords, BOOL transformed, DWORD coordtype);=0A=
 void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl =
*stateblock, WineD3DContext *context);=0A=
-- =0A=
1.5.4.5=0A=
=0A=

------=_NextPart_000_0001_01C8EB1E.D4B3D280--




More information about the wine-patches mailing list