Use Interlocked* functions in AddRef and Release.
[wine/multimedia.git] / dlls / wined3d / utils.c
blobfe2894581ab2d25075004ceecf58c350ea4fb192
1 /*
2 * Utility functions for the WineD3D Library
4 * Copyright 2002-2004 Jason Edmeades
5 * Copyright 2003-2004 Raphael Junqueira
6 * Copyright 2004 Christian Costa
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.
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.
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
23 #include "config.h"
24 #include "wined3d_private.h"
26 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
28 /*****************************************************************************
29 * Trace formatting of useful values
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";
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";
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";
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";
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";
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";
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";
274 /*****************************************************************************
275 * Useful functions mapping GL <-> D3D values
277 GLenum StencilOp(DWORD op) {
278 switch(op) {
279 case D3DSTENCILOP_KEEP : return GL_KEEP;
280 case D3DSTENCILOP_ZERO : return GL_ZERO;
281 case D3DSTENCILOP_REPLACE : return GL_REPLACE;
282 case D3DSTENCILOP_INCRSAT : return GL_INCR;
283 case D3DSTENCILOP_DECRSAT : return GL_DECR;
284 case D3DSTENCILOP_INVERT : return GL_INVERT;
285 case D3DSTENCILOP_INCR : return GL_INCR_WRAP_EXT;
286 case D3DSTENCILOP_DECR : return GL_DECR_WRAP_EXT;
287 default:
288 FIXME("Invalid stencil op %ld\n", op);
289 return GL_ALWAYS;
293 /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
294 #if defined (GL_VERSION_1_3)
295 # define useext(A) A
296 # define combine_ext 1
297 #elif defined (GL_EXT_texture_env_combine)
298 # define useext(A) A##_EXT
299 # define combine_ext 1
300 #elif defined (GL_ARB_texture_env_combine)
301 # define useext(A) A##_ARB
302 # define combine_ext 1
303 #else
304 # undef combine_ext
305 #endif
307 #if !defined(combine_ext)
308 void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
310 FIXME("Requires opengl combine extensions to work\n");
311 return;
313 #else
314 /* Setup the texture operations texture stage states */
315 void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
317 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
318 GLenum src1, src2, src3;
319 GLenum opr1, opr2, opr3;
320 GLenum comb_target;
321 GLenum src0_target, src1_target, src2_target;
322 GLenum opr0_target, opr1_target, opr2_target;
323 GLenum scal_target;
324 GLenum opr=0, invopr, src3_target, opr3_target;
325 BOOL Handled = FALSE;
326 IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
328 TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);
330 ENTER_GL();
332 /* Note: Operations usually involve two ars, src0 and src1 and are operations of
333 the form (a1 <operation> a2). However, some of the more complex operations
334 take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added
335 in a third parameter called a0. Therefore these are operations of the form
336 a0 <operation> a1 <operation> a2, ie the new parameter goes to the front.
338 However, below we treat the new (a0) parameter as src2/opr2, so in the actual
339 functions below, expect their syntax to differ slightly to those listed in the
340 manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2
341 This affects D3DTOP_MULTIPLYADD and D3DTOP_LERP */
343 if (isAlpha) {
344 comb_target = useext(GL_COMBINE_ALPHA);
345 src0_target = useext(GL_SOURCE0_ALPHA);
346 src1_target = useext(GL_SOURCE1_ALPHA);
347 src2_target = useext(GL_SOURCE2_ALPHA);
348 opr0_target = useext(GL_OPERAND0_ALPHA);
349 opr1_target = useext(GL_OPERAND1_ALPHA);
350 opr2_target = useext(GL_OPERAND2_ALPHA);
351 scal_target = GL_ALPHA_SCALE;
353 else {
354 comb_target = useext(GL_COMBINE_RGB);
355 src0_target = useext(GL_SOURCE0_RGB);
356 src1_target = useext(GL_SOURCE1_RGB);
357 src2_target = useext(GL_SOURCE2_RGB);
358 opr0_target = useext(GL_OPERAND0_RGB);
359 opr1_target = useext(GL_OPERAND1_RGB);
360 opr2_target = useext(GL_OPERAND2_RGB);
361 scal_target = useext(GL_RGB_SCALE);
364 /* From MSDN (D3DTSS_ALPHAARG1) :
365 The default argument is D3DTA_TEXTURE. If no texture is set for this stage,
366 then the default argument is D3DTA_DIFFUSE.
367 FIXME? If texture added/removed, may need to reset back as well? */
368 if (isAlpha && This->stateBlock->textures[Stage] == NULL && arg1 == D3DTA_TEXTURE) {
369 GetSrcAndOpFromValue(D3DTA_DIFFUSE, isAlpha, &src1, &opr1);
370 } else {
371 GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1);
373 GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2);
374 GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3);
376 TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);
378 Handled = TRUE; /* Assume will be handled */
380 /* Other texture operations require special extensions: */
381 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
382 if (isAlpha) {
383 opr = GL_SRC_ALPHA;
384 invopr = GL_ONE_MINUS_SRC_ALPHA;
385 src3_target = GL_SOURCE3_ALPHA_NV;
386 opr3_target = GL_OPERAND3_ALPHA_NV;
387 } else {
388 opr = GL_SRC_COLOR;
389 invopr = GL_ONE_MINUS_SRC_COLOR;
390 src3_target = GL_SOURCE3_RGB_NV;
391 opr3_target = GL_OPERAND3_RGB_NV;
393 switch (op) {
394 case D3DTOP_DISABLE: /* Only for alpha */
395 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
396 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
397 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
398 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
399 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
400 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
401 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
402 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
403 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
404 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
405 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
406 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
407 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
408 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
409 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
410 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
411 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
412 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
413 break;
414 case D3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */
415 case D3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */
416 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
417 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
418 if (op == D3DTOP_SELECTARG1) {
419 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
420 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
421 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
422 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
423 } else {
424 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
425 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
426 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
427 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
429 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
430 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
431 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
432 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
433 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
434 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
435 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
436 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
437 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
438 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
439 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
440 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
441 break;
443 case D3DTOP_MODULATE:
444 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
445 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
446 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
447 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
448 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
449 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
450 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
451 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
452 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
453 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
454 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
455 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
456 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
457 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
458 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
459 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
460 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
461 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
462 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
463 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
464 break;
465 case D3DTOP_MODULATE2X:
466 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
467 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
468 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
469 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
470 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
471 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
472 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
473 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
474 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
475 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
476 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
477 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
478 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
479 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
480 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
481 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
482 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
483 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
484 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
485 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
486 break;
487 case D3DTOP_MODULATE4X:
488 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
489 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
490 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
491 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
492 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
493 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
494 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
495 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
496 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
497 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
498 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
499 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
500 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
501 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
502 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
503 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
504 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
505 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
506 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
507 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
508 break;
510 case D3DTOP_ADD:
511 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
512 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
513 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
514 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
515 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
516 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
517 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
518 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
519 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
520 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
521 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
522 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
523 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
524 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
525 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
526 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
527 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
528 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
529 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
530 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
531 break;
533 case D3DTOP_ADDSIGNED:
534 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
535 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
536 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
537 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
538 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
539 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
540 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
541 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
542 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
543 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
544 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
545 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
546 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
547 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
548 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
549 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
550 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
551 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
552 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
553 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
554 break;
556 case D3DTOP_ADDSIGNED2X:
557 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
558 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
559 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
560 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
561 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
562 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
563 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
564 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
565 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
566 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
567 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
568 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
569 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
570 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
571 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
572 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
573 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
574 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
575 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
576 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
577 break;
579 case D3DTOP_ADDSMOOTH:
580 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
581 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
582 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
583 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
584 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
585 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
586 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
587 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
588 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
589 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
590 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
591 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
592 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
593 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
594 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
595 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
596 switch (opr1) {
597 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
598 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
599 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
600 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
602 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
603 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
604 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
605 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
606 break;
608 case D3DTOP_BLENDDIFFUSEALPHA:
609 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
610 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
611 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
612 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
613 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
614 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
615 glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR));
616 checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)");
617 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
618 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
619 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
620 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
621 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
622 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
623 glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR));
624 checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)");
625 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
626 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
627 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
628 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
629 break;
630 case D3DTOP_BLENDTEXTUREALPHA:
631 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
632 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
633 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
634 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
635 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
636 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
637 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);
638 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");
639 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
640 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
641 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
642 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
643 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
644 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
645 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
646 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
647 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
648 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
649 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
650 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
651 break;
652 case D3DTOP_BLENDFACTORALPHA:
653 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
654 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
655 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
656 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
657 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
658 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
659 glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT));
660 checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)");
661 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
662 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
663 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
664 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
665 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
666 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
667 glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT));
668 checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)");
669 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
670 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
671 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
672 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
673 break;
674 case D3DTOP_BLENDTEXTUREALPHAPM:
675 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
676 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
677 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
678 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
679 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
680 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
681 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
682 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
683 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
684 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
685 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
686 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
687 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
688 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
689 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
690 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
691 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
692 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
693 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
694 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
695 break;
696 case D3DTOP_MODULATEALPHA_ADDCOLOR:
697 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
698 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
699 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */
700 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
701 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
702 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */
703 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
704 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
705 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
706 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
707 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */
708 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
709 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
710 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */
711 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
712 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
713 switch (opr) {
714 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
715 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
717 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
718 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
719 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
720 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
721 break;
722 case D3DTOP_MODULATECOLOR_ADDALPHA:
723 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
724 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
725 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
726 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
727 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
728 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
729 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
730 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
731 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
732 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
733 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
734 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
735 switch (opr1) {
736 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
737 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
739 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
740 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
741 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
742 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
743 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
744 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
745 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
746 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
747 break;
748 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
749 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
750 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
751 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
752 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
753 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
754 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
755 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
756 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
757 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
758 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
759 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
760 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
761 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
762 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
763 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
764 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
765 switch (opr1) {
766 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
767 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
768 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
769 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
771 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
772 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
773 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
774 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
775 break;
776 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
777 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
778 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
779 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
780 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
781 switch (opr1) {
782 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
783 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
784 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
785 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
787 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
788 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
789 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
790 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
791 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
792 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
793 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
794 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
795 switch (opr1) {
796 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
797 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
799 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
800 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
801 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
802 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
803 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
804 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
805 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
806 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
807 break;
808 case D3DTOP_MULTIPLYADD:
809 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
810 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
811 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
812 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
813 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
814 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
815 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
816 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
817 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
818 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
819 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
820 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
821 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
822 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
823 glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
824 checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
825 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
826 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
827 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
828 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
829 break;
831 case D3DTOP_BUMPENVMAP:
833 if (GL_SUPPORT(NV_TEXTURE_SHADER)) {
835 texture unit 0: GL_TEXTURE_2D
836 texture unit 1: GL_DOT_PRODUCT_NV
837 texture unit 2: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV
838 texture unit 3: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV
840 float m[2][2];
842 union {
843 float f;
844 DWORD d;
845 } tmpvalue;
847 tmpvalue.d = This->stateBlock->textureState[Stage][D3DTSS_BUMPENVMAT00];
848 m[0][0] = tmpvalue.f;
849 tmpvalue.d = This->stateBlock->textureState[Stage][D3DTSS_BUMPENVMAT01];
850 m[0][1] = tmpvalue.f;
851 tmpvalue.d = This->stateBlock->textureState[Stage][D3DTSS_BUMPENVMAT10];
852 m[1][0] = tmpvalue.f;
853 tmpvalue.d = This->stateBlock->textureState[Stage][D3DTSS_BUMPENVMAT11];
854 m[1][1] = tmpvalue.f;
856 /*FIXME("Stage %d matrix is (%.2f,%.2f),(%.2f,%.2f)\n", Stage, m[0][0], m[0][1], m[1][0], m[1][0]);*/
858 if (FALSE == This->texture_shader_active) {
859 This->texture_shader_active = TRUE;
860 glEnable(GL_TEXTURE_SHADER_NV);
864 glEnable(GL_REGISTER_COMBINERS_NV);
865 glCombinerParameteriNV (GL_NUM_GENERAL_COMBINERS_NV, 1);
866 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
867 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
868 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
869 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
870 glCombinerOutputNV (GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
871 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
872 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
873 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
874 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
875 glCombinerOutputNV (GL_COMBINER0_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
876 glDisable (GL_PER_STAGE_CONSTANTS_NV);
877 glCombinerParameteriNV (GL_COLOR_SUM_CLAMP_NV, 0);
878 glFinalCombinerInputNV (GL_VARIABLE_A_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
879 glFinalCombinerInputNV (GL_VARIABLE_B_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
880 glFinalCombinerInputNV (GL_VARIABLE_C_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
881 glFinalCombinerInputNV (GL_VARIABLE_D_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
882 glFinalCombinerInputNV (GL_VARIABLE_E_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
883 glFinalCombinerInputNV (GL_VARIABLE_F_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
884 glFinalCombinerInputNV (GL_VARIABLE_G_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
887 int i;
888 for (i = 0; i < Stage; i++) {
889 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
890 GL_ACTIVETEXTURE(i);
891 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
892 checkGLcall("Activate texture..");
893 } else if (i>0) {
894 FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
899 GL_ACTIVETEXTURE(Stage - 1);
900 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
903 GL_ACTIVETEXTURE(Stage);
904 checkGLcall("Activate texture.. to update const color");
905 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV);
906 checkGLcall("glTexEnv");
907 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + Stage - 1);
908 checkGLcall("glTexEnv");
909 glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float*)&m[0]);
910 checkGLcall("glTexEnv");
912 LEAVE_GL();
913 return;
914 break;
918 case D3DTOP_BUMPENVMAPLUMINANCE:
920 default:
921 Handled = FALSE;
923 if (Handled) {
924 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
925 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
927 LEAVE_GL();
928 return;
930 } /* GL_NV_texture_env_combine4 */
932 Handled = TRUE; /* Again, assume handled */
933 switch (op) {
934 case D3DTOP_DISABLE: /* Only for alpha */
935 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
936 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
937 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
938 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT");
939 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
940 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA");
941 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
942 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
943 break;
944 case D3DTOP_SELECTARG1:
945 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
946 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
947 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
948 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
949 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
950 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
951 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
952 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
953 break;
954 case D3DTOP_SELECTARG2:
955 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
956 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
957 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
958 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
959 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
960 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
961 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
962 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
963 break;
964 case D3DTOP_MODULATE:
965 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
966 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
967 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
968 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
969 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
970 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
971 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
972 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
973 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
974 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
975 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
976 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
977 break;
978 case D3DTOP_MODULATE2X:
979 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
980 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
981 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
982 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
983 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
984 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
985 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
986 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
987 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
988 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
989 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
990 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
991 break;
992 case D3DTOP_MODULATE4X:
993 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
994 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
995 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
996 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
997 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
998 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
999 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1000 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1001 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1002 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1003 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
1004 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
1005 break;
1006 case D3DTOP_ADD:
1007 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1008 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1009 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1010 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1011 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1012 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1013 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1014 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1015 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1016 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1017 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1018 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1019 break;
1020 case D3DTOP_ADDSIGNED:
1021 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1022 checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)");
1023 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1024 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1025 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1026 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1027 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1028 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1029 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1030 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1031 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1032 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1033 break;
1034 case D3DTOP_ADDSIGNED2X:
1035 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1036 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
1037 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1038 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1039 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1040 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1041 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1042 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1043 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1044 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1045 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1046 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1047 break;
1048 case D3DTOP_SUBTRACT:
1049 if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {
1050 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);
1051 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)");
1052 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1053 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1054 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1055 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1056 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1057 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1058 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1059 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1060 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1061 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1062 } else {
1063 FIXME("This version of opengl does not support GL_SUBTRACT\n");
1065 break;
1067 case D3DTOP_BLENDDIFFUSEALPHA:
1068 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1069 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1070 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1071 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1072 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1073 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1074 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1075 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1076 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1077 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1078 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR));
1079 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR");
1080 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1081 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1082 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1083 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1084 break;
1085 case D3DTOP_BLENDTEXTUREALPHA:
1086 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1087 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1088 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1089 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1090 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1091 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1092 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1093 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1094 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1095 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1096 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);
1097 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");
1098 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1099 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1100 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1101 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1102 break;
1103 case D3DTOP_BLENDFACTORALPHA:
1104 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1105 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1106 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1107 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1108 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1109 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1110 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1111 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1112 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1113 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1114 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));
1115 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");
1116 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1117 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1118 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1119 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1120 break;
1121 case D3DTOP_BLENDCURRENTALPHA:
1122 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1123 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1124 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1125 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1126 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1127 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1128 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1129 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1130 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1131 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1132 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));
1133 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");
1134 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1135 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1136 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1137 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1138 break;
1139 case D3DTOP_DOTPRODUCT3:
1140 if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
1141 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
1142 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
1143 } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
1144 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
1145 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
1146 } else {
1147 FIXME("This version of opengl does not support GL_DOT3\n");
1149 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1150 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1151 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1152 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1153 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1154 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1155 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1156 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1157 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1158 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1159 break;
1160 case D3DTOP_LERP:
1161 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1162 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1163 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1164 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1165 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1166 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1167 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1168 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1169 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1170 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1171 glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);
1172 checkGLcall("GL_TEXTURE_ENV, src2_target, src3");
1173 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);
1174 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");
1175 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1176 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1177 break;
1178 case D3DTOP_ADDSMOOTH:
1179 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1180 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1181 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1182 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1183 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1184 switch (opr1) {
1185 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1186 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1187 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1188 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1190 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1191 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1192 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1193 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1194 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1195 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1196 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1197 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1198 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1199 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1200 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1201 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1202 } else
1203 Handled = FALSE;
1204 break;
1205 case D3DTOP_BLENDTEXTUREALPHAPM:
1206 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1207 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1208 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1209 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);
1210 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE");
1211 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_ALPHA);
1212 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_APHA");
1213 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1214 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1215 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1216 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1217 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1218 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1219 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1220 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1221 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1222 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1223 } else
1224 Handled = FALSE;
1225 break;
1226 case D3DTOP_MODULATEALPHA_ADDCOLOR:
1227 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1228 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1229 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1230 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1231 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1232 switch (opr1) {
1233 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1234 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1235 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1236 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1238 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1239 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1240 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1241 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1242 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1243 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1244 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1245 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1246 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1247 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1248 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1249 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1250 } else
1251 Handled = FALSE;
1252 break;
1253 case D3DTOP_MODULATECOLOR_ADDALPHA:
1254 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1255 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1256 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1257 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1258 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1259 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1260 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1261 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1262 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1263 switch (opr1) {
1264 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1265 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1266 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1267 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1269 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
1270 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
1271 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1272 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1273 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1274 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1275 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1276 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1277 } else
1278 Handled = FALSE;
1279 break;
1280 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1281 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1282 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1283 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1284 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1285 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1286 switch (opr1) {
1287 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1288 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1289 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1290 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1292 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1293 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1294 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1295 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1296 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1297 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1298 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1299 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1300 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1301 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1302 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1303 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1304 } else
1305 Handled = FALSE;
1306 break;
1307 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1308 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1309 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1310 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1311 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1312 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1313 switch (opr1) {
1314 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1315 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1316 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1317 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1319 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1320 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1321 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1322 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1323 switch (opr1) {
1324 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1325 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1326 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1327 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1329 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
1330 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
1331 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1332 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1333 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1334 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1335 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1336 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1337 } else
1338 Handled = FALSE;
1339 break;
1340 case D3DTOP_MULTIPLYADD:
1341 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1342 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1343 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1344 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
1345 checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
1346 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
1347 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
1348 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1349 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1350 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1351 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1352 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1353 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1354 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1355 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1356 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1357 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1358 } else
1359 Handled = FALSE;
1360 break;
1361 default:
1362 Handled = FALSE;
1365 if (Handled) {
1366 BOOL combineOK = TRUE;
1367 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1368 DWORD op2;
1370 if (isAlpha) {
1371 op2 = This->stateBlock->textureState[Stage][D3DTSS_COLOROP];
1372 } else {
1373 op2 = This->stateBlock->textureState[Stage][D3DTSS_ALPHAOP];
1376 /* Note: If COMBINE4 in effect can't go back to combine! */
1377 switch (op2) {
1378 case D3DTOP_ADDSMOOTH:
1379 case D3DTOP_BLENDTEXTUREALPHAPM:
1380 case D3DTOP_MODULATEALPHA_ADDCOLOR:
1381 case D3DTOP_MODULATECOLOR_ADDALPHA:
1382 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1383 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1384 case D3DTOP_MULTIPLYADD:
1385 /* Ignore those implemented in both cases */
1386 switch (op) {
1387 case D3DTOP_SELECTARG1:
1388 case D3DTOP_SELECTARG2:
1389 combineOK = FALSE;
1390 Handled = FALSE;
1391 break;
1392 default:
1393 FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
1394 LEAVE_GL();
1395 return;
1400 if (combineOK) {
1401 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
1402 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
1404 LEAVE_GL();
1405 return;
1409 LEAVE_GL();
1411 /* After all the extensions, if still unhandled, report fixme */
1412 FIXME("Unhandled texture operation %d\n", op);
1413 #undef GLINFO_LOCATION
1415 #endif
1417 /* Setup this textures matrix according to the texture flags*/
1418 void set_texture_matrix(const float *smat, DWORD flags)
1420 float mat[16];
1422 glMatrixMode(GL_TEXTURE);
1424 if (flags == D3DTTFF_DISABLE) {
1425 glLoadIdentity();
1426 checkGLcall("glLoadIdentity()");
1427 return;
1430 if (flags == (D3DTTFF_COUNT1|D3DTTFF_PROJECTED)) {
1431 ERR("Invalid texture transform flags: D3DTTFF_COUNT1|D3DTTFF_PROJECTED\n");
1432 checkGLcall("glLoadIdentity()");
1433 return;
1436 memcpy(mat, smat, 16*sizeof(float));
1438 switch (flags & ~D3DTTFF_PROJECTED) {
1439 case D3DTTFF_COUNT1: mat[1] = mat[5] = mat[9] = mat[13] = 0;
1440 case D3DTTFF_COUNT2: mat[2] = mat[6] = mat[10] = mat[14] = 0;
1441 default: mat[3] = mat[7] = mat[11] = 0, mat[15] = 1;
1444 if (flags & D3DTTFF_PROJECTED) switch (flags & ~D3DTTFF_PROJECTED) {
1445 case D3DTTFF_COUNT2:
1446 mat[3] = mat[1], mat[7] = mat[5], mat[11] = mat[9], mat[15] = mat[13];
1447 mat[1] = mat[5] = mat[9] = mat[13] = 0;
1448 break;
1449 case D3DTTFF_COUNT3:
1450 mat[3] = mat[2], mat[7] = mat[6], mat[11] = mat[10], mat[15] = mat[14];
1451 mat[2] = mat[6] = mat[10] = mat[14] = 0;
1452 break;
1454 glLoadMatrixf(mat);
1455 checkGLcall("glLoadMatrixf(mat)");
1458 void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand)
1460 BOOL isAlphaReplicate = FALSE;
1461 BOOL isComplement = FALSE;
1463 *operand = GL_SRC_COLOR;
1464 *source = GL_TEXTURE;
1466 /* Catch alpha replicate */
1467 if (iValue & D3DTA_ALPHAREPLICATE) {
1468 iValue = iValue & ~D3DTA_ALPHAREPLICATE;
1469 isAlphaReplicate = TRUE;
1472 /* Catch Complement */
1473 if (iValue & D3DTA_COMPLEMENT) {
1474 iValue = iValue & ~D3DTA_COMPLEMENT;
1475 isComplement = TRUE;
1478 /* Calculate the operand */
1479 if (isAlphaReplicate && !isComplement) {
1480 *operand = GL_SRC_ALPHA;
1481 } else if (isAlphaReplicate && isComplement) {
1482 *operand = GL_ONE_MINUS_SRC_ALPHA;
1483 } else if (isComplement) {
1484 if (isAlphaArg) {
1485 *operand = GL_ONE_MINUS_SRC_ALPHA;
1486 } else {
1487 *operand = GL_ONE_MINUS_SRC_COLOR;
1489 } else {
1490 if (isAlphaArg) {
1491 *operand = GL_SRC_ALPHA;
1492 } else {
1493 *operand = GL_SRC_COLOR;
1497 /* Calculate the source */
1498 switch (iValue & D3DTA_SELECTMASK) {
1499 case D3DTA_CURRENT: *source = GL_PREVIOUS_EXT;
1500 break;
1501 case D3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT;
1502 break;
1503 case D3DTA_TEXTURE: *source = GL_TEXTURE;
1504 break;
1505 case D3DTA_TFACTOR: *source = GL_CONSTANT_EXT;
1506 break;
1507 case D3DTA_SPECULAR:
1509 * According to the GL_ARB_texture_env_combine specs, SPECULAR is
1510 * 'Secondary color' and isn't supported until base GL supports it
1511 * There is no concept of temp registers as far as I can tell
1513 FIXME("Unhandled texture arg D3DTA_SPECULAR\n");
1514 *source = GL_TEXTURE;
1515 break;
1517 default:
1518 FIXME("Unrecognized texture arg %ld\n", iValue);
1519 *source = GL_TEXTURE;
1524 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
1525 GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1526 GLint retVal = 0;
1528 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1529 switch (fmt) {
1530 case D3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
1531 case D3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
1532 case D3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
1533 default:
1534 /* stupid compiler */
1535 break;
1539 if (retVal == 0) {
1540 switch (fmt) {
1541 /* Paletted */
1542 case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break;
1543 case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break;
1544 /* Luminance */
1545 case D3DFMT_L8: retVal = GL_LUMINANCE8; break;
1546 case D3DFMT_A8L8: retVal = GL_LUMINANCE8_ALPHA8; break;
1547 case D3DFMT_A4L4: retVal = GL_LUMINANCE4_ALPHA4; break;
1548 /* Bump */
1549 case D3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break;
1550 case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
1551 case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX8_EXT; break;
1552 case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
1553 /* color buffer */
1554 case D3DFMT_R3G3B2: retVal = GL_R3_G3_B2; break;
1555 case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
1556 case D3DFMT_R8G8B8: retVal = GL_RGB8; break;
1557 case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break;
1558 case D3DFMT_X1R5G5B5: retVal = GL_RGB5_A1; break;
1559 case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break;
1560 case D3DFMT_X4R4G4B4: retVal = GL_RGBA4; break;
1561 case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break;
1562 case D3DFMT_X8R8G8B8: retVal = GL_RGBA8; break;
1563 /* to see */
1564 case D3DFMT_A8: retVal = GL_ALPHA8; break;
1565 default:
1566 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1567 retVal = GL_RGB8;
1570 TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1571 return retVal;
1574 GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1575 GLenum retVal = 0;
1577 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1578 switch (fmt) {
1579 case D3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
1580 case D3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
1581 case D3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
1582 default:
1583 /* stupid compiler */
1584 break;
1588 if (retVal == 0) {
1589 switch (fmt) {
1590 /* Paletted */
1591 case D3DFMT_P8: retVal = GL_COLOR_INDEX; break;
1592 case D3DFMT_A8P8: retVal = GL_COLOR_INDEX; break;
1593 /* Luminance */
1594 case D3DFMT_L8: retVal = GL_LUMINANCE; break;
1595 case D3DFMT_A8L8: retVal = GL_LUMINANCE_ALPHA; break;
1596 case D3DFMT_A4L4: retVal = GL_LUMINANCE_ALPHA; break;
1597 /* Bump */
1598 case D3DFMT_V8U8: retVal = GL_COLOR_INDEX; break;
1599 case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
1600 case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX; break;
1601 case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
1602 /* color buffer */
1603 case D3DFMT_R3G3B2: retVal = GL_BGR; break;
1604 case D3DFMT_R5G6B5: retVal = GL_RGB; break;
1605 case D3DFMT_R8G8B8: retVal = GL_RGB; break;
1606 case D3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
1607 case D3DFMT_X1R5G5B5: retVal = GL_BGRA; break;
1608 case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break;
1609 case D3DFMT_X4R4G4B4: retVal = GL_BGRA; break;
1610 case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break;
1611 case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break;
1612 /* to see */
1613 case D3DFMT_A8: retVal = GL_ALPHA; break;
1614 default:
1615 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1616 retVal = GL_BGR;
1620 TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1621 return retVal;
1624 GLenum D3DFmt2GLType(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1625 GLenum retVal = 0;
1627 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1628 switch (fmt) {
1629 case D3DFMT_DXT1: retVal = 0; break;
1630 case D3DFMT_DXT3: retVal = 0; break;
1631 case D3DFMT_DXT5: retVal = 0; break;
1632 default:
1633 /* stupid compiler */
1634 break;
1638 if (retVal == 0) {
1639 switch (fmt) {
1640 /* Paletted */
1641 case D3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break;
1642 case D3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break;
1643 /* Luminance */
1644 case D3DFMT_L8: retVal = GL_UNSIGNED_BYTE; break;
1645 case D3DFMT_A8L8: retVal = GL_UNSIGNED_BYTE; break;
1646 case D3DFMT_A4L4: retVal = GL_UNSIGNED_BYTE; break;
1647 /* Bump */
1648 case D3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break;
1649 case D3DFMT_V16U16: retVal = GL_UNSIGNED_SHORT; break;
1650 case D3DFMT_L6V5U5: retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
1651 case D3DFMT_X8L8V8U8: retVal = GL_UNSIGNED_BYTE; break;
1652 /* Color buffer */
1653 case D3DFMT_R3G3B2: retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
1654 case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break;
1655 case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break;
1656 case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
1657 case D3DFMT_X1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
1658 case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
1659 case D3DFMT_X4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
1660 case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
1661 case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
1662 /* to see */
1663 case D3DFMT_A8: retVal = GL_ALPHA; break;
1664 default:
1665 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1666 retVal = GL_UNSIGNED_BYTE;
1670 TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1671 return retVal;
1674 SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1675 SHORT retVal;
1677 switch (fmt) {
1678 /* color buffer */
1679 case D3DFMT_R3G3B2: retVal = 1; break;
1680 case D3DFMT_R5G6B5: retVal = 2; break;
1681 case D3DFMT_R8G8B8: retVal = 3; break;
1682 case D3DFMT_A1R5G5B5: retVal = 2; break;
1683 case D3DFMT_X1R5G5B5: retVal = 2; break;
1684 case D3DFMT_A4R4G4B4: retVal = 2; break;
1685 case D3DFMT_X4R4G4B4: retVal = 2; break;
1686 case D3DFMT_A8R8G8B8: retVal = 4; break;
1687 case D3DFMT_X8R8G8B8: retVal = 4; break;
1688 /* Paletted */
1689 case D3DFMT_P8: retVal = 1; break;
1690 case D3DFMT_A8P8: retVal = 2; break;
1691 /* depth/stencil buffer */
1692 case D3DFMT_D16_LOCKABLE: retVal = 2; break;
1693 case D3DFMT_D16: retVal = 2; break;
1694 case D3DFMT_D32: retVal = 4; break;
1695 case D3DFMT_D15S1: retVal = 2; break;
1696 case D3DFMT_D24X4S4: retVal = 4; break;
1697 case D3DFMT_D24S8: retVal = 4; break;
1698 case D3DFMT_D24X8: retVal = 4; break;
1699 /* Luminance */
1700 case D3DFMT_L8: retVal = 1; break;
1701 case D3DFMT_A4L4: retVal = 1; break;
1702 case D3DFMT_A8L8: retVal = 2; break;
1703 /* Bump */
1704 case D3DFMT_V8U8: retVal = 2; break;
1705 case D3DFMT_L6V5U5: retVal = 2; break;
1706 case D3DFMT_V16U16: retVal = 4; break;
1707 case D3DFMT_X8L8V8U8: retVal = 4; break;
1708 /* Compressed */
1709 case D3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */
1710 case D3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
1711 case D3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
1712 /* to see */
1713 case D3DFMT_A8: retVal = 1; break;
1714 /* unknown */
1715 case D3DFMT_UNKNOWN:
1716 /* Guess at the highest value of the above */
1717 TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt);
1718 retVal = 4;
1719 break;
1721 default:
1722 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1723 retVal = 4;
1725 TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
1726 return retVal;
1728 #undef GLINFO_LOCATION