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