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(WINED3DFMT_UNKNOWN);
35 FMT_TO_STR(WINED3DFMT_R8G8B8);
36 FMT_TO_STR(WINED3DFMT_A8R8G8B8);
37 FMT_TO_STR(WINED3DFMT_X8R8G8B8);
38 FMT_TO_STR(WINED3DFMT_R5G6B5);
39 FMT_TO_STR(WINED3DFMT_X1R5G5B5);
40 FMT_TO_STR(WINED3DFMT_A1R5G5B5);
41 FMT_TO_STR(WINED3DFMT_A4R4G4B4);
42 FMT_TO_STR(WINED3DFMT_R3G3B2);
43 FMT_TO_STR(WINED3DFMT_A8);
44 FMT_TO_STR(WINED3DFMT_A8R3G3B2);
45 FMT_TO_STR(WINED3DFMT_X4R4G4B4);
46 FMT_TO_STR(WINED3DFMT_G16R16);
47 FMT_TO_STR(WINED3DFMT_A2R10G10B10);
48 FMT_TO_STR(WINED3DFMT_A16B16G16R16);
49 FMT_TO_STR(WINED3DFMT_A8P8);
50 FMT_TO_STR(WINED3DFMT_P8);
51 FMT_TO_STR(WINED3DFMT_L8);
52 FMT_TO_STR(WINED3DFMT_A8L8);
53 FMT_TO_STR(WINED3DFMT_A4L4);
54 FMT_TO_STR(WINED3DFMT_V8U8);
55 FMT_TO_STR(WINED3DFMT_L6V5U5);
56 FMT_TO_STR(WINED3DFMT_X8L8V8U8);
57 FMT_TO_STR(WINED3DFMT_Q8W8V8U8);
58 FMT_TO_STR(WINED3DFMT_V16U16);
59 FMT_TO_STR(WINED3DFMT_W11V11U10);
60 FMT_TO_STR(WINED3DFMT_A2W10V10U10);
61 FMT_TO_STR(WINED3DFMT_UYVY);
62 FMT_TO_STR(WINED3DFMT_YUY2);
63 FMT_TO_STR(WINED3DFMT_DXT1);
64 FMT_TO_STR(WINED3DFMT_DXT2);
65 FMT_TO_STR(WINED3DFMT_DXT3);
66 FMT_TO_STR(WINED3DFMT_DXT4);
67 FMT_TO_STR(WINED3DFMT_DXT5);
68 FMT_TO_STR(WINED3DFMT_MULTI2_ARGB);
69 FMT_TO_STR(WINED3DFMT_G8R8_G8B8);
70 FMT_TO_STR(WINED3DFMT_R8G8_B8G8);
71 FMT_TO_STR(WINED3DFMT_D16_LOCKABLE);
72 FMT_TO_STR(WINED3DFMT_D32);
73 FMT_TO_STR(WINED3DFMT_D15S1);
74 FMT_TO_STR(WINED3DFMT_D24S8);
75 FMT_TO_STR(WINED3DFMT_D24X8);
76 FMT_TO_STR(WINED3DFMT_D24X4S4);
77 FMT_TO_STR(WINED3DFMT_D16);
78 FMT_TO_STR(WINED3DFMT_D32F_LOCKABLE);
79 FMT_TO_STR(WINED3DFMT_VERTEXDATA);
80 FMT_TO_STR(WINED3DFMT_INDEX16);
81 FMT_TO_STR(WINED3DFMT_INDEX32);
82 FMT_TO_STR(WINED3DFMT_Q16W16V16U16);
83 FMT_TO_STR(WINED3DFMT_R16F);
84 FMT_TO_STR(WINED3DFMT_G16R16F);
85 FMT_TO_STR(WINED3DFMT_A16B16G16R16F);
88 FIXME("Unrecognized %u D3DFORMAT!\n", fmt);
89 return "unrecognized";
93 const char* debug_d3ddevicetype(D3DDEVTYPE devtype) {
95 #define DEVTYPE_TO_STR(dev) case dev: return #dev
96 DEVTYPE_TO_STR(D3DDEVTYPE_HAL);
97 DEVTYPE_TO_STR(D3DDEVTYPE_REF);
98 DEVTYPE_TO_STR(D3DDEVTYPE_SW);
101 FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype);
102 return "unrecognized";
106 const char* debug_d3dusage(DWORD usage) {
108 #define D3DUSAGE_TO_STR(u) case u: return #u
109 D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET);
110 D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL);
111 D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY);
112 D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING);
113 D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP);
114 D3DUSAGE_TO_STR(D3DUSAGE_POINTS);
115 D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES);
116 D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES);
117 D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC);
118 #undef D3DUSAGE_TO_STR
119 case 0: return "none";
121 FIXME("Unrecognized %lu Usage!\n", usage);
122 return "unrecognized";
126 const char* debug_d3dresourcetype(D3DRESOURCETYPE res) {
128 #define RES_TO_STR(res) case res: return #res;
129 RES_TO_STR(D3DRTYPE_SURFACE);
130 RES_TO_STR(D3DRTYPE_VOLUME);
131 RES_TO_STR(D3DRTYPE_TEXTURE);
132 RES_TO_STR(D3DRTYPE_VOLUMETEXTURE);
133 RES_TO_STR(D3DRTYPE_CUBETEXTURE);
134 RES_TO_STR(D3DRTYPE_VERTEXBUFFER);
135 RES_TO_STR(D3DRTYPE_INDEXBUFFER);
138 FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res);
139 return "unrecognized";
143 const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) {
144 switch (PrimitiveType) {
145 #define PRIM_TO_STR(prim) case prim: return #prim;
146 PRIM_TO_STR(D3DPT_POINTLIST);
147 PRIM_TO_STR(D3DPT_LINELIST);
148 PRIM_TO_STR(D3DPT_LINESTRIP);
149 PRIM_TO_STR(D3DPT_TRIANGLELIST);
150 PRIM_TO_STR(D3DPT_TRIANGLESTRIP);
151 PRIM_TO_STR(D3DPT_TRIANGLEFAN);
154 FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
155 return "unrecognized";
159 const char* debug_d3drenderstate(DWORD state) {
161 #define D3DSTATE_TO_STR(u) case u: return #u
162 D3DSTATE_TO_STR(WINED3DRS_ZENABLE );
163 D3DSTATE_TO_STR(WINED3DRS_FILLMODE );
164 D3DSTATE_TO_STR(WINED3DRS_SHADEMODE );
165 D3DSTATE_TO_STR(WINED3DRS_LINEPATTERN );
166 D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE );
167 D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE );
168 D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL );
169 D3DSTATE_TO_STR(WINED3DRS_SRCBLEND );
170 D3DSTATE_TO_STR(WINED3DRS_DESTBLEND );
171 D3DSTATE_TO_STR(WINED3DRS_CULLMODE );
172 D3DSTATE_TO_STR(WINED3DRS_ZFUNC );
173 D3DSTATE_TO_STR(WINED3DRS_ALPHAREF );
174 D3DSTATE_TO_STR(WINED3DRS_ALPHAFUNC );
175 D3DSTATE_TO_STR(WINED3DRS_DITHERENABLE );
176 D3DSTATE_TO_STR(WINED3DRS_ALPHABLENDENABLE );
177 D3DSTATE_TO_STR(WINED3DRS_FOGENABLE );
178 D3DSTATE_TO_STR(WINED3DRS_SPECULARENABLE );
179 D3DSTATE_TO_STR(WINED3DRS_ZVISIBLE );
180 D3DSTATE_TO_STR(WINED3DRS_FOGCOLOR );
181 D3DSTATE_TO_STR(WINED3DRS_FOGTABLEMODE );
182 D3DSTATE_TO_STR(WINED3DRS_FOGSTART );
183 D3DSTATE_TO_STR(WINED3DRS_FOGEND );
184 D3DSTATE_TO_STR(WINED3DRS_FOGDENSITY );
185 D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS );
186 D3DSTATE_TO_STR(WINED3DRS_ZBIAS );
187 D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE );
188 D3DSTATE_TO_STR(WINED3DRS_STENCILENABLE );
189 D3DSTATE_TO_STR(WINED3DRS_STENCILFAIL );
190 D3DSTATE_TO_STR(WINED3DRS_STENCILZFAIL );
191 D3DSTATE_TO_STR(WINED3DRS_STENCILPASS );
192 D3DSTATE_TO_STR(WINED3DRS_STENCILFUNC );
193 D3DSTATE_TO_STR(WINED3DRS_STENCILREF );
194 D3DSTATE_TO_STR(WINED3DRS_STENCILMASK );
195 D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK );
196 D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR );
197 D3DSTATE_TO_STR(WINED3DRS_WRAP0 );
198 D3DSTATE_TO_STR(WINED3DRS_WRAP1 );
199 D3DSTATE_TO_STR(WINED3DRS_WRAP2 );
200 D3DSTATE_TO_STR(WINED3DRS_WRAP3 );
201 D3DSTATE_TO_STR(WINED3DRS_WRAP4 );
202 D3DSTATE_TO_STR(WINED3DRS_WRAP5 );
203 D3DSTATE_TO_STR(WINED3DRS_WRAP6 );
204 D3DSTATE_TO_STR(WINED3DRS_WRAP7 );
205 D3DSTATE_TO_STR(WINED3DRS_CLIPPING );
206 D3DSTATE_TO_STR(WINED3DRS_LIGHTING );
207 D3DSTATE_TO_STR(WINED3DRS_AMBIENT );
208 D3DSTATE_TO_STR(WINED3DRS_FOGVERTEXMODE );
209 D3DSTATE_TO_STR(WINED3DRS_COLORVERTEX );
210 D3DSTATE_TO_STR(WINED3DRS_LOCALVIEWER );
211 D3DSTATE_TO_STR(WINED3DRS_NORMALIZENORMALS );
212 D3DSTATE_TO_STR(WINED3DRS_DIFFUSEMATERIALSOURCE );
213 D3DSTATE_TO_STR(WINED3DRS_SPECULARMATERIALSOURCE );
214 D3DSTATE_TO_STR(WINED3DRS_AMBIENTMATERIALSOURCE );
215 D3DSTATE_TO_STR(WINED3DRS_EMISSIVEMATERIALSOURCE );
216 D3DSTATE_TO_STR(WINED3DRS_VERTEXBLEND );
217 D3DSTATE_TO_STR(WINED3DRS_CLIPPLANEENABLE );
218 D3DSTATE_TO_STR(WINED3DRS_SOFTWAREVERTEXPROCESSING );
219 D3DSTATE_TO_STR(WINED3DRS_POINTSIZE );
220 D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MIN );
221 D3DSTATE_TO_STR(WINED3DRS_POINTSPRITEENABLE );
222 D3DSTATE_TO_STR(WINED3DRS_POINTSCALEENABLE );
223 D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_A );
224 D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_B );
225 D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_C );
226 D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEANTIALIAS );
227 D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEMASK );
228 D3DSTATE_TO_STR(WINED3DRS_PATCHEDGESTYLE );
229 D3DSTATE_TO_STR(WINED3DRS_PATCHSEGMENTS );
230 D3DSTATE_TO_STR(WINED3DRS_DEBUGMONITORTOKEN );
231 D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MAX );
232 D3DSTATE_TO_STR(WINED3DRS_INDEXEDVERTEXBLENDENABLE );
233 D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE );
234 D3DSTATE_TO_STR(WINED3DRS_TWEENFACTOR );
235 D3DSTATE_TO_STR(WINED3DRS_BLENDOP );
236 D3DSTATE_TO_STR(WINED3DRS_POSITIONORDER );
237 D3DSTATE_TO_STR(WINED3DRS_NORMALORDER );
238 #undef D3DSTATE_TO_STR
240 FIXME("Unrecognized %lu render state!\n", state);
241 return "unrecognized";
245 const char* debug_d3dsamplerstate(DWORD state) {
247 #define D3DSTATE_TO_STR(u) case u: return #u
248 D3DSTATE_TO_STR(WINED3DSAMP_BORDERCOLOR );
249 D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSU );
250 D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSV );
251 D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSW );
252 D3DSTATE_TO_STR(WINED3DSAMP_MAGFILTER );
253 D3DSTATE_TO_STR(WINED3DSAMP_MINFILTER );
254 D3DSTATE_TO_STR(WINED3DSAMP_MIPFILTER );
255 D3DSTATE_TO_STR(WINED3DSAMP_MIPMAPLODBIAS);
256 D3DSTATE_TO_STR(WINED3DSAMP_MAXMIPLEVEL );
257 D3DSTATE_TO_STR(WINED3DSAMP_MAXANISOTROPY);
258 #undef D3DSTATE_TO_STR
260 FIXME("Unrecognized %lu texture state!\n", state);
261 return "unrecognized";
265 const char* debug_d3dtexturestate(DWORD state) {
267 #define D3DSTATE_TO_STR(u) case u: return #u
268 D3DSTATE_TO_STR(WINED3DTSS_COLOROP );
269 D3DSTATE_TO_STR(WINED3DTSS_COLORARG1 );
270 D3DSTATE_TO_STR(WINED3DTSS_COLORARG2 );
271 D3DSTATE_TO_STR(WINED3DTSS_ALPHAOP );
272 D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG1 );
273 D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG2 );
274 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT00 );
275 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT01 );
276 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT10 );
277 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT11 );
278 D3DSTATE_TO_STR(WINED3DTSS_TEXCOORDINDEX );
279 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLSCALE );
280 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLOFFSET );
281 D3DSTATE_TO_STR(WINED3DTSS_TEXTURETRANSFORMFLAGS );
282 D3DSTATE_TO_STR(WINED3DTSS_ADDRESSW );
283 D3DSTATE_TO_STR(WINED3DTSS_COLORARG0 );
284 D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG0 );
285 D3DSTATE_TO_STR(WINED3DTSS_RESULTARG );
286 #undef D3DSTATE_TO_STR
288 /* Note D3DTSS are not consecutive, so skip these */
292 FIXME("Unrecognized %lu texture state!\n", state);
293 return "unrecognized";
297 const char* debug_d3dpool(D3DPOOL Pool) {
299 #define POOL_TO_STR(p) case p: return #p;
300 POOL_TO_STR(D3DPOOL_DEFAULT);
301 POOL_TO_STR(D3DPOOL_MANAGED);
302 POOL_TO_STR(D3DPOOL_SYSTEMMEM);
303 POOL_TO_STR(D3DPOOL_SCRATCH);
306 FIXME("Unrecognized %u D3DPOOL!\n", Pool);
307 return "unrecognized";
310 /*****************************************************************************
311 * Useful functions mapping GL <-> D3D values
313 GLenum StencilOp(DWORD op) {
315 case D3DSTENCILOP_KEEP : return GL_KEEP;
316 case D3DSTENCILOP_ZERO : return GL_ZERO;
317 case D3DSTENCILOP_REPLACE : return GL_REPLACE;
318 case D3DSTENCILOP_INCRSAT : return GL_INCR;
319 case D3DSTENCILOP_DECRSAT : return GL_DECR;
320 case D3DSTENCILOP_INVERT : return GL_INVERT;
321 case D3DSTENCILOP_INCR : return GL_INCR_WRAP_EXT;
322 case D3DSTENCILOP_DECR : return GL_DECR_WRAP_EXT;
324 FIXME("Invalid stencil op %ld\n", op);
329 /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
330 #if defined (GL_VERSION_1_3)
332 # define combine_ext 1
333 #elif defined (GL_EXT_texture_env_combine)
334 # define useext(A) A##_EXT
335 # define combine_ext 1
336 #elif defined (GL_ARB_texture_env_combine)
337 # define useext(A) A##_ARB
338 # define combine_ext 1
343 #if !defined(combine_ext)
344 void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
346 FIXME("Requires opengl combine extensions to work\n");
350 /* Setup the texture operations texture stage states */
351 void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
353 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
354 GLenum src1, src2, src3;
355 GLenum opr1, opr2, opr3;
357 GLenum src0_target, src1_target, src2_target;
358 GLenum opr0_target, opr1_target, opr2_target;
360 GLenum opr=0, invopr, src3_target, opr3_target;
361 BOOL Handled = FALSE;
362 IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
364 TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);
368 /* Note: Operations usually involve two ars, src0 and src1 and are operations of
369 the form (a1 <operation> a2). However, some of the more complex operations
370 take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added
371 in a third parameter called a0. Therefore these are operations of the form
372 a0 <operation> a1 <operation> a2, ie the new parameter goes to the front.
374 However, below we treat the new (a0) parameter as src2/opr2, so in the actual
375 functions below, expect their syntax to differ slightly to those listed in the
376 manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2
377 This affects D3DTOP_MULTIPLYADD and D3DTOP_LERP */
380 comb_target = useext(GL_COMBINE_ALPHA);
381 src0_target = useext(GL_SOURCE0_ALPHA);
382 src1_target = useext(GL_SOURCE1_ALPHA);
383 src2_target = useext(GL_SOURCE2_ALPHA);
384 opr0_target = useext(GL_OPERAND0_ALPHA);
385 opr1_target = useext(GL_OPERAND1_ALPHA);
386 opr2_target = useext(GL_OPERAND2_ALPHA);
387 scal_target = GL_ALPHA_SCALE;
390 comb_target = useext(GL_COMBINE_RGB);
391 src0_target = useext(GL_SOURCE0_RGB);
392 src1_target = useext(GL_SOURCE1_RGB);
393 src2_target = useext(GL_SOURCE2_RGB);
394 opr0_target = useext(GL_OPERAND0_RGB);
395 opr1_target = useext(GL_OPERAND1_RGB);
396 opr2_target = useext(GL_OPERAND2_RGB);
397 scal_target = useext(GL_RGB_SCALE);
400 /* From MSDN (WINED3DTSS_ALPHAARG1) :
401 The default argument is D3DTA_TEXTURE. If no texture is set for this stage,
402 then the default argument is D3DTA_DIFFUSE.
403 FIXME? If texture added/removed, may need to reset back as well? */
404 if (isAlpha && This->stateBlock->textures[Stage] == NULL && arg1 == D3DTA_TEXTURE) {
405 GetSrcAndOpFromValue(D3DTA_DIFFUSE, isAlpha, &src1, &opr1);
407 GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1);
409 GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2);
410 GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3);
412 TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);
414 Handled = TRUE; /* Assume will be handled */
416 /* Other texture operations require special extensions: */
417 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
420 invopr = GL_ONE_MINUS_SRC_ALPHA;
421 src3_target = GL_SOURCE3_ALPHA_NV;
422 opr3_target = GL_OPERAND3_ALPHA_NV;
425 invopr = GL_ONE_MINUS_SRC_COLOR;
426 src3_target = GL_SOURCE3_RGB_NV;
427 opr3_target = GL_OPERAND3_RGB_NV;
430 case D3DTOP_DISABLE: /* Only for alpha */
431 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
432 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
433 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
434 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
435 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
436 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
437 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
438 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
439 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
440 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
441 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
442 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
443 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
444 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
445 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
446 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
447 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
448 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
450 case D3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */
451 case D3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */
452 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
453 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
454 if (op == D3DTOP_SELECTARG1) {
455 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
456 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
457 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
458 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
460 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
461 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
462 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
463 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
465 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
466 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
467 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
468 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
469 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
470 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
471 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
472 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
473 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
474 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
475 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
476 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
479 case D3DTOP_MODULATE:
480 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
481 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
482 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
483 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
484 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
485 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
486 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
487 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
488 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
489 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
490 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
491 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
492 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
493 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
494 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
495 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
496 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
497 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
498 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
499 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
501 case D3DTOP_MODULATE2X:
502 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
503 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
504 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
505 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
506 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
507 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
508 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
509 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
510 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
511 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
512 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
513 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
514 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
515 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
516 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
517 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
518 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
519 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
520 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
521 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
523 case D3DTOP_MODULATE4X:
524 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
525 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
526 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
527 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
528 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
529 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
530 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
531 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
532 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
533 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
534 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
535 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
536 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
537 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
538 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
539 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
540 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
541 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
542 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
543 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
547 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
548 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
549 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
550 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
551 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
552 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
553 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
554 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
555 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
556 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
557 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
558 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
559 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
560 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
561 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
562 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
563 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
564 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
565 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
566 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
569 case D3DTOP_ADDSIGNED:
570 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
571 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
572 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
573 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
574 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
575 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
576 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
577 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
578 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
579 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
580 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
581 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
582 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
583 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
584 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
585 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
586 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
587 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
588 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
589 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
592 case D3DTOP_ADDSIGNED2X:
593 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
594 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
595 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
596 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
597 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
598 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
599 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
600 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
601 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
602 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
603 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
604 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
605 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
606 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
607 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
608 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
609 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
610 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
611 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
612 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
615 case D3DTOP_ADDSMOOTH:
616 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
617 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
618 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
619 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
620 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
621 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
622 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
623 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
624 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
625 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
626 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
627 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
628 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
629 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
630 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
631 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
633 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
634 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
635 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
636 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
638 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
639 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
640 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
641 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
644 case D3DTOP_BLENDDIFFUSEALPHA:
645 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
646 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
647 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
648 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
649 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
650 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
651 glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR));
652 checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)");
653 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
654 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
655 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
656 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
657 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
658 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
659 glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR));
660 checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)");
661 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
662 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
663 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
664 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
666 case D3DTOP_BLENDTEXTUREALPHA:
667 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
668 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
669 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
670 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
671 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
672 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
673 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);
674 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");
675 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
676 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
677 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
678 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
679 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
680 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
681 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
682 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
683 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
684 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
685 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
686 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
688 case D3DTOP_BLENDFACTORALPHA:
689 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
690 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
691 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
692 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
693 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
694 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
695 glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT));
696 checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)");
697 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
698 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
699 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
700 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
701 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
702 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
703 glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT));
704 checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)");
705 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
706 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
707 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
708 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
710 case D3DTOP_BLENDTEXTUREALPHAPM:
711 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
712 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
713 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
714 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
715 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
716 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
717 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
718 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
719 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
720 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
721 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
722 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
723 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
724 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
725 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
726 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
727 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
728 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
729 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
730 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
732 case D3DTOP_MODULATEALPHA_ADDCOLOR:
733 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
734 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
735 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */
736 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
737 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
738 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */
739 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
740 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
741 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
742 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
743 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */
744 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
745 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
746 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */
747 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
748 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
750 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
751 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
753 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
754 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
755 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
756 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
758 case D3DTOP_MODULATECOLOR_ADDALPHA:
759 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
760 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
761 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
762 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
763 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
764 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
765 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
766 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
767 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
768 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
769 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
770 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
772 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
773 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
775 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
776 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
777 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
778 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
779 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
780 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
781 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
782 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
784 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
785 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
786 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
787 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
788 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
789 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
790 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
791 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
792 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
793 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
794 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
795 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
796 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
797 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
798 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
799 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
800 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
802 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
803 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
804 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
805 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
807 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
808 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
809 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
810 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
812 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
813 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
814 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
815 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
816 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
818 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
819 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
820 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
821 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
823 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
824 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
825 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
826 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
827 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
828 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
829 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
830 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
832 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
833 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
835 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
836 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
837 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
838 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
839 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
840 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
841 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
842 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
844 case D3DTOP_MULTIPLYADD:
845 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
846 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
847 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
848 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
849 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
850 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
851 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
852 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
853 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
854 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
855 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
856 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
857 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
858 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
859 glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
860 checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
861 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
862 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
863 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
864 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
867 case D3DTOP_BUMPENVMAP:
869 if (GL_SUPPORT(NV_TEXTURE_SHADER)) {
871 texture unit 0: GL_TEXTURE_2D
872 texture unit 1: GL_DOT_PRODUCT_NV
873 texture unit 2: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV
874 texture unit 3: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV
883 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT00];
884 m[0][0] = tmpvalue.f;
885 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT01];
886 m[0][1] = tmpvalue.f;
887 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT10];
888 m[1][0] = tmpvalue.f;
889 tmpvalue.d = This->stateBlock->textureState[Stage][WINED3DTSS_BUMPENVMAT11];
890 m[1][1] = tmpvalue.f;
892 /*FIXME("Stage %d matrix is (%.2f,%.2f),(%.2f,%.2f)\n", Stage, m[0][0], m[0][1], m[1][0], m[1][0]);*/
894 if (FALSE == This->texture_shader_active) {
895 This->texture_shader_active = TRUE;
896 glEnable(GL_TEXTURE_SHADER_NV);
900 glEnable(GL_REGISTER_COMBINERS_NV);
901 glCombinerParameteriNV (GL_NUM_GENERAL_COMBINERS_NV, 1);
902 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
903 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
904 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_RGB);
905 glCombinerInputNV (GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_RGB);
906 glCombinerOutputNV (GL_COMBINER0_NV, GL_RGB, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
907 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV, GL_TEXTURE0_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
908 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
909 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV, GL_TEXTURE2_ARB, GL_SIGNED_IDENTITY_NV, GL_ALPHA);
910 glCombinerInputNV (GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV, GL_NONE, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
911 glCombinerOutputNV (GL_COMBINER0_NV, GL_ALPHA, GL_DISCARD_NV, GL_DISCARD_NV, GL_PRIMARY_COLOR_NV, 0, 0, 0, 0, 0);
912 glDisable (GL_PER_STAGE_CONSTANTS_NV);
913 glCombinerParameteriNV (GL_COLOR_SUM_CLAMP_NV, 0);
914 glFinalCombinerInputNV (GL_VARIABLE_A_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
915 glFinalCombinerInputNV (GL_VARIABLE_B_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
916 glFinalCombinerInputNV (GL_VARIABLE_C_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
917 glFinalCombinerInputNV (GL_VARIABLE_D_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
918 glFinalCombinerInputNV (GL_VARIABLE_E_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
919 glFinalCombinerInputNV (GL_VARIABLE_F_NV, 0, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
920 glFinalCombinerInputNV (GL_VARIABLE_G_NV, GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
924 for (i = 0; i < Stage; i++) {
925 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
927 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
928 checkGLcall("Activate texture..");
930 FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
935 GL_ACTIVETEXTURE(Stage - 1);
936 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
939 GL_ACTIVETEXTURE(Stage);
940 checkGLcall("Activate texture.. to update const color");
941 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV);
942 checkGLcall("glTexEnv");
943 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + Stage - 1);
944 checkGLcall("glTexEnv");
945 glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float*)&m[0]);
946 checkGLcall("glTexEnv");
954 case D3DTOP_BUMPENVMAPLUMINANCE:
960 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
961 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
966 } /* GL_NV_texture_env_combine4 */
968 Handled = TRUE; /* Again, assume handled */
970 case D3DTOP_DISABLE: /* Only for alpha */
971 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
972 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
973 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
974 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT");
975 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
976 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA");
977 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
978 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
980 case D3DTOP_SELECTARG1:
981 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
982 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
983 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
984 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
985 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
986 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
987 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
988 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
990 case D3DTOP_SELECTARG2:
991 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
992 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
993 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
994 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
995 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
996 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
997 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
998 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1000 case D3DTOP_MODULATE:
1001 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1002 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1003 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1004 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1005 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1006 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1007 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1008 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1009 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1010 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1011 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1012 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1014 case D3DTOP_MODULATE2X:
1015 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1016 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1017 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1018 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1019 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1020 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1021 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1022 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1023 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1024 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1025 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1026 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1028 case D3DTOP_MODULATE4X:
1029 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1030 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1031 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1032 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1033 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1034 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1035 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1036 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1037 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1038 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1039 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
1040 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
1043 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1044 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1045 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1046 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1047 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1048 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1049 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1050 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1051 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1052 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1053 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1054 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1056 case D3DTOP_ADDSIGNED:
1057 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1058 checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)");
1059 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1060 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1061 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1062 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1063 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1064 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1065 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1066 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1067 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1068 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1070 case D3DTOP_ADDSIGNED2X:
1071 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1072 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
1073 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1074 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1075 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1076 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1077 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1078 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1079 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1080 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1081 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1082 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1084 case D3DTOP_SUBTRACT:
1085 if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {
1086 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);
1087 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)");
1088 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1089 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1090 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1091 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1092 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1093 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1094 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1095 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1096 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1097 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1099 FIXME("This version of opengl does not support GL_SUBTRACT\n");
1103 case D3DTOP_BLENDDIFFUSEALPHA:
1104 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1105 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1106 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1107 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1108 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1109 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1110 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1111 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1112 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1113 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1114 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR));
1115 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR");
1116 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1117 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1118 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1119 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1121 case D3DTOP_BLENDTEXTUREALPHA:
1122 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1123 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1124 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1125 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1126 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1127 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1128 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1129 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1130 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1131 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1132 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);
1133 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");
1134 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1135 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1136 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1137 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1139 case D3DTOP_BLENDFACTORALPHA:
1140 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1141 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1142 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1143 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1144 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1145 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1146 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1147 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1148 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1149 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1150 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));
1151 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");
1152 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1153 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1154 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1155 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1157 case D3DTOP_BLENDCURRENTALPHA:
1158 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1159 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1160 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1161 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1162 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1163 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1164 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1165 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1166 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1167 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1168 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));
1169 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");
1170 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1171 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1172 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1173 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1175 case D3DTOP_DOTPRODUCT3:
1176 if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
1177 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
1178 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
1179 } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
1180 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
1181 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
1183 FIXME("This version of opengl does not support GL_DOT3\n");
1185 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1186 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1187 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1188 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1189 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1190 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1191 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1192 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1193 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1194 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1197 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1198 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1199 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1200 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1201 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1202 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1203 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1204 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1205 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1206 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1207 glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);
1208 checkGLcall("GL_TEXTURE_ENV, src2_target, src3");
1209 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);
1210 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");
1211 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1212 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1214 case D3DTOP_ADDSMOOTH:
1215 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1216 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1217 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1218 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1219 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1221 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1222 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1223 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1224 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1226 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1227 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1228 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1229 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1230 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1231 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1232 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1233 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1234 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1235 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1236 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1237 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1241 case D3DTOP_BLENDTEXTUREALPHAPM:
1242 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1243 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1244 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1245 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);
1246 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE");
1247 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_ALPHA);
1248 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_APHA");
1249 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1250 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1251 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1252 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1253 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1254 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1255 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1256 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1257 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1258 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1262 case D3DTOP_MODULATEALPHA_ADDCOLOR:
1263 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1264 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1265 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1266 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1267 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1269 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1270 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1271 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1272 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1274 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1275 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1276 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1277 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1278 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1279 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1280 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1281 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1282 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1283 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1284 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1285 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1289 case D3DTOP_MODULATECOLOR_ADDALPHA:
1290 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1291 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1292 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1293 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1294 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1295 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1296 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1297 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1298 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1300 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1301 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1302 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1303 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1305 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
1306 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
1307 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1308 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1309 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1310 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1311 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1312 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1316 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1317 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1318 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1319 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1320 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1321 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1323 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1324 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1325 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1326 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1328 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1329 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1330 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1331 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1332 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1333 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1334 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1335 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1336 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1337 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1338 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1339 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1343 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1344 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1345 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1346 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1347 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1348 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1350 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1351 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1352 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1353 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1355 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1356 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1357 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1358 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1360 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1361 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1362 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1363 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1365 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
1366 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
1367 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1368 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1369 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1370 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1371 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1372 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1376 case D3DTOP_MULTIPLYADD:
1377 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
1378 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
1379 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
1380 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
1381 checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
1382 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
1383 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
1384 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
1385 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
1386 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
1387 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
1388 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1389 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1390 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1391 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1392 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1393 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1402 BOOL combineOK = TRUE;
1403 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1407 op2 = This->stateBlock->textureState[Stage][WINED3DTSS_COLOROP];
1409 op2 = This->stateBlock->textureState[Stage][WINED3DTSS_ALPHAOP];
1412 /* Note: If COMBINE4 in effect can't go back to combine! */
1414 case D3DTOP_ADDSMOOTH:
1415 case D3DTOP_BLENDTEXTUREALPHAPM:
1416 case D3DTOP_MODULATEALPHA_ADDCOLOR:
1417 case D3DTOP_MODULATECOLOR_ADDALPHA:
1418 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1419 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1420 case D3DTOP_MULTIPLYADD:
1421 /* Ignore those implemented in both cases */
1423 case D3DTOP_SELECTARG1:
1424 case D3DTOP_SELECTARG2:
1429 FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
1437 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
1438 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
1447 /* After all the extensions, if still unhandled, report fixme */
1448 FIXME("Unhandled texture operation %d\n", op);
1449 #undef GLINFO_LOCATION
1453 /* Setup this textures matrix according to the texture flags*/
1454 void set_texture_matrix(const float *smat, DWORD flags)
1458 glMatrixMode(GL_TEXTURE);
1460 if (flags == D3DTTFF_DISABLE) {
1462 checkGLcall("glLoadIdentity()");
1466 if (flags == (D3DTTFF_COUNT1|D3DTTFF_PROJECTED)) {
1467 ERR("Invalid texture transform flags: D3DTTFF_COUNT1|D3DTTFF_PROJECTED\n");
1468 checkGLcall("glLoadIdentity()");
1472 memcpy(mat, smat, 16*sizeof(float));
1474 switch (flags & ~D3DTTFF_PROJECTED) {
1475 case D3DTTFF_COUNT1: mat[1] = mat[5] = mat[9] = mat[13] = 0;
1476 case D3DTTFF_COUNT2: mat[2] = mat[6] = mat[10] = mat[14] = 0;
1477 default: mat[3] = mat[7] = mat[11] = 0, mat[15] = 1;
1480 if (flags & D3DTTFF_PROJECTED) switch (flags & ~D3DTTFF_PROJECTED) {
1481 case D3DTTFF_COUNT2:
1482 mat[3] = mat[1], mat[7] = mat[5], mat[11] = mat[9], mat[15] = mat[13];
1483 mat[1] = mat[5] = mat[9] = mat[13] = 0;
1485 case D3DTTFF_COUNT3:
1486 mat[3] = mat[2], mat[7] = mat[6], mat[11] = mat[10], mat[15] = mat[14];
1487 mat[2] = mat[6] = mat[10] = mat[14] = 0;
1491 checkGLcall("glLoadMatrixf(mat)");
1494 void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand)
1496 BOOL isAlphaReplicate = FALSE;
1497 BOOL isComplement = FALSE;
1499 *operand = GL_SRC_COLOR;
1500 *source = GL_TEXTURE;
1502 /* Catch alpha replicate */
1503 if (iValue & D3DTA_ALPHAREPLICATE) {
1504 iValue = iValue & ~D3DTA_ALPHAREPLICATE;
1505 isAlphaReplicate = TRUE;
1508 /* Catch Complement */
1509 if (iValue & D3DTA_COMPLEMENT) {
1510 iValue = iValue & ~D3DTA_COMPLEMENT;
1511 isComplement = TRUE;
1514 /* Calculate the operand */
1515 if (isAlphaReplicate && !isComplement) {
1516 *operand = GL_SRC_ALPHA;
1517 } else if (isAlphaReplicate && isComplement) {
1518 *operand = GL_ONE_MINUS_SRC_ALPHA;
1519 } else if (isComplement) {
1521 *operand = GL_ONE_MINUS_SRC_ALPHA;
1523 *operand = GL_ONE_MINUS_SRC_COLOR;
1527 *operand = GL_SRC_ALPHA;
1529 *operand = GL_SRC_COLOR;
1533 /* Calculate the source */
1534 switch (iValue & D3DTA_SELECTMASK) {
1535 case D3DTA_CURRENT: *source = GL_PREVIOUS_EXT;
1537 case D3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT;
1539 case D3DTA_TEXTURE: *source = GL_TEXTURE;
1541 case D3DTA_TFACTOR: *source = GL_CONSTANT_EXT;
1543 case D3DTA_SPECULAR:
1545 * According to the GL_ARB_texture_env_combine specs, SPECULAR is
1546 * 'Secondary color' and isn't supported until base GL supports it
1547 * There is no concept of temp registers as far as I can tell
1549 FIXME("Unhandled texture arg D3DTA_SPECULAR\n");
1550 *source = GL_TEXTURE;
1554 FIXME("Unrecognized texture arg %ld\n", iValue);
1555 *source = GL_TEXTURE;
1560 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
1561 GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1564 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1566 case WINED3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
1567 case WINED3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
1568 case WINED3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
1570 /* stupid compiler */
1578 case WINED3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break;
1579 case WINED3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break;
1581 case WINED3DFMT_L8: retVal = GL_LUMINANCE8; break;
1582 case WINED3DFMT_A8L8: retVal = GL_LUMINANCE8_ALPHA8; break;
1583 case WINED3DFMT_A4L4: retVal = GL_LUMINANCE4_ALPHA4; break;
1585 case WINED3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break;
1586 case WINED3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
1587 case WINED3DFMT_L6V5U5: retVal = GL_COLOR_INDEX8_EXT; break;
1588 case WINED3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
1590 case WINED3DFMT_R3G3B2: retVal = GL_R3_G3_B2; break;
1591 case WINED3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
1592 case WINED3DFMT_R8G8B8: retVal = GL_RGB8; break;
1593 case WINED3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break;
1594 case WINED3DFMT_X1R5G5B5: retVal = GL_RGB5_A1; break;
1595 case WINED3DFMT_A4R4G4B4: retVal = GL_RGBA4; break;
1596 case WINED3DFMT_X4R4G4B4: retVal = GL_RGBA4; break;
1597 case WINED3DFMT_A8R8G8B8: retVal = GL_RGBA8; break;
1598 case WINED3DFMT_X8R8G8B8: retVal = GL_RGBA8; break;
1600 case WINED3DFMT_A8: retVal = GL_ALPHA8; break;
1602 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1606 TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1610 GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1613 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1615 case WINED3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
1616 case WINED3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
1617 case WINED3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
1619 /* stupid compiler */
1627 case WINED3DFMT_P8: retVal = GL_COLOR_INDEX; break;
1628 case WINED3DFMT_A8P8: retVal = GL_COLOR_INDEX; break;
1630 case WINED3DFMT_L8: retVal = GL_LUMINANCE; break;
1631 case WINED3DFMT_A8L8: retVal = GL_LUMINANCE_ALPHA; break;
1632 case WINED3DFMT_A4L4: retVal = GL_LUMINANCE_ALPHA; break;
1634 case WINED3DFMT_V8U8: retVal = GL_COLOR_INDEX; break;
1635 case WINED3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
1636 case WINED3DFMT_L6V5U5: retVal = GL_COLOR_INDEX; break;
1637 case WINED3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
1639 case WINED3DFMT_R3G3B2: retVal = GL_BGR; break;
1640 case WINED3DFMT_R5G6B5: retVal = GL_RGB; break;
1641 case WINED3DFMT_R8G8B8: retVal = GL_RGB; break;
1642 case WINED3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
1643 case WINED3DFMT_X1R5G5B5: retVal = GL_BGRA; break;
1644 case WINED3DFMT_A4R4G4B4: retVal = GL_BGRA; break;
1645 case WINED3DFMT_X4R4G4B4: retVal = GL_BGRA; break;
1646 case WINED3DFMT_A8R8G8B8: retVal = GL_BGRA; break;
1647 case WINED3DFMT_X8R8G8B8: retVal = GL_BGRA; break;
1649 case WINED3DFMT_A8: retVal = GL_ALPHA; break;
1651 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1656 TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1660 GLenum D3DFmt2GLType(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1663 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
1665 case WINED3DFMT_DXT1: retVal = 0; break;
1666 case WINED3DFMT_DXT3: retVal = 0; break;
1667 case WINED3DFMT_DXT5: retVal = 0; break;
1669 /* stupid compiler */
1677 case WINED3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break;
1678 case WINED3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break;
1680 case WINED3DFMT_L8: retVal = GL_UNSIGNED_BYTE; break;
1681 case WINED3DFMT_A8L8: retVal = GL_UNSIGNED_BYTE; break;
1682 case WINED3DFMT_A4L4: retVal = GL_UNSIGNED_BYTE; break;
1684 case WINED3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break;
1685 case WINED3DFMT_V16U16: retVal = GL_UNSIGNED_SHORT; break;
1686 case WINED3DFMT_L6V5U5: retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
1687 case WINED3DFMT_X8L8V8U8: retVal = GL_UNSIGNED_BYTE; break;
1689 case WINED3DFMT_R3G3B2: retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
1690 case WINED3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break;
1691 case WINED3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break;
1692 case WINED3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
1693 case WINED3DFMT_X1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
1694 case WINED3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
1695 case WINED3DFMT_X4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
1696 case WINED3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
1697 case WINED3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
1699 case WINED3DFMT_A8: retVal = GL_ALPHA; break;
1701 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1702 retVal = GL_UNSIGNED_BYTE;
1706 TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
1710 SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
1715 case WINED3DFMT_R3G3B2: retVal = 1; break;
1716 case WINED3DFMT_R5G6B5: retVal = 2; break;
1717 case WINED3DFMT_R8G8B8: retVal = 3; break;
1718 case WINED3DFMT_A1R5G5B5: retVal = 2; break;
1719 case WINED3DFMT_X1R5G5B5: retVal = 2; break;
1720 case WINED3DFMT_A4R4G4B4: retVal = 2; break;
1721 case WINED3DFMT_X4R4G4B4: retVal = 2; break;
1722 case WINED3DFMT_A8R8G8B8: retVal = 4; break;
1723 case WINED3DFMT_X8R8G8B8: retVal = 4; break;
1725 case WINED3DFMT_P8: retVal = 1; break;
1726 case WINED3DFMT_A8P8: retVal = 2; break;
1727 /* depth/stencil buffer */
1728 case WINED3DFMT_D16_LOCKABLE: retVal = 2; break;
1729 case WINED3DFMT_D16: retVal = 2; break;
1730 case WINED3DFMT_D32: retVal = 4; break;
1731 case WINED3DFMT_D15S1: retVal = 2; break;
1732 case WINED3DFMT_D24X4S4: retVal = 4; break;
1733 case WINED3DFMT_D24S8: retVal = 4; break;
1734 case WINED3DFMT_D24X8: retVal = 4; break;
1736 case WINED3DFMT_L8: retVal = 1; break;
1737 case WINED3DFMT_A4L4: retVal = 1; break;
1738 case WINED3DFMT_A8L8: retVal = 2; break;
1740 case WINED3DFMT_V8U8: retVal = 2; break;
1741 case WINED3DFMT_L6V5U5: retVal = 2; break;
1742 case WINED3DFMT_V16U16: retVal = 4; break;
1743 case WINED3DFMT_X8L8V8U8: retVal = 4; break;
1745 case WINED3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */
1746 case WINED3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
1747 case WINED3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
1749 case WINED3DFMT_A8: retVal = 1; break;
1751 case WINED3DFMT_UNKNOWN:
1752 /* Guess at the highest value of the above */
1753 TRACE("WINED3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt);
1758 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
1761 TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
1764 #undef GLINFO_LOCATION