Fix gcc 4.0 -Wpointer-sign warnings.
[wine] / dlls / wined3d / utils.c
1 /*
2  * Utility functions for the WineD3D Library
3  *
4  * Copyright 2002-2004 Jason Edmeades
5  * Copyright 2003-2004 Raphael Junqueira
6  * Copyright 2004 Christian Costa
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22
23 #include "config.h"
24 #include "wined3d_private.h"
25
26 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
27
28 /*****************************************************************************
29  * Trace formatting of useful values
30  */
31 const char* debug_d3dformat(D3DFORMAT fmt) {
32   switch (fmt) {
33 #define FMT_TO_STR(fmt) case fmt: return #fmt
34     FMT_TO_STR(WINED3DFMT_UNKNOWN);
35     FMT_TO_STR(WINED3DFMT_R8G8B8);
36     FMT_TO_STR(WINED3DFMT_A8R8G8B8);
37     FMT_TO_STR(WINED3DFMT_X8R8G8B8);
38     FMT_TO_STR(WINED3DFMT_R5G6B5);
39     FMT_TO_STR(WINED3DFMT_X1R5G5B5);
40     FMT_TO_STR(WINED3DFMT_A1R5G5B5);
41     FMT_TO_STR(WINED3DFMT_A4R4G4B4);
42     FMT_TO_STR(WINED3DFMT_R3G3B2);
43     FMT_TO_STR(WINED3DFMT_A8);   
44     FMT_TO_STR(WINED3DFMT_A8R3G3B2);
45     FMT_TO_STR(WINED3DFMT_X4R4G4B4);
46     FMT_TO_STR(WINED3DFMT_G16R16);
47     FMT_TO_STR(WINED3DFMT_A2R10G10B10);
48     FMT_TO_STR(WINED3DFMT_A16B16G16R16);    
49     FMT_TO_STR(WINED3DFMT_A8P8);
50     FMT_TO_STR(WINED3DFMT_P8);
51     FMT_TO_STR(WINED3DFMT_L8);
52     FMT_TO_STR(WINED3DFMT_A8L8);
53     FMT_TO_STR(WINED3DFMT_A4L4);
54     FMT_TO_STR(WINED3DFMT_V8U8);
55     FMT_TO_STR(WINED3DFMT_L6V5U5);
56     FMT_TO_STR(WINED3DFMT_X8L8V8U8);
57     FMT_TO_STR(WINED3DFMT_Q8W8V8U8);
58     FMT_TO_STR(WINED3DFMT_V16U16);
59     FMT_TO_STR(WINED3DFMT_W11V11U10);
60     FMT_TO_STR(WINED3DFMT_A2W10V10U10);    
61     FMT_TO_STR(WINED3DFMT_UYVY);
62     FMT_TO_STR(WINED3DFMT_YUY2);
63     FMT_TO_STR(WINED3DFMT_DXT1);
64     FMT_TO_STR(WINED3DFMT_DXT2);
65     FMT_TO_STR(WINED3DFMT_DXT3);
66     FMT_TO_STR(WINED3DFMT_DXT4);
67     FMT_TO_STR(WINED3DFMT_DXT5);
68     FMT_TO_STR(WINED3DFMT_MULTI2_ARGB);
69     FMT_TO_STR(WINED3DFMT_G8R8_G8B8);
70     FMT_TO_STR(WINED3DFMT_R8G8_B8G8);
71     FMT_TO_STR(WINED3DFMT_D16_LOCKABLE);
72     FMT_TO_STR(WINED3DFMT_D32);
73     FMT_TO_STR(WINED3DFMT_D15S1);
74     FMT_TO_STR(WINED3DFMT_D24S8);
75     FMT_TO_STR(WINED3DFMT_D24X8);
76     FMT_TO_STR(WINED3DFMT_D24X4S4);
77     FMT_TO_STR(WINED3DFMT_D16);
78     FMT_TO_STR(WINED3DFMT_D32F_LOCKABLE);
79     FMT_TO_STR(WINED3DFMT_VERTEXDATA);
80     FMT_TO_STR(WINED3DFMT_INDEX16);
81     FMT_TO_STR(WINED3DFMT_INDEX32);
82     FMT_TO_STR(WINED3DFMT_Q16W16V16U16);
83     FMT_TO_STR(WINED3DFMT_R16F);
84     FMT_TO_STR(WINED3DFMT_G16R16F);
85     FMT_TO_STR(WINED3DFMT_A16B16G16R16F);
86 #undef FMT_TO_STR
87   default:
88     FIXME("Unrecognized %u D3DFORMAT!\n", fmt);
89     return "unrecognized";
90   }
91 }
92
93 const char* debug_d3ddevicetype(D3DDEVTYPE devtype) {
94   switch (devtype) {
95 #define DEVTYPE_TO_STR(dev) case dev: return #dev
96     DEVTYPE_TO_STR(D3DDEVTYPE_HAL);
97     DEVTYPE_TO_STR(D3DDEVTYPE_REF);
98     DEVTYPE_TO_STR(D3DDEVTYPE_SW);    
99 #undef DEVTYPE_TO_STR
100   default:
101     FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype);
102     return "unrecognized";
103   }
104 }
105
106 const char* debug_d3dusage(DWORD usage) {
107   switch (usage) {
108 #define D3DUSAGE_TO_STR(u) case u: return #u
109     D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET);
110     D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL);
111     D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY);
112     D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING);
113     D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP);
114     D3DUSAGE_TO_STR(D3DUSAGE_POINTS);
115     D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES);
116     D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES);
117     D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC);
118 #undef D3DUSAGE_TO_STR
119   case 0: return "none";
120   default:
121     FIXME("Unrecognized %lu Usage!\n", usage);
122     return "unrecognized";
123   }
124 }
125
126 const char* debug_d3dresourcetype(D3DRESOURCETYPE res) {
127   switch (res) {
128 #define RES_TO_STR(res) case res: return #res;
129     RES_TO_STR(D3DRTYPE_SURFACE);
130     RES_TO_STR(D3DRTYPE_VOLUME);
131     RES_TO_STR(D3DRTYPE_TEXTURE);
132     RES_TO_STR(D3DRTYPE_VOLUMETEXTURE);
133     RES_TO_STR(D3DRTYPE_CUBETEXTURE);
134     RES_TO_STR(D3DRTYPE_VERTEXBUFFER);
135     RES_TO_STR(D3DRTYPE_INDEXBUFFER);
136 #undef  RES_TO_STR
137   default:
138     FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res);
139     return "unrecognized";
140   }
141 }
142
143 const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) {
144   switch (PrimitiveType) {
145 #define PRIM_TO_STR(prim) case prim: return #prim;
146     PRIM_TO_STR(D3DPT_POINTLIST);
147     PRIM_TO_STR(D3DPT_LINELIST);
148     PRIM_TO_STR(D3DPT_LINESTRIP);
149     PRIM_TO_STR(D3DPT_TRIANGLELIST);
150     PRIM_TO_STR(D3DPT_TRIANGLESTRIP);
151     PRIM_TO_STR(D3DPT_TRIANGLEFAN);
152 #undef  PRIM_TO_STR
153   default:
154     FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
155     return "unrecognized";
156   }
157 }
158
159 const char* debug_d3drenderstate(DWORD state) {
160   switch (state) {
161 #define D3DSTATE_TO_STR(u) case u: return #u
162     D3DSTATE_TO_STR(WINED3DRS_ZENABLE                   );
163     D3DSTATE_TO_STR(WINED3DRS_FILLMODE                  );
164     D3DSTATE_TO_STR(WINED3DRS_SHADEMODE                 );
165     D3DSTATE_TO_STR(WINED3DRS_LINEPATTERN               );
166     D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE              );
167     D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE           );
168     D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL                 );
169     D3DSTATE_TO_STR(WINED3DRS_SRCBLEND                  );
170     D3DSTATE_TO_STR(WINED3DRS_DESTBLEND                 );
171     D3DSTATE_TO_STR(WINED3DRS_CULLMODE                  );
172     D3DSTATE_TO_STR(WINED3DRS_ZFUNC                     );
173     D3DSTATE_TO_STR(WINED3DRS_ALPHAREF                  );
174     D3DSTATE_TO_STR(WINED3DRS_ALPHAFUNC                 );
175     D3DSTATE_TO_STR(WINED3DRS_DITHERENABLE              );
176     D3DSTATE_TO_STR(WINED3DRS_ALPHABLENDENABLE          );
177     D3DSTATE_TO_STR(WINED3DRS_FOGENABLE                 );
178     D3DSTATE_TO_STR(WINED3DRS_SPECULARENABLE            );
179     D3DSTATE_TO_STR(WINED3DRS_ZVISIBLE                  );
180     D3DSTATE_TO_STR(WINED3DRS_FOGCOLOR                  );
181     D3DSTATE_TO_STR(WINED3DRS_FOGTABLEMODE              );
182     D3DSTATE_TO_STR(WINED3DRS_FOGSTART                  );
183     D3DSTATE_TO_STR(WINED3DRS_FOGEND                    );
184     D3DSTATE_TO_STR(WINED3DRS_FOGDENSITY                );
185     D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS             );
186     D3DSTATE_TO_STR(WINED3DRS_ZBIAS                     );
187     D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE            );
188     D3DSTATE_TO_STR(WINED3DRS_STENCILENABLE             );
189     D3DSTATE_TO_STR(WINED3DRS_STENCILFAIL               );
190     D3DSTATE_TO_STR(WINED3DRS_STENCILZFAIL              );
191     D3DSTATE_TO_STR(WINED3DRS_STENCILPASS               );
192     D3DSTATE_TO_STR(WINED3DRS_STENCILFUNC               );
193     D3DSTATE_TO_STR(WINED3DRS_STENCILREF                );
194     D3DSTATE_TO_STR(WINED3DRS_STENCILMASK               );
195     D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK          );
196     D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR             );
197     D3DSTATE_TO_STR(WINED3DRS_WRAP0                     );
198     D3DSTATE_TO_STR(WINED3DRS_WRAP1                     );
199     D3DSTATE_TO_STR(WINED3DRS_WRAP2                     );
200     D3DSTATE_TO_STR(WINED3DRS_WRAP3                     );
201     D3DSTATE_TO_STR(WINED3DRS_WRAP4                     );
202     D3DSTATE_TO_STR(WINED3DRS_WRAP5                     );
203     D3DSTATE_TO_STR(WINED3DRS_WRAP6                     );
204     D3DSTATE_TO_STR(WINED3DRS_WRAP7                     );
205     D3DSTATE_TO_STR(WINED3DRS_CLIPPING                  );
206     D3DSTATE_TO_STR(WINED3DRS_LIGHTING                  );
207     D3DSTATE_TO_STR(WINED3DRS_AMBIENT                   );
208     D3DSTATE_TO_STR(WINED3DRS_FOGVERTEXMODE             );
209     D3DSTATE_TO_STR(WINED3DRS_COLORVERTEX               );
210     D3DSTATE_TO_STR(WINED3DRS_LOCALVIEWER               );
211     D3DSTATE_TO_STR(WINED3DRS_NORMALIZENORMALS          );
212     D3DSTATE_TO_STR(WINED3DRS_DIFFUSEMATERIALSOURCE     );
213     D3DSTATE_TO_STR(WINED3DRS_SPECULARMATERIALSOURCE    );
214     D3DSTATE_TO_STR(WINED3DRS_AMBIENTMATERIALSOURCE     );
215     D3DSTATE_TO_STR(WINED3DRS_EMISSIVEMATERIALSOURCE    );
216     D3DSTATE_TO_STR(WINED3DRS_VERTEXBLEND               );
217     D3DSTATE_TO_STR(WINED3DRS_CLIPPLANEENABLE           );
218     D3DSTATE_TO_STR(WINED3DRS_SOFTWAREVERTEXPROCESSING  );
219     D3DSTATE_TO_STR(WINED3DRS_POINTSIZE                 );
220     D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MIN             );
221     D3DSTATE_TO_STR(WINED3DRS_POINTSPRITEENABLE         );
222     D3DSTATE_TO_STR(WINED3DRS_POINTSCALEENABLE          );
223     D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_A              );
224     D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_B              );
225     D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_C              );
226     D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEANTIALIAS      );
227     D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEMASK           );
228     D3DSTATE_TO_STR(WINED3DRS_PATCHEDGESTYLE            );
229     D3DSTATE_TO_STR(WINED3DRS_PATCHSEGMENTS             );
230     D3DSTATE_TO_STR(WINED3DRS_DEBUGMONITORTOKEN         );
231     D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MAX             );
232     D3DSTATE_TO_STR(WINED3DRS_INDEXEDVERTEXBLENDENABLE  );
233     D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE          );
234     D3DSTATE_TO_STR(WINED3DRS_TWEENFACTOR               );
235     D3DSTATE_TO_STR(WINED3DRS_BLENDOP                   );
236     D3DSTATE_TO_STR(WINED3DRS_POSITIONORDER             );
237     D3DSTATE_TO_STR(WINED3DRS_NORMALORDER               );
238 #undef D3DSTATE_TO_STR
239   default:
240     FIXME("Unrecognized %lu render state!\n", state);
241     return "unrecognized";
242   }
243 }
244
245 const char* debug_d3dsamplerstate(DWORD state) {
246   switch (state) {
247 #define D3DSTATE_TO_STR(u) case u: return #u
248     D3DSTATE_TO_STR(WINED3DSAMP_BORDERCOLOR  );
249     D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSU     );
250     D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSV     );
251     D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSW     );
252     D3DSTATE_TO_STR(WINED3DSAMP_MAGFILTER    );
253     D3DSTATE_TO_STR(WINED3DSAMP_MINFILTER    );
254     D3DSTATE_TO_STR(WINED3DSAMP_MIPFILTER    );
255     D3DSTATE_TO_STR(WINED3DSAMP_MIPMAPLODBIAS);
256     D3DSTATE_TO_STR(WINED3DSAMP_MAXMIPLEVEL  );
257     D3DSTATE_TO_STR(WINED3DSAMP_MAXANISOTROPY);
258 #undef D3DSTATE_TO_STR
259   default:
260     FIXME("Unrecognized %lu texture state!\n", state);
261     return "unrecognized";
262   }
263 }
264
265 const char* debug_d3dtexturestate(DWORD state) {
266   switch (state) {
267 #define D3DSTATE_TO_STR(u) case u: return #u
268     D3DSTATE_TO_STR(WINED3DTSS_COLOROP               );
269     D3DSTATE_TO_STR(WINED3DTSS_COLORARG1             );
270     D3DSTATE_TO_STR(WINED3DTSS_COLORARG2             );
271     D3DSTATE_TO_STR(WINED3DTSS_ALPHAOP               );
272     D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG1             );
273     D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG2             );
274     D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT00          );
275     D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT01          );
276     D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT10          );
277     D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT11          );
278     D3DSTATE_TO_STR(WINED3DTSS_TEXCOORDINDEX         );
279     D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLSCALE         );
280     D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLOFFSET        );
281     D3DSTATE_TO_STR(WINED3DTSS_TEXTURETRANSFORMFLAGS );
282     D3DSTATE_TO_STR(WINED3DTSS_ADDRESSW              );
283     D3DSTATE_TO_STR(WINED3DTSS_COLORARG0             );
284     D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG0             );
285     D3DSTATE_TO_STR(WINED3DTSS_RESULTARG             );
286 #undef D3DSTATE_TO_STR
287   case 12:
288     /* Note D3DTSS are not consecutive, so skip these */
289     return "unused";
290     break;
291   default:
292     FIXME("Unrecognized %lu texture state!\n", state);
293     return "unrecognized";
294   }
295 }
296
297 const char* debug_d3dpool(D3DPOOL Pool) {
298   switch (Pool) {
299 #define POOL_TO_STR(p) case p: return #p;
300     POOL_TO_STR(D3DPOOL_DEFAULT);
301     POOL_TO_STR(D3DPOOL_MANAGED);
302     POOL_TO_STR(D3DPOOL_SYSTEMMEM);
303     POOL_TO_STR(D3DPOOL_SCRATCH);
304 #undef  POOL_TO_STR
305   default:
306     FIXME("Unrecognized %u D3DPOOL!\n", Pool);
307     return "unrecognized";
308   }
309 }
310 /*****************************************************************************
311  * Useful functions mapping GL <-> D3D values
312  */
313 GLenum StencilOp(DWORD op) {
314     switch(op) {                
315     case D3DSTENCILOP_KEEP    : return GL_KEEP;
316     case D3DSTENCILOP_ZERO    : return GL_ZERO;
317     case D3DSTENCILOP_REPLACE : return GL_REPLACE;
318     case D3DSTENCILOP_INCRSAT : return GL_INCR;
319     case D3DSTENCILOP_DECRSAT : return GL_DECR;
320     case D3DSTENCILOP_INVERT  : return GL_INVERT; 
321     case D3DSTENCILOP_INCR    : return GL_INCR_WRAP_EXT;
322     case D3DSTENCILOP_DECR    : return GL_DECR_WRAP_EXT;
323     default:
324         FIXME("Invalid stencil op %ld\n", op);
325         return GL_ALWAYS;
326     }
327 }
328
329 /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
330 #if defined (GL_VERSION_1_3)
331 # define useext(A) A
332 # define combine_ext 1
333 #elif defined (GL_EXT_texture_env_combine)
334 # define useext(A) A##_EXT
335 # define combine_ext 1
336 #elif defined (GL_ARB_texture_env_combine)
337 # define useext(A) A##_ARB
338 # define combine_ext 1
339 #else
340 # undef combine_ext
341 #endif
342
343 #if !defined(combine_ext)
344 void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
345
346         FIXME("Requires opengl combine extensions to work\n");
347         return;
348 }
349 #else
350 /* Setup the texture operations texture stage states */
351 void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
352 {
353 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
354         GLenum src1, src2, src3;
355         GLenum opr1, opr2, opr3;
356         GLenum comb_target;
357         GLenum src0_target, src1_target, src2_target;
358         GLenum opr0_target, opr1_target, opr2_target;
359         GLenum scal_target;
360         GLenum opr=0, invopr, src3_target, opr3_target;
361         BOOL Handled = FALSE;
362         IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
363
364         TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);
365
366         ENTER_GL();
367
368         /* Note: Operations usually involve two ars, src0 and src1 and are operations of
369            the form (a1 <operation> a2). However, some of the more complex operations
370            take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added  
371            in a third parameter called a0. Therefore these are operations of the form
372            a0 <operation> a1 <operation> a2, ie the new parameter goes to the front.
373            
374            However, below we treat the new (a0) parameter as src2/opr2, so in the actual
375            functions below, expect their syntax to differ slightly to those listed in the
376            manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2
377            This affects D3DTOP_MULTIPLYADD and D3DTOP_LERP                               */
378            
379         if (isAlpha) {
380                 comb_target = useext(GL_COMBINE_ALPHA);
381                 src0_target = useext(GL_SOURCE0_ALPHA);
382                 src1_target = useext(GL_SOURCE1_ALPHA);
383                 src2_target = useext(GL_SOURCE2_ALPHA);
384                 opr0_target = useext(GL_OPERAND0_ALPHA);
385                 opr1_target = useext(GL_OPERAND1_ALPHA);
386                 opr2_target = useext(GL_OPERAND2_ALPHA);
387                 scal_target = GL_ALPHA_SCALE;
388         }
389         else {
390                 comb_target = useext(GL_COMBINE_RGB);
391                 src0_target = useext(GL_SOURCE0_RGB);
392                 src1_target = useext(GL_SOURCE1_RGB);
393                 src2_target = useext(GL_SOURCE2_RGB);
394                 opr0_target = useext(GL_OPERAND0_RGB);
395                 opr1_target = useext(GL_OPERAND1_RGB);
396                 opr2_target = useext(GL_OPERAND2_RGB);
397                 scal_target = useext(GL_RGB_SCALE);
398         }
399
400         /* From MSDN (WINED3DTSS_ALPHAARG1) :
401            The default argument is D3DTA_TEXTURE. If no texture is set for this stage, 
402                    then the default argument is D3DTA_DIFFUSE.
403                    FIXME? If texture added/removed, may need to reset back as well?    */
404         if (isAlpha && This->stateBlock->textures[Stage] == NULL && arg1 == D3DTA_TEXTURE) {
405             GetSrcAndOpFromValue(D3DTA_DIFFUSE, isAlpha, &src1, &opr1);  
406         } else {
407             GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1);
408         }
409         GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2);
410         GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3);
411         
412         TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);
413
414         Handled = TRUE; /* Assume will be handled */
415
416         /* Other texture operations require special extensions: */
417         if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
418           if (isAlpha) {
419             opr = GL_SRC_ALPHA;
420             invopr = GL_ONE_MINUS_SRC_ALPHA;
421             src3_target = GL_SOURCE3_ALPHA_NV;
422             opr3_target = GL_OPERAND3_ALPHA_NV;
423           } else {
424             opr = GL_SRC_COLOR;
425             invopr = GL_ONE_MINUS_SRC_COLOR;
426             src3_target = GL_SOURCE3_RGB_NV;
427             opr3_target = GL_OPERAND3_RGB_NV;
428           }
429           switch (op) {
430           case D3DTOP_DISABLE: /* Only for alpha */
431             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
432             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
433             glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
434             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
435             glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
436             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
437             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);    
438             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
439             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);              
440             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
441             glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);             
442             checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
443             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
444             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");  
445             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);             
446             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
447             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
448             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");  
449             break;
450           case D3DTOP_SELECTARG1:                                          /* = a1 * 1 + 0 * 0 */
451           case D3DTOP_SELECTARG2:                                          /* = a2 * 1 + 0 * 0 */
452             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
453             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
454             if (op == D3DTOP_SELECTARG1) {
455               glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);                
456               checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
457               glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);        
458               checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");  
459             } else {
460               glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);                
461               checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
462               glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);        
463               checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");  
464             }
465             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);             
466             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
467             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);              
468             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
469             glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);             
470             checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
471             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
472             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");  
473             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);             
474             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
475             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
476             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");  
477             break;
478             
479           case D3DTOP_MODULATE:
480             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
481             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
482             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);    
483             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
484             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
485             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
486             glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
487             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
488             glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);      
489             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
490             glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); 
491             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
492             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
493             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
494             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
495             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
496             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
497             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
498             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
499             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
500             break;
501           case D3DTOP_MODULATE2X:
502             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
503             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
504             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);    
505             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
506             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
507             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
508             glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
509             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
510             glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);      
511             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
512             glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); 
513             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
514             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
515             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
516             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
517             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
518             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
519             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
520             glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
521             checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
522             break;
523           case D3DTOP_MODULATE4X:
524             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
525             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
526             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);    
527             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
528             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
529             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
530             glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
531             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
532             glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);      
533             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
534             glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO); 
535             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
536             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
537             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
538             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
539             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
540             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
541             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
542             glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
543             checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
544             break;
545
546           case D3DTOP_ADD:
547             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
548             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
549             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
550             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
551             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
552             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
553             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
554             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
555             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
556             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
557             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
558             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
559             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
560             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
561             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
562             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
563             glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
564             checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
565             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
566             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
567             break;
568
569           case D3DTOP_ADDSIGNED:
570             glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
571             checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
572             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
573             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
574             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
575             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
576             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
577             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
578             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
579             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
580             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
581             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
582             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
583             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
584             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
585             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
586             glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
587             checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
588             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
589             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
590             break;
591
592           case D3DTOP_ADDSIGNED2X:
593             glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
594             checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
595             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
596             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
597             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
598             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
599             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
600             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
601             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
602             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
603             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
604             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
605             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
606             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
607             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
608             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
609             glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
610             checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
611             glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
612             checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
613             break;
614
615           case D3DTOP_ADDSMOOTH:
616             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
617             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
618             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
619             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
620             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
621             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
622             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
623             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
624             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
625             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
626             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
627             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
628             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
629             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
630             glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
631             checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
632             switch (opr1) {
633             case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
634             case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
635             case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
636             case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
637             }
638             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
639             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
640             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
641             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
642             break;
643
644           case D3DTOP_BLENDDIFFUSEALPHA:
645             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
646             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
647             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
648             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
649             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
650             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
651             glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR));
652             checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)");
653             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
654             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
655             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
656             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
657             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
658             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
659             glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR));
660             checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)");
661             glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
662             checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
663             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
664             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
665             break;
666           case D3DTOP_BLENDTEXTUREALPHA:
667             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
668             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
669             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
670             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
671             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
672             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
673             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);
674             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");
675             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
676             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
677             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
678             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
679             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
680             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
681             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
682             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
683             glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
684             checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
685             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
686             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
687             break;
688           case D3DTOP_BLENDFACTORALPHA:
689             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
690             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
691             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
692             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
693             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
694             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
695             glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT));
696             checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)");
697             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
698             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
699             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
700             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
701             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
702             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
703             glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT));
704             checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)");
705             glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
706             checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
707             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
708             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
709             break;
710           case D3DTOP_BLENDTEXTUREALPHAPM:
711             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
712             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
713             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
714             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
715             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
716             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
717             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
718             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
719             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
720             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
721             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
722             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
723             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
724             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
725             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
726             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
727             glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
728             checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
729             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
730             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
731             break;
732           case D3DTOP_MODULATEALPHA_ADDCOLOR:
733             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
734             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");  /* Add = a0*a1 + a2*a3 */
735             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);        /*   a0 = src1/opr1    */
736             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
737             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
738             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");    /*   a1 = 1 (see docs) */
739             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
740             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
741             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);      
742             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");  
743             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);        /*   a2 = arg2         */
744             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
745             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
746             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");     /*  a3 = src1 alpha   */
747             glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
748             checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
749             switch (opr) {
750             case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
751             case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
752             }
753             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
754             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
755             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
756             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
757             break;
758           case D3DTOP_MODULATECOLOR_ADDALPHA:
759             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
760             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
761             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
762             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
763             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
764             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
765             glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
766             checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
767             glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
768             checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
769             glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
770             checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
771             switch (opr1) {
772             case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
773             case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
774             }
775             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
776             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
777             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
778             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
779             glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
780             checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
781             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
782             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
783             break;
784           case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
785             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
786             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
787             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
788             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
789             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
790             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
791             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
792             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
793             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
794             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
795             glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
796             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
797             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
798             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
799             glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
800             checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
801             switch (opr1) {
802             case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
803             case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
804             case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
805             case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
806             }
807             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
808             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
809             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
810             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
811             break;
812           case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
813             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
814             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
815             glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
816             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
817             switch (opr1) {
818             case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
819             case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
820             case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
821             case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
822             }
823             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
824             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
825             glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
826             checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
827             glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
828             checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
829             glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
830             checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
831             switch (opr1) {
832             case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
833             case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
834             }
835             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
836             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
837             glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
838             checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
839             glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
840             checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
841             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
842             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
843             break;
844           case D3DTOP_MULTIPLYADD:
845             glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
846             checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
847             glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
848             checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
849             glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
850             checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
851             glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
852             checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
853             glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
854             checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
855             glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
856             checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
857             glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
858             checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
859             glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
860             checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
861             glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
862             checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
863             glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
864             checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
865             break;
866             
867           case D3DTOP_BUMPENVMAP:
868             {
869               if (GL_SUPPORT(NV_TEXTURE_SHADER)) {
870                 /*
871                   texture unit 0: GL_TEXTURE_2D
872                   texture unit 1: GL_DOT_PRODUCT_NV
873                   texture unit 2: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV
874                   texture unit 3: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV
875                 */
876                 float m[2][2];
877                 
878                 union {
879                   float f;
880                   DWORD d;
881                 } tmpvalue;
882                 
883                 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT00];
884                 m[0][0] = tmpvalue.f;
885                 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT01];
886                 m[0][1] = tmpvalue.f;
887                 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT10];
888                 m[1][0] = tmpvalue.f;
889                 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT11];
890                 m[1][1] = tmpvalue.f;
891                 
892                 /*FIXME("Stage %d matrix is (%.2f,%.2f),(%.2f,%.2f)\n", Stage, m[0][0], m[0][1], m[1][0], m[1][0]);*/
893
894                 if (FALSE == This->texture_shader_active) {
895                   This->texture_shader_active = TRUE;
896                   glEnable(GL_TEXTURE_SHADER_NV);
897                 }
898
899                 /*
900                 glEnable(GL_REGISTER_COMBINERS_NV);
901                 glCombinerParameteriNV (GL_NUM_GENERAL_COMBINERS_NV, 1);
902                 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
903                 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
904                 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
905                 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
906                 glCombinerOutputNV (GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
907                 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
908                 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
909                 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
910                 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
911                 glCombinerOutputNV (GL_COMBINER0_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
912                 glDisable (GL_PER_STAGE_CONSTANTS_NV);
913                 glCombinerParameteriNV (GL_COLOR_SUM_CLAMP_NV, 0);
914                 glFinalCombinerInputNV (GL_VARIABLE_A_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
915                 glFinalCombinerInputNV (GL_VARIABLE_B_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
916                 glFinalCombinerInputNV (GL_VARIABLE_C_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
917                 glFinalCombinerInputNV (GL_VARIABLE_D_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
918                 glFinalCombinerInputNV (GL_VARIABLE_E_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
919                 glFinalCombinerInputNV (GL_VARIABLE_F_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
920                 glFinalCombinerInputNV (GL_VARIABLE_G_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
921                 */
922                 /*
923                 int i;
924                 for (i = 0; i < Stage; i++) {
925                   if (GL_SUPPORT(ARB_MULTITEXTURE)) {
926                     GL_ACTIVETEXTURE(i);
927                     glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
928                     checkGLcall("Activate texture..");
929                   } else if (i>0) {
930                     FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
931                   }
932                 }
933                 */
934                 /*
935                   GL_ACTIVETEXTURE(Stage - 1);
936                   glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
937                 */
938                 /*
939                 GL_ACTIVETEXTURE(Stage);
940                 checkGLcall("Activate texture.. to update const color");
941                 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV);
942                 checkGLcall("glTexEnv");
943                 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + Stage - 1);
944                 checkGLcall("glTexEnv");
945                 glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float*)&m[0]);
946                 checkGLcall("glTexEnv");
947                 */
948                 LEAVE_GL();
949                 return;
950                 break;            
951               }
952             }
953
954           case D3DTOP_BUMPENVMAPLUMINANCE:
955
956           default:
957             Handled = FALSE;
958           }
959           if (Handled) {
960             glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
961             checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
962             
963             LEAVE_GL();
964             return;
965           }
966         } /* GL_NV_texture_env_combine4 */
967         
968         Handled = TRUE; /* Again, assume handled */
969         switch (op) {
970         case D3DTOP_DISABLE: /* Only for alpha */
971                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
972                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
973                 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
974                 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT");
975                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
976                 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA");
977                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
978                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
979                 break;
980         case D3DTOP_SELECTARG1:
981                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
982                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
983                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
984                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
985                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
986                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
987                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
988                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
989                 break;
990         case D3DTOP_SELECTARG2:
991                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
992                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
993                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
994                 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
995                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
996                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
997                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
998                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
999                 break;
1000         case D3DTOP_MODULATE:
1001                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1002                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1003                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1004                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1005                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1006                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1007                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1008                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1009                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1010                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1011                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1012                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1013                 break;
1014         case D3DTOP_MODULATE2X:
1015                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1016                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1017                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1018                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1019                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1020                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1021                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1022                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1023                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1024                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1025                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1026                 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1027                 break;
1028         case D3DTOP_MODULATE4X:
1029                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1030                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1031                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1032                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1033                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1034                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1035                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1036                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1037                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1038                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1039                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
1040                 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
1041                 break;
1042         case D3DTOP_ADD:
1043                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1044                 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1045                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1046                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1047                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1048                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1049                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1050                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1051                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1052                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1053                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1054                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1055                 break;
1056         case D3DTOP_ADDSIGNED:
1057                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1058                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)");
1059                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1060                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1061                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1062                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1063                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1064                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1065                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1066                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1067                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1068                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1069                 break;
1070         case D3DTOP_ADDSIGNED2X:
1071                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1072                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
1073                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1074                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1075                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1076                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1077                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1078                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1079                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1080                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1081                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1082                 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1083                 break;
1084         case D3DTOP_SUBTRACT:
1085           if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {
1086                 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);
1087                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)");
1088                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1089                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1090                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1091                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1092                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1093                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1094                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1095                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1096                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1097                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1098           } else {
1099                 FIXME("This version of opengl does not support GL_SUBTRACT\n");
1100           }
1101           break;
1102
1103         case D3DTOP_BLENDDIFFUSEALPHA:
1104                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1105                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1106                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1107                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1108                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1109                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1110                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1111                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1112                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1113                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1114                 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR));
1115                 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR");
1116                 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1117                 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1118                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1119                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1120                 break;
1121         case D3DTOP_BLENDTEXTUREALPHA:
1122                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1123                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1124                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1125                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1126                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1127                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1128                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1129                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1130                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1131                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1132                 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);
1133                 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");
1134                 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1135                 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1136                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1137                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1138                 break;
1139         case D3DTOP_BLENDFACTORALPHA:
1140                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1141                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1142                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1143                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1144                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1145                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1146                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1147                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1148                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1149                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1150                 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));
1151                 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");
1152                 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1153                 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1154                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1155                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1156                 break;
1157         case D3DTOP_BLENDCURRENTALPHA:
1158                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1159                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1160                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1161                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1162                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1163                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1164                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1165                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1166                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1167                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1168                 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));
1169                 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");
1170                 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1171                 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1172                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1173                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1174                 break;
1175         case D3DTOP_DOTPRODUCT3: 
1176                 if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
1177                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
1178                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
1179                 } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
1180                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
1181                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
1182                 } else {
1183                   FIXME("This version of opengl does not support GL_DOT3\n");
1184                 }
1185                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1186                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1187                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1188                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1189                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1190                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1191                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1192                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1193                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1194                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1195                 break;
1196         case D3DTOP_LERP:
1197                 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1198                 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1199                 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1200                 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1201                 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1202                 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1203                 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1204                 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1205                 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1206                 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1207                 glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);
1208                 checkGLcall("GL_TEXTURE_ENV, src2_target, src3");
1209                 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);
1210                 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");
1211                 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1212                 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1213                 break;
1214         case D3DTOP_ADDSMOOTH:
1215                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1216                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1217                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1218                   glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1219                   checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1220                   switch (opr1) {
1221                   case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1222                   case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1223                   case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1224                   case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1225                   }
1226                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1227                   checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1228                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1229                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1230                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1231                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1232                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1233                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1234                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1235                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1236                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1237                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1238                 } else
1239                   Handled = FALSE;
1240                 break;
1241         case D3DTOP_BLENDTEXTUREALPHAPM:
1242                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1243                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1244                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1245                   glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);
1246                   checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE");
1247                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_ALPHA);
1248                   checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_APHA");
1249                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1250                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1251                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1252                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1253                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1254                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1255                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1256                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1257                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1258                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1259                 } else
1260                   Handled = FALSE;
1261                 break;
1262         case D3DTOP_MODULATEALPHA_ADDCOLOR:
1263                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1264                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1265                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1266                   glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1267                   checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1268                   switch (opr1) {
1269                   case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1270                   case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1271                   case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1272                   case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1273                   }
1274                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1275                   checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1276                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1277                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1278                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1279                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1280                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1281                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1282                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1283                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1284                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1285                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1286                 } else
1287                   Handled = FALSE;
1288                 break;
1289         case D3DTOP_MODULATECOLOR_ADDALPHA:
1290                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1291                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1292                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1293                   glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1294                   checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1295                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1296                   checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1297                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1298                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1299                   switch (opr1) {
1300                   case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1301                   case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1302                   case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1303                   case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1304                   }
1305                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
1306                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
1307                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1308                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1309                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1310                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1311                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1312                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1313                 } else
1314                   Handled = FALSE;
1315                 break;
1316         case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1317                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1318                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1319                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1320                   glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1321                   checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1322                   switch (opr1) {
1323                   case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1324                   case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1325                   case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1326                   case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1327                   }
1328                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1329                   checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1330                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1331                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1332                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1333                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1334                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1335                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1336                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1337                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1338                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1339                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1340                 } else
1341                   Handled = FALSE;
1342                 break;
1343         case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1344                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1345                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1346                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1347                   glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1348                   checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1349                   switch (opr1) {
1350                   case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1351                   case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1352                   case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1353                   case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1354                   }
1355                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1356                   checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1357                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1358                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1359                   switch (opr1) {
1360                   case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1361                   case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1362                   case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1363                   case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1364                   }
1365                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
1366                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
1367                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1368                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1369                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1370                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1371                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1372                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1373                 } else
1374                   Handled = FALSE;
1375                 break;
1376         case D3DTOP_MULTIPLYADD:
1377                 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1378                   glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1379                   checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1380                   glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
1381                   checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
1382                   glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
1383                   checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
1384                   glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1385                   checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1386                   glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1387                   checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1388                   glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1389                   checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1390                   glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1391                   checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1392                   glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1393                   checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1394                 } else
1395                   Handled = FALSE;
1396                 break;
1397         default:
1398                 Handled = FALSE;
1399         }
1400
1401         if (Handled) {
1402           BOOL  combineOK = TRUE;
1403           if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1404             DWORD op2;
1405             
1406             if (isAlpha) {
1407               op2 = This->stateBlock->textureState[Stage][WINED3DTSS_COLOROP];
1408             } else {
1409               op2 = This->stateBlock->textureState[Stage][WINED3DTSS_ALPHAOP];
1410             }
1411             
1412             /* Note: If COMBINE4 in effect can't go back to combine! */
1413             switch (op2) {
1414             case D3DTOP_ADDSMOOTH:
1415             case D3DTOP_BLENDTEXTUREALPHAPM:
1416             case D3DTOP_MODULATEALPHA_ADDCOLOR:
1417             case D3DTOP_MODULATECOLOR_ADDALPHA:
1418             case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1419             case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1420             case D3DTOP_MULTIPLYADD:
1421               /* Ignore those implemented in both cases */
1422               switch (op) {
1423               case D3DTOP_SELECTARG1:
1424               case D3DTOP_SELECTARG2:
1425                 combineOK = FALSE;
1426                 Handled   = FALSE;
1427                 break;
1428               default:
1429                 FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
1430                 LEAVE_GL();
1431                 return;
1432               }
1433             }
1434           }
1435           
1436           if (combineOK) {
1437             glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
1438             checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
1439             
1440             LEAVE_GL();
1441             return;
1442           }
1443         }
1444
1445         LEAVE_GL();
1446         
1447         /* After all the extensions, if still unhandled, report fixme */
1448         FIXME("Unhandled texture operation %d\n", op);
1449         #undef GLINFO_LOCATION 
1450 }
1451 #endif
1452
1453 /* Setup this textures matrix according to the texture flags*/
1454 void set_texture_matrix(const float *smat, DWORD flags)
1455 {
1456     float mat[16];
1457
1458     glMatrixMode(GL_TEXTURE);
1459
1460     if (flags == D3DTTFF_DISABLE) {
1461         glLoadIdentity();
1462         checkGLcall("glLoadIdentity()");
1463         return;
1464     }
1465
1466     if (flags == (D3DTTFF_COUNT1|D3DTTFF_PROJECTED)) {
1467         ERR("Invalid texture transform flags: D3DTTFF_COUNT1|D3DTTFF_PROJECTED\n");
1468         checkGLcall("glLoadIdentity()");
1469         return;
1470     }
1471
1472     memcpy(mat, smat, 16*sizeof(float));
1473
1474     switch (flags & ~D3DTTFF_PROJECTED) {
1475     case D3DTTFF_COUNT1: mat[1] = mat[5] = mat[9] = mat[13] = 0;
1476     case D3DTTFF_COUNT2: mat[2] = mat[6] = mat[10] = mat[14] = 0;
1477     default: mat[3] = mat[7] = mat[11] = 0, mat[15] = 1;
1478     }
1479     
1480     if (flags & D3DTTFF_PROJECTED) switch (flags & ~D3DTTFF_PROJECTED) {
1481     case D3DTTFF_COUNT2:
1482         mat[3] = mat[1], mat[7] = mat[5], mat[11] = mat[9], mat[15] = mat[13];
1483         mat[1] = mat[5] = mat[9] = mat[13] = 0;
1484         break;
1485     case D3DTTFF_COUNT3:
1486         mat[3] = mat[2], mat[7] = mat[6], mat[11] = mat[10], mat[15] = mat[14];
1487         mat[2] = mat[6] = mat[10] = mat[14] = 0;
1488         break;
1489     }
1490     glLoadMatrixf(mat);
1491     checkGLcall("glLoadMatrixf(mat)");
1492 }
1493
1494 void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand) 
1495 {
1496   BOOL isAlphaReplicate = FALSE;
1497   BOOL isComplement     = FALSE;
1498   
1499   *operand = GL_SRC_COLOR;
1500   *source = GL_TEXTURE;
1501   
1502   /* Catch alpha replicate */
1503   if (iValue & D3DTA_ALPHAREPLICATE) {
1504     iValue = iValue & ~D3DTA_ALPHAREPLICATE;
1505     isAlphaReplicate = TRUE;
1506   }
1507   
1508   /* Catch Complement */
1509   if (iValue & D3DTA_COMPLEMENT) {
1510     iValue = iValue & ~D3DTA_COMPLEMENT;
1511     isComplement = TRUE;
1512   }
1513   
1514   /* Calculate the operand */
1515   if (isAlphaReplicate && !isComplement) {
1516     *operand = GL_SRC_ALPHA;
1517   } else if (isAlphaReplicate && isComplement) {
1518     *operand = GL_ONE_MINUS_SRC_ALPHA;
1519   } else if (isComplement) {
1520     if (isAlphaArg) {
1521       *operand = GL_ONE_MINUS_SRC_ALPHA;
1522     } else {
1523       *operand = GL_ONE_MINUS_SRC_COLOR;
1524     }
1525   } else {
1526     if (isAlphaArg) {
1527       *operand = GL_SRC_ALPHA;
1528     } else {
1529       *operand = GL_SRC_COLOR;
1530     }
1531   }
1532   
1533   /* Calculate the source */
1534   switch (iValue & D3DTA_SELECTMASK) {
1535   case D3DTA_CURRENT:   *source  = GL_PREVIOUS_EXT;
1536     break;
1537   case D3DTA_DIFFUSE:   *source  = GL_PRIMARY_COLOR_EXT;
1538     break;
1539   case D3DTA_TEXTURE:   *source  = GL_TEXTURE;
1540     break;
1541   case D3DTA_TFACTOR:   *source  = GL_CONSTANT_EXT;
1542     break;
1543   case D3DTA_SPECULAR:
1544     /*
1545      * According to the GL_ARB_texture_env_combine specs, SPECULAR is
1546      * 'Secondary color' and isn't supported until base GL supports it
1547      * There is no concept of temp registers as far as I can tell
1548      */
1549     FIXME("Unhandled texture arg D3DTA_SPECULAR\n");
1550     *source = GL_TEXTURE;
1551     break;
1552
1553   default:
1554     FIXME("Unrecognized texture arg %ld\n", iValue);
1555     *source = GL_TEXTURE;
1556   }
1557 }
1558
1559
1560 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
1561 GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1562     GLint retVal = 0;
1563
1564     if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1565         switch (fmt) {
1566         case WINED3DFMT_DXT1:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
1567         case WINED3DFMT_DXT3:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
1568         case WINED3DFMT_DXT5:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
1569         default:
1570             /* stupid compiler */
1571             break;
1572         }
1573     }
1574
1575     if (retVal == 0) {
1576         switch (fmt) {
1577         /* Paletted */
1578         case WINED3DFMT_P8:               retVal = GL_COLOR_INDEX8_EXT; break;
1579         case WINED3DFMT_A8P8:             retVal = GL_COLOR_INDEX8_EXT; break;
1580             /* Luminance */
1581         case WINED3DFMT_L8:               retVal = GL_LUMINANCE8; break;
1582         case WINED3DFMT_A8L8:             retVal = GL_LUMINANCE8_ALPHA8; break;
1583         case WINED3DFMT_A4L4:             retVal = GL_LUMINANCE4_ALPHA4; break;
1584             /* Bump */
1585         case WINED3DFMT_V8U8:             retVal = GL_COLOR_INDEX8_EXT; break;
1586         case WINED3DFMT_V16U16:           retVal = GL_COLOR_INDEX; break;
1587         case WINED3DFMT_L6V5U5:           retVal = GL_COLOR_INDEX8_EXT; break;
1588         case WINED3DFMT_X8L8V8U8:         retVal = GL_COLOR_INDEX; break;
1589             /* color buffer */ 
1590         case WINED3DFMT_R3G3B2:           retVal = GL_R3_G3_B2; break;
1591         case WINED3DFMT_R5G6B5:           retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
1592         case WINED3DFMT_R8G8B8:           retVal = GL_RGB8; break;
1593         case WINED3DFMT_A1R5G5B5:         retVal = GL_RGB5_A1; break;
1594         case WINED3DFMT_X1R5G5B5:         retVal = GL_RGB5_A1; break;
1595         case WINED3DFMT_A4R4G4B4:         retVal = GL_RGBA4; break;
1596         case WINED3DFMT_X4R4G4B4:         retVal = GL_RGBA4; break;
1597         case WINED3DFMT_A8R8G8B8:         retVal = GL_RGBA8; break;
1598         case WINED3DFMT_X8R8G8B8:         retVal = GL_RGBA8; break;
1599             /* to see */
1600         case WINED3DFMT_A8:               retVal = GL_ALPHA8; break;
1601         default:
1602             FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1603             retVal = GL_RGB8;
1604         }
1605     }
1606     TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1607     return retVal;
1608 }
1609
1610 GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1611     GLenum retVal = 0;
1612
1613     if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1614         switch (fmt) {
1615         case WINED3DFMT_DXT1:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
1616         case WINED3DFMT_DXT3:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
1617         case WINED3DFMT_DXT5:             retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
1618         default:
1619             /* stupid compiler */
1620             break;
1621         }
1622     }
1623
1624     if (retVal == 0) {
1625         switch (fmt) {
1626         /* Paletted */
1627         case WINED3DFMT_P8:               retVal = GL_COLOR_INDEX; break;
1628         case WINED3DFMT_A8P8:             retVal = GL_COLOR_INDEX; break;
1629             /* Luminance */
1630         case WINED3DFMT_L8:               retVal = GL_LUMINANCE; break;
1631         case WINED3DFMT_A8L8:             retVal = GL_LUMINANCE_ALPHA; break;
1632         case WINED3DFMT_A4L4:             retVal = GL_LUMINANCE_ALPHA; break;
1633             /* Bump */
1634         case WINED3DFMT_V8U8:             retVal = GL_COLOR_INDEX; break;
1635         case WINED3DFMT_V16U16:           retVal = GL_COLOR_INDEX; break;
1636         case WINED3DFMT_L6V5U5:           retVal = GL_COLOR_INDEX; break;
1637         case WINED3DFMT_X8L8V8U8:         retVal = GL_COLOR_INDEX; break;
1638             /* color buffer */
1639         case WINED3DFMT_R3G3B2:           retVal = GL_BGR; break;
1640         case WINED3DFMT_R5G6B5:           retVal = GL_RGB; break;
1641         case WINED3DFMT_R8G8B8:           retVal = GL_RGB; break;
1642         case WINED3DFMT_A1R5G5B5:         retVal = GL_BGRA; break;
1643         case WINED3DFMT_X1R5G5B5:         retVal = GL_BGRA; break;
1644         case WINED3DFMT_A4R4G4B4:         retVal = GL_BGRA; break;
1645         case WINED3DFMT_X4R4G4B4:         retVal = GL_BGRA; break;
1646         case WINED3DFMT_A8R8G8B8:         retVal = GL_BGRA; break;
1647         case WINED3DFMT_X8R8G8B8:         retVal = GL_BGRA; break;
1648             /* to see */
1649         case WINED3DFMT_A8:               retVal = GL_ALPHA; break;
1650         default:
1651             FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1652             retVal = GL_BGR;
1653         }
1654     }
1655
1656     TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1657     return retVal;
1658 }
1659
1660 GLenum D3DFmt2GLType(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1661     GLenum retVal = 0;
1662
1663     if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1664         switch (fmt) {
1665         case WINED3DFMT_DXT1:             retVal = 0; break;
1666         case WINED3DFMT_DXT3:             retVal = 0; break;
1667         case WINED3DFMT_DXT5:             retVal = 0; break;
1668         default:
1669             /* stupid compiler */
1670             break;
1671         }
1672     }
1673
1674     if (retVal == 0) {
1675         switch (fmt) {
1676         /* Paletted */
1677         case WINED3DFMT_P8:               retVal = GL_UNSIGNED_BYTE; break;
1678         case WINED3DFMT_A8P8:             retVal = GL_UNSIGNED_BYTE; break;
1679             /* Luminance */
1680         case WINED3DFMT_L8:               retVal = GL_UNSIGNED_BYTE; break;
1681         case WINED3DFMT_A8L8:             retVal = GL_UNSIGNED_BYTE; break;
1682         case WINED3DFMT_A4L4:             retVal = GL_UNSIGNED_BYTE; break;
1683             /* Bump */
1684         case WINED3DFMT_V8U8:             retVal = GL_UNSIGNED_BYTE; break;
1685         case WINED3DFMT_V16U16:           retVal = GL_UNSIGNED_SHORT; break;
1686         case WINED3DFMT_L6V5U5:           retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
1687         case WINED3DFMT_X8L8V8U8:         retVal = GL_UNSIGNED_BYTE; break;
1688             /* Color buffer */
1689         case WINED3DFMT_R3G3B2:           retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
1690         case WINED3DFMT_R5G6B5:           retVal = GL_UNSIGNED_SHORT_5_6_5; break;
1691         case WINED3DFMT_R8G8B8:           retVal = GL_UNSIGNED_BYTE; break;
1692         case WINED3DFMT_A1R5G5B5:         retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
1693         case WINED3DFMT_X1R5G5B5:         retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
1694         case WINED3DFMT_A4R4G4B4:         retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
1695         case WINED3DFMT_X4R4G4B4:         retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
1696         case WINED3DFMT_A8R8G8B8:         retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
1697         case WINED3DFMT_X8R8G8B8:         retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
1698             /* to see */
1699         case WINED3DFMT_A8:               retVal = GL_ALPHA; break;
1700         default:
1701             FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1702             retVal = GL_UNSIGNED_BYTE;
1703         }
1704     }
1705
1706     TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1707     return retVal;
1708 }
1709
1710 SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1711     SHORT retVal;
1712
1713     switch (fmt) {
1714     /* color buffer */
1715     case WINED3DFMT_R3G3B2:           retVal = 1; break;
1716     case WINED3DFMT_R5G6B5:           retVal = 2; break;
1717     case WINED3DFMT_R8G8B8:           retVal = 3; break;
1718     case WINED3DFMT_A1R5G5B5:         retVal = 2; break;
1719     case WINED3DFMT_X1R5G5B5:         retVal = 2; break;
1720     case WINED3DFMT_A4R4G4B4:         retVal = 2; break;
1721     case WINED3DFMT_X4R4G4B4:         retVal = 2; break;
1722     case WINED3DFMT_A8R8G8B8:         retVal = 4; break;
1723     case WINED3DFMT_X8R8G8B8:         retVal = 4; break;
1724         /* Paletted */
1725     case WINED3DFMT_P8:               retVal = 1; break;
1726     case WINED3DFMT_A8P8:             retVal = 2; break;
1727         /* depth/stencil buffer */
1728     case WINED3DFMT_D16_LOCKABLE:     retVal = 2; break;
1729     case WINED3DFMT_D16:              retVal = 2; break;
1730     case WINED3DFMT_D32:              retVal = 4; break;
1731     case WINED3DFMT_D15S1:            retVal = 2; break;
1732     case WINED3DFMT_D24X4S4:          retVal = 4; break;
1733     case WINED3DFMT_D24S8:            retVal = 4; break;
1734     case WINED3DFMT_D24X8:            retVal = 4; break;
1735         /* Luminance */
1736     case WINED3DFMT_L8:               retVal = 1; break;
1737     case WINED3DFMT_A4L4:             retVal = 1; break;
1738     case WINED3DFMT_A8L8:             retVal = 2; break;
1739         /* Bump */
1740     case WINED3DFMT_V8U8:             retVal = 2; break;
1741     case WINED3DFMT_L6V5U5:           retVal = 2; break;
1742     case WINED3DFMT_V16U16:           retVal = 4; break;
1743     case WINED3DFMT_X8L8V8U8:         retVal = 4; break;
1744         /* Compressed */                                  
1745     case WINED3DFMT_DXT1:             retVal = 1; break; /* Actually  8 bytes per 16 pixels - Special cased later */
1746     case WINED3DFMT_DXT3:             retVal = 1; break; /* Actually 16 bytes per 16 pixels */
1747     case WINED3DFMT_DXT5:             retVal = 1; break; /* Actually 16 bytes per 16 pixels */
1748         /* to see */
1749     case WINED3DFMT_A8:               retVal = 1; break;
1750         /* unknown */                                  
1751     case WINED3DFMT_UNKNOWN:
1752         /* Guess at the highest value of the above */
1753         TRACE("WINED3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt);
1754         retVal = 4;
1755         break;
1756
1757     default:
1758         FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1759         retVal = 4;
1760     }
1761     TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
1762     return retVal;
1763 }
1764 #undef GLINFO_LOCATION