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
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) {
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);
76 FIXME("Unrecognized %u D3DFORMAT!\n", fmt);
77 return "unrecognized";
81 const char* debug_d3ddevicetype(D3DDEVTYPE 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);
89 FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype);
90 return "unrecognized";
94 const char* debug_d3dusage(DWORD 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";
109 FIXME("Unrecognized %lu Usage!\n", usage);
110 return "unrecognized";
114 const char* debug_d3dresourcetype(D3DRESOURCETYPE 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);
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);
142 FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
143 return "unrecognized";
147 const char* debug_d3drenderstate(DWORD 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
228 FIXME("Unrecognized %lu render state!\n", state);
229 return "unrecognized";
233 const char* debug_d3dtexturestate(DWORD 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
265 /* Note D3DTSS are not consecutive, so skip these */
269 FIXME("Unrecognized %lu texture state!\n", state);
270 return "unrecognized";
274 const char* debug_d3dpool(D3DPOOL 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);
283 FIXME("Unrecognized %u D3DPOOL!\n", Pool);
284 return "unrecognized";
287 /*****************************************************************************
288 * Useful functions mapping GL <-> D3D values
290 GLenum StencilOp(DWORD 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;
301 FIXME("Invalid stencil op %ld\n", op);
306 /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
307 #if defined (GL_VERSION_1_3)
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
320 #if !defined(combine_ext)
321 void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
323 FIXME("Requires opengl combine extensions to work\n");
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)
330 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
331 GLenum src1, src2, src3;
332 GLenum opr1, opr2, opr3;
334 GLenum src0_target, src1_target, src2_target;
335 GLenum opr0_target, opr1_target, opr2_target;
337 GLenum opr=0, invopr, src3_target, opr3_target;
338 BOOL Handled = FALSE;
339 IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
341 TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);
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.
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 */
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;
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);
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);
384 GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1);
386 GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2);
387 GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3);
389 TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);
391 Handled = TRUE; /* Assume will be handled */
393 /* Other texture operations require special extensions: */
394 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
397 invopr = GL_ONE_MINUS_SRC_ALPHA;
398 src3_target = GL_SOURCE3_ALPHA_NV;
399 opr3_target = GL_OPERAND3_ALPHA_NV;
402 invopr = GL_ONE_MINUS_SRC_COLOR;
403 src3_target = GL_SOURCE3_RGB_NV;
404 opr3_target = GL_OPERAND3_RGB_NV;
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
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;
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");
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");
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");
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");
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");
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");
727 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
728 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
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");
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");
749 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
750 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
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");
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");
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;
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");
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");
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;
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");
809 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
810 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
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");
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");
844 case D3DTOP_BUMPENVMAP:
846 if (GL_SUPPORT(NV_TEXTURE_SHADER)) {
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
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;
869 /*FIXME("Stage %d matrix is (%.2f,%.2f),(%.2f,%.2f)\n", Stage, m[0][0], m[0][1], m[1][0], m[1][0]);*/
871 if (FALSE == This->texture_shader_active) {
872 This->texture_shader_active = TRUE;
873 glEnable(GL_TEXTURE_SHADER_NV);
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);
901 for (i = 0; i < Stage; i++) {
902 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
904 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
905 checkGLcall("Activate texture..");
907 FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
912 GL_ACTIVETEXTURE(Stage - 1);
913 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
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");
931 case D3DTOP_BUMPENVMAPLUMINANCE:
937 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
938 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
943 } /* GL_NV_texture_env_combine4 */
945 Handled = TRUE; /* Again, assume handled */
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
1076 FIXME("This version of opengl does not support GL_SUBTRACT\n");
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");
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");
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");
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");
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");
1160 FIXME("This version of opengl does not support GL_DOT3\n");
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");
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");
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");
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;
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");
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");
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");
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;
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");
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");
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;
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");
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");
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;
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");
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");
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;
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");
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;
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");
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");
1379 BOOL combineOK = TRUE;
1380 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1384 op2 = This->stateBlock->textureState[Stage][D3DTSS_COLOROP];
1386 op2 = This->stateBlock->textureState[Stage][D3DTSS_ALPHAOP];
1389 /* Note: If COMBINE4 in effect can't go back to combine! */
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 */
1400 case D3DTOP_SELECTARG1:
1401 case D3DTOP_SELECTARG2:
1406 FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
1414 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
1415 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
1424 /* After all the extensions, if still unhandled, report fixme */
1425 FIXME("Unhandled texture operation %d\n", op);
1426 #undef GLINFO_LOCATION
1430 /* Setup this textures matrix according to the texture flags*/
1431 void set_texture_matrix(const float *smat, DWORD flags)
1435 glMatrixMode(GL_TEXTURE);
1437 if (flags == D3DTTFF_DISABLE) {
1439 checkGLcall("glLoadIdentity()");
1443 if (flags == (D3DTTFF_COUNT1|D3DTTFF_PROJECTED)) {
1444 ERR("Invalid texture transform flags: D3DTTFF_COUNT1|D3DTTFF_PROJECTED\n");
1445 checkGLcall("glLoadIdentity()");
1449 memcpy(mat, smat, 16*sizeof(float));
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;
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;
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;
1468 checkGLcall("glLoadMatrixf(mat)");
1471 void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand)
1473 BOOL isAlphaReplicate = FALSE;
1474 BOOL isComplement = FALSE;
1476 *operand = GL_SRC_COLOR;
1477 *source = GL_TEXTURE;
1479 /* Catch alpha replicate */
1480 if (iValue & D3DTA_ALPHAREPLICATE) {
1481 iValue = iValue & ~D3DTA_ALPHAREPLICATE;
1482 isAlphaReplicate = TRUE;
1485 /* Catch Complement */
1486 if (iValue & D3DTA_COMPLEMENT) {
1487 iValue = iValue & ~D3DTA_COMPLEMENT;
1488 isComplement = TRUE;
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) {
1498 *operand = GL_ONE_MINUS_SRC_ALPHA;
1500 *operand = GL_ONE_MINUS_SRC_COLOR;
1504 *operand = GL_SRC_ALPHA;
1506 *operand = GL_SRC_COLOR;
1510 /* Calculate the source */
1511 switch (iValue & D3DTA_SELECTMASK) {
1512 case D3DTA_CURRENT: *source = GL_PREVIOUS_EXT;
1514 case D3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT;
1516 case D3DTA_TEXTURE: *source = GL_TEXTURE;
1518 case D3DTA_TFACTOR: *source = GL_CONSTANT_EXT;
1520 case D3DTA_SPECULAR:
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
1526 FIXME("Unhandled texture arg D3DTA_SPECULAR\n");
1527 *source = GL_TEXTURE;
1531 FIXME("Unrecognized texture arg %ld\n", iValue);
1532 *source = GL_TEXTURE;
1537 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
1538 GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1541 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
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;
1547 /* stupid compiler */
1555 case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break;
1556 case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break;
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;
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;
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;
1577 case D3DFMT_A8: retVal = GL_ALPHA8; break;
1579 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1583 TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1587 GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1590 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
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;
1596 /* stupid compiler */
1604 case D3DFMT_P8: retVal = GL_COLOR_INDEX; break;
1605 case D3DFMT_A8P8: retVal = GL_COLOR_INDEX; break;
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;
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;
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;
1626 case D3DFMT_A8: retVal = GL_ALPHA; break;
1628 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1633 TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1637 GLenum D3DFmt2GLType(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1640 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1642 case D3DFMT_DXT1: retVal = 0; break;
1643 case D3DFMT_DXT3: retVal = 0; break;
1644 case D3DFMT_DXT5: retVal = 0; break;
1646 /* stupid compiler */
1654 case D3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break;
1655 case D3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break;
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;
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;
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;
1676 case D3DFMT_A8: retVal = GL_ALPHA; break;
1678 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1679 retVal = GL_UNSIGNED_BYTE;
1683 TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1687 SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
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;
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;
1713 case D3DFMT_L8: retVal = 1; break;
1714 case D3DFMT_A4L4: retVal = 1; break;
1715 case D3DFMT_A8L8: retVal = 2; break;
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;
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 */
1726 case D3DFMT_A8: retVal = 1; break;
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);
1735 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1738 TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
1741 #undef GLINFO_LOCATION