blob: 9c4d148412f14bf9dee89f36ce99ea09276ef6f1 [file] [log] [blame]
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +00001/*
2 * D3D8 utils
3 *
4 * Copyright 2002-2003 Jason Edmeades
5 * Raphael Junqueira
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22#include "config.h"
23
24#include <math.h>
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000025#include <stdarg.h>
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +000026
27#define NONAMELESSUNION
28#define NONAMELESSSTRUCT
29#include "windef.h"
30#include "winbase.h"
31#include "winuser.h"
32#include "wingdi.h"
33#include "wine/debug.h"
34
35#include "d3d8_private.h"
36
37WINE_DEFAULT_DEBUG_CHANNEL(d3d);
38
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +000039const char* debug_d3ddevicetype(D3DDEVTYPE devtype) {
40 switch (devtype) {
41#define DEVTYPE_TO_STR(dev) case dev: return #dev
42 DEVTYPE_TO_STR(D3DDEVTYPE_HAL);
43 DEVTYPE_TO_STR(D3DDEVTYPE_REF);
44 DEVTYPE_TO_STR(D3DDEVTYPE_SW);
45#undef DEVTYPE_TO_STR
46 default:
47 FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype);
48 return "unrecognized";
49 }
50}
51
52const char* debug_d3dusage(DWORD usage) {
53 switch (usage) {
54#define D3DUSAGE_TO_STR(u) case u: return #u
55 D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET);
56 D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL);
57 D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY);
58 D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING);
59 D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP);
60 D3DUSAGE_TO_STR(D3DUSAGE_POINTS);
61 D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES);
62 D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES);
63 D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC);
64#undef D3DUSAGE_TO_STR
65 case 0: return "none";
66 default:
67 FIXME("Unrecognized %lu Usage!\n", usage);
68 return "unrecognized";
69 }
70}
71
72const char* debug_d3dformat(D3DFORMAT fmt) {
73 switch (fmt) {
74#define FMT_TO_STR(fmt) case fmt: return #fmt
75 FMT_TO_STR(D3DFMT_UNKNOWN);
76 FMT_TO_STR(D3DFMT_R8G8B8);
77 FMT_TO_STR(D3DFMT_A8R8G8B8);
78 FMT_TO_STR(D3DFMT_X8R8G8B8);
79 FMT_TO_STR(D3DFMT_R5G6B5);
80 FMT_TO_STR(D3DFMT_X1R5G5B5);
81 FMT_TO_STR(D3DFMT_A1R5G5B5);
82 FMT_TO_STR(D3DFMT_A4R4G4B4);
83 FMT_TO_STR(D3DFMT_R3G3B2);
84 FMT_TO_STR(D3DFMT_A8);
85 FMT_TO_STR(D3DFMT_A8R3G3B2);
86 FMT_TO_STR(D3DFMT_X4R4G4B4);
87 FMT_TO_STR(D3DFMT_A8P8);
88 FMT_TO_STR(D3DFMT_P8);
89 FMT_TO_STR(D3DFMT_L8);
90 FMT_TO_STR(D3DFMT_A8L8);
91 FMT_TO_STR(D3DFMT_A4L4);
92 FMT_TO_STR(D3DFMT_V8U8);
93 FMT_TO_STR(D3DFMT_L6V5U5);
94 FMT_TO_STR(D3DFMT_X8L8V8U8);
95 FMT_TO_STR(D3DFMT_Q8W8V8U8);
96 FMT_TO_STR(D3DFMT_V16U16);
97 FMT_TO_STR(D3DFMT_W11V11U10);
98 FMT_TO_STR(D3DFMT_UYVY);
99 FMT_TO_STR(D3DFMT_YUY2);
100 FMT_TO_STR(D3DFMT_DXT1);
101 FMT_TO_STR(D3DFMT_DXT2);
102 FMT_TO_STR(D3DFMT_DXT3);
103 FMT_TO_STR(D3DFMT_DXT4);
104 FMT_TO_STR(D3DFMT_DXT5);
105 FMT_TO_STR(D3DFMT_D16_LOCKABLE);
106 FMT_TO_STR(D3DFMT_D32);
107 FMT_TO_STR(D3DFMT_D15S1);
108 FMT_TO_STR(D3DFMT_D24S8);
109 FMT_TO_STR(D3DFMT_D16);
110 FMT_TO_STR(D3DFMT_D24X8);
111 FMT_TO_STR(D3DFMT_D24X4S4);
112 FMT_TO_STR(D3DFMT_VERTEXDATA);
113 FMT_TO_STR(D3DFMT_INDEX16);
114 FMT_TO_STR(D3DFMT_INDEX32);
115#undef FMT_TO_STR
116 default:
117 FIXME("Unrecognized %u D3DFORMAT!\n", fmt);
118 return "unrecognized";
119 }
120}
121
122const char* debug_d3dressourcetype(D3DRESOURCETYPE res) {
123 switch (res) {
124#define RES_TO_STR(res) case res: return #res;
125 RES_TO_STR(D3DRTYPE_SURFACE);
126 RES_TO_STR(D3DRTYPE_VOLUME);
127 RES_TO_STR(D3DRTYPE_TEXTURE);
128 RES_TO_STR(D3DRTYPE_VOLUMETEXTURE);
129 RES_TO_STR(D3DRTYPE_CUBETEXTURE);
130 RES_TO_STR(D3DRTYPE_VERTEXBUFFER);
131 RES_TO_STR(D3DRTYPE_INDEXBUFFER);
132#undef RES_TO_STR
133 default:
134 FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res);
135 return "unrecognized";
136 }
137}
138
139const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) {
140 switch (PrimitiveType) {
141#define PRIM_TO_STR(prim) case prim: return #prim;
142 PRIM_TO_STR(D3DPT_POINTLIST);
143 PRIM_TO_STR(D3DPT_LINELIST);
144 PRIM_TO_STR(D3DPT_LINESTRIP);
145 PRIM_TO_STR(D3DPT_TRIANGLELIST);
146 PRIM_TO_STR(D3DPT_TRIANGLESTRIP);
147 PRIM_TO_STR(D3DPT_TRIANGLEFAN);
148#undef PRIM_TO_STR
149 default:
150 FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
151 return "unrecognized";
152 }
153}
154
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000155const char* debug_d3dpool(D3DPOOL Pool) {
156 switch (Pool) {
157#define POOL_TO_STR(p) case p: return #p;
158 POOL_TO_STR(D3DPOOL_DEFAULT);
159 POOL_TO_STR(D3DPOOL_MANAGED);
160 POOL_TO_STR(D3DPOOL_SYSTEMMEM);
161 POOL_TO_STR(D3DPOOL_SCRATCH);
162#undef POOL_TO_STR
163 default:
164 FIXME("Unrecognized %u D3DPOOL!\n", Pool);
165 return "unrecognized";
166 }
167}
168
Jason Edmeades21a09282003-06-13 19:14:34 +0000169const char* debug_d3drenderstate(DWORD state) {
170 switch (state) {
171#define D3DSTATE_TO_STR(u) case u: return #u
172 D3DSTATE_TO_STR(D3DRS_ZENABLE );
173 D3DSTATE_TO_STR(D3DRS_FILLMODE );
174 D3DSTATE_TO_STR(D3DRS_SHADEMODE );
175 D3DSTATE_TO_STR(D3DRS_LINEPATTERN );
176 D3DSTATE_TO_STR(D3DRS_ZWRITEENABLE );
177 D3DSTATE_TO_STR(D3DRS_ALPHATESTENABLE );
178 D3DSTATE_TO_STR(D3DRS_LASTPIXEL );
179 D3DSTATE_TO_STR(D3DRS_SRCBLEND );
180 D3DSTATE_TO_STR(D3DRS_DESTBLEND );
181 D3DSTATE_TO_STR(D3DRS_CULLMODE );
182 D3DSTATE_TO_STR(D3DRS_ZFUNC );
183 D3DSTATE_TO_STR(D3DRS_ALPHAREF );
184 D3DSTATE_TO_STR(D3DRS_ALPHAFUNC );
185 D3DSTATE_TO_STR(D3DRS_DITHERENABLE );
186 D3DSTATE_TO_STR(D3DRS_ALPHABLENDENABLE );
187 D3DSTATE_TO_STR(D3DRS_FOGENABLE );
188 D3DSTATE_TO_STR(D3DRS_SPECULARENABLE );
189 D3DSTATE_TO_STR(D3DRS_ZVISIBLE );
190 D3DSTATE_TO_STR(D3DRS_FOGCOLOR );
191 D3DSTATE_TO_STR(D3DRS_FOGTABLEMODE );
192 D3DSTATE_TO_STR(D3DRS_FOGSTART );
193 D3DSTATE_TO_STR(D3DRS_FOGEND );
194 D3DSTATE_TO_STR(D3DRS_FOGDENSITY );
195 D3DSTATE_TO_STR(D3DRS_EDGEANTIALIAS );
196 D3DSTATE_TO_STR(D3DRS_ZBIAS );
197 D3DSTATE_TO_STR(D3DRS_RANGEFOGENABLE );
198 D3DSTATE_TO_STR(D3DRS_STENCILENABLE );
199 D3DSTATE_TO_STR(D3DRS_STENCILFAIL );
200 D3DSTATE_TO_STR(D3DRS_STENCILZFAIL );
201 D3DSTATE_TO_STR(D3DRS_STENCILPASS );
202 D3DSTATE_TO_STR(D3DRS_STENCILFUNC );
203 D3DSTATE_TO_STR(D3DRS_STENCILREF );
204 D3DSTATE_TO_STR(D3DRS_STENCILMASK );
205 D3DSTATE_TO_STR(D3DRS_STENCILWRITEMASK );
206 D3DSTATE_TO_STR(D3DRS_TEXTUREFACTOR );
207 D3DSTATE_TO_STR(D3DRS_WRAP0 );
208 D3DSTATE_TO_STR(D3DRS_WRAP1 );
209 D3DSTATE_TO_STR(D3DRS_WRAP2 );
210 D3DSTATE_TO_STR(D3DRS_WRAP3 );
211 D3DSTATE_TO_STR(D3DRS_WRAP4 );
212 D3DSTATE_TO_STR(D3DRS_WRAP5 );
213 D3DSTATE_TO_STR(D3DRS_WRAP6 );
214 D3DSTATE_TO_STR(D3DRS_WRAP7 );
215 D3DSTATE_TO_STR(D3DRS_CLIPPING );
216 D3DSTATE_TO_STR(D3DRS_LIGHTING );
217 D3DSTATE_TO_STR(D3DRS_AMBIENT );
218 D3DSTATE_TO_STR(D3DRS_FOGVERTEXMODE );
219 D3DSTATE_TO_STR(D3DRS_COLORVERTEX );
220 D3DSTATE_TO_STR(D3DRS_LOCALVIEWER );
221 D3DSTATE_TO_STR(D3DRS_NORMALIZENORMALS );
222 D3DSTATE_TO_STR(D3DRS_DIFFUSEMATERIALSOURCE );
223 D3DSTATE_TO_STR(D3DRS_SPECULARMATERIALSOURCE );
224 D3DSTATE_TO_STR(D3DRS_AMBIENTMATERIALSOURCE );
225 D3DSTATE_TO_STR(D3DRS_EMISSIVEMATERIALSOURCE );
226 D3DSTATE_TO_STR(D3DRS_VERTEXBLEND );
227 D3DSTATE_TO_STR(D3DRS_CLIPPLANEENABLE );
228 D3DSTATE_TO_STR(D3DRS_SOFTWAREVERTEXPROCESSING );
229 D3DSTATE_TO_STR(D3DRS_POINTSIZE );
230 D3DSTATE_TO_STR(D3DRS_POINTSIZE_MIN );
231 D3DSTATE_TO_STR(D3DRS_POINTSPRITEENABLE );
232 D3DSTATE_TO_STR(D3DRS_POINTSCALEENABLE );
233 D3DSTATE_TO_STR(D3DRS_POINTSCALE_A );
234 D3DSTATE_TO_STR(D3DRS_POINTSCALE_B );
235 D3DSTATE_TO_STR(D3DRS_POINTSCALE_C );
236 D3DSTATE_TO_STR(D3DRS_MULTISAMPLEANTIALIAS );
237 D3DSTATE_TO_STR(D3DRS_MULTISAMPLEMASK );
238 D3DSTATE_TO_STR(D3DRS_PATCHEDGESTYLE );
239 D3DSTATE_TO_STR(D3DRS_PATCHSEGMENTS );
240 D3DSTATE_TO_STR(D3DRS_DEBUGMONITORTOKEN );
241 D3DSTATE_TO_STR(D3DRS_POINTSIZE_MAX );
242 D3DSTATE_TO_STR(D3DRS_INDEXEDVERTEXBLENDENABLE );
243 D3DSTATE_TO_STR(D3DRS_COLORWRITEENABLE );
244 D3DSTATE_TO_STR(D3DRS_TWEENFACTOR );
245 D3DSTATE_TO_STR(D3DRS_BLENDOP );
246 D3DSTATE_TO_STR(D3DRS_POSITIONORDER );
247 D3DSTATE_TO_STR(D3DRS_NORMALORDER );
248#undef D3DSTATE_TO_STR
249 default:
250 FIXME("Unrecognized %lu render state!\n", state);
251 return "unrecognized";
252 }
253}
254
255const char* debug_d3dtexturestate(DWORD state) {
256 switch (state) {
257#define D3DSTATE_TO_STR(u) case u: return #u
258 D3DSTATE_TO_STR(D3DTSS_COLOROP );
259 D3DSTATE_TO_STR(D3DTSS_COLORARG1 );
260 D3DSTATE_TO_STR(D3DTSS_COLORARG2 );
261 D3DSTATE_TO_STR(D3DTSS_ALPHAOP );
262 D3DSTATE_TO_STR(D3DTSS_ALPHAARG1 );
263 D3DSTATE_TO_STR(D3DTSS_ALPHAARG2 );
264 D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT00 );
265 D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT01 );
266 D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT10 );
267 D3DSTATE_TO_STR(D3DTSS_BUMPENVMAT11 );
268 D3DSTATE_TO_STR(D3DTSS_TEXCOORDINDEX );
269 D3DSTATE_TO_STR(D3DTSS_ADDRESSU );
270 D3DSTATE_TO_STR(D3DTSS_ADDRESSV );
271 D3DSTATE_TO_STR(D3DTSS_BORDERCOLOR );
272 D3DSTATE_TO_STR(D3DTSS_MAGFILTER );
273 D3DSTATE_TO_STR(D3DTSS_MINFILTER );
274 D3DSTATE_TO_STR(D3DTSS_MIPFILTER );
275 D3DSTATE_TO_STR(D3DTSS_MIPMAPLODBIAS );
276 D3DSTATE_TO_STR(D3DTSS_MAXMIPLEVEL );
277 D3DSTATE_TO_STR(D3DTSS_MAXANISOTROPY );
278 D3DSTATE_TO_STR(D3DTSS_BUMPENVLSCALE );
279 D3DSTATE_TO_STR(D3DTSS_BUMPENVLOFFSET );
280 D3DSTATE_TO_STR(D3DTSS_TEXTURETRANSFORMFLAGS );
281 D3DSTATE_TO_STR(D3DTSS_ADDRESSW );
282 D3DSTATE_TO_STR(D3DTSS_COLORARG0 );
283 D3DSTATE_TO_STR(D3DTSS_ALPHAARG0 );
284 D3DSTATE_TO_STR(D3DTSS_RESULTARG );
285#undef D3DSTATE_TO_STR
286 case 12:
287 /* Note D3DTSS are not consecutive, so skip these */
288 return "unused";
289 break;
290 default:
291 FIXME("Unrecognized %lu texture state!\n", state);
292 return "unrecognized";
293 }
294}
295
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000296/*
297 * Simple utility routines used for dx -> gl mapping of byte formats
298 */
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000299int D3DPrimitiveListGetVertexSize(D3DPRIMITIVETYPE PrimitiveType, int iNumPrim) {
300 switch (PrimitiveType) {
301 case D3DPT_POINTLIST: return iNumPrim;
302 case D3DPT_LINELIST: return iNumPrim * 2;
303 case D3DPT_LINESTRIP: return iNumPrim + 1;
304 case D3DPT_TRIANGLELIST: return iNumPrim * 3;
305 case D3DPT_TRIANGLESTRIP: return iNumPrim + 2;
306 case D3DPT_TRIANGLEFAN: return iNumPrim + 2;
307 default:
308 FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
309 return 0;
310 }
311}
312
313int D3DPrimitive2GLenum(D3DPRIMITIVETYPE PrimitiveType) {
314 switch (PrimitiveType) {
315 case D3DPT_POINTLIST: return GL_POINTS;
316 case D3DPT_LINELIST: return GL_LINES;
317 case D3DPT_LINESTRIP: return GL_LINE_STRIP;
318 case D3DPT_TRIANGLELIST: return GL_TRIANGLES;
319 case D3DPT_TRIANGLESTRIP: return GL_TRIANGLE_STRIP;
320 case D3DPT_TRIANGLEFAN: return GL_TRIANGLE_FAN;
321 default:
322 FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType);
323 return GL_POLYGON;
324 }
325}
326
327int D3DFVFGetSize(D3DFORMAT fvf) {
328 int ret = 0;
329 if (fvf & D3DFVF_XYZ) ret += 3 * sizeof(float);
330 else if (fvf & D3DFVF_XYZRHW) ret += 4 * sizeof(float);
331 if (fvf & D3DFVF_NORMAL) ret += 3 * sizeof(float);
332 if (fvf & D3DFVF_PSIZE) ret += sizeof(float);
333 if (fvf & D3DFVF_DIFFUSE) ret += sizeof(DWORD);
334 if (fvf & D3DFVF_SPECULAR) ret += sizeof(DWORD);
335 /*if (fvf & D3DFVF_TEX1) ret += 1;*/
336 return ret;
337}
338
339GLenum D3DFmt2GLDepthFmt(D3DFORMAT fmt) {
340 switch (fmt) {
341 /* depth/stencil buffer */
342 case D3DFMT_D16_LOCKABLE:
343 case D3DFMT_D16:
344 case D3DFMT_D15S1:
345 case D3DFMT_D24X4S4:
346 case D3DFMT_D24S8:
347 case D3DFMT_D24X8:
348 case D3DFMT_D32:
349 return GL_DEPTH_COMPONENT;
350 default:
351 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
352 }
353 return 0;
354}
355
356GLenum D3DFmt2GLDepthType(D3DFORMAT fmt) {
357 switch (fmt) {
358 /* depth/stencil buffer */
359 case D3DFMT_D15S1:
360 case D3DFMT_D16_LOCKABLE:
361 case D3DFMT_D16:
362 return GL_UNSIGNED_SHORT;
363 case D3DFMT_D24X4S4:
364 case D3DFMT_D24S8:
365 case D3DFMT_D24X8:
366 case D3DFMT_D32:
367 return GL_UNSIGNED_INT;
368 default:
369 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
370 }
371 return 0;
372}
373
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000374SHORT D3DFmtGetBpp(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
375 SHORT retVal;
376
377 switch (fmt) {
378 /* color buffer */
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000379 case D3DFMT_R3G3B2: retVal = 1; break;
380 case D3DFMT_R5G6B5: retVal = 2; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000381 case D3DFMT_R8G8B8: retVal = 3; break;
382 case D3DFMT_A1R5G5B5: retVal = 2; break;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000383 case D3DFMT_X1R5G5B5: retVal = 2; break;
384 case D3DFMT_A4R4G4B4: retVal = 2; break;
385 case D3DFMT_X4R4G4B4: retVal = 2; break;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000386 case D3DFMT_A8R8G8B8: retVal = 4; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000387 case D3DFMT_X8R8G8B8: retVal = 4; break;
388 /* Paletted */
389 case D3DFMT_P8: retVal = 1; break;
390 case D3DFMT_A8P8: retVal = 2; break;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000391 /* depth/stencil buffer */
392 case D3DFMT_D16_LOCKABLE: retVal = 2; break;
393 case D3DFMT_D16: retVal = 2; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000394 case D3DFMT_D32: retVal = 4; break;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000395 case D3DFMT_D15S1: retVal = 2; break;
396 case D3DFMT_D24X4S4: retVal = 4; break;
397 case D3DFMT_D24S8: retVal = 4; break;
398 case D3DFMT_D24X8: retVal = 4; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000399 /* Luminance */
400 case D3DFMT_L8: retVal = 1; break;
401 case D3DFMT_A4L4: retVal = 1; break;
402 case D3DFMT_A8L8: retVal = 2; break;
403 /* Bump */
404 case D3DFMT_V8U8: retVal = 2; break;
405 case D3DFMT_L6V5U5: retVal = 2; break;
406 case D3DFMT_V16U16: retVal = 4; break;
407 case D3DFMT_X8L8V8U8: retVal = 4; break;
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000408 /* Compressed */
409 case D3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */
410 case D3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
411 case D3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000412 /* to see */
413 case D3DFMT_A8: retVal = 1; break;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000414 /* unknown */
415 case D3DFMT_UNKNOWN:
416 /* Guess at the highest value of the above */
417 TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt);
418 retVal = 4;
419 break;
420
421 default:
422 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
423 retVal = 4;
424 }
425 TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
426 return retVal;
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000427}
428
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000429GLint D3DFmt2GLIntFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
Jason Edmeadesbeb4ac82003-08-15 03:50:08 +0000430 GLint retVal = 0;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000431
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000432 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
433 switch (fmt) {
434 case D3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
435 case D3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
436 case D3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
437 default:
438 /* stupid compiler */
439 break;
440 }
441 }
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000442
Jason Edmeadesbeb4ac82003-08-15 03:50:08 +0000443 if (retVal == 0) {
444 switch (fmt) {
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000445 /* Paletted */
Jason Edmeadesbeb4ac82003-08-15 03:50:08 +0000446 case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break;
447 case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000448 /* Luminance */
449 case D3DFMT_L8: retVal = GL_LUMINANCE8; break;
450 case D3DFMT_A8L8: retVal = GL_LUMINANCE8_ALPHA8; break;
451 case D3DFMT_A4L4: retVal = GL_LUMINANCE4_ALPHA4; break;
452 /* Bump */
Raphael Junqueirad52c5082004-04-29 00:20:18 +0000453 case D3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000454 case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
455 case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX8_EXT; break;
456 case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
457 /* color buffer */
458 case D3DFMT_R3G3B2: retVal = GL_R3_G3_B2; break;
Jason Edmeadesbeb4ac82003-08-15 03:50:08 +0000459 case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000460 case D3DFMT_R8G8B8: retVal = GL_RGB8; break;
Jason Edmeadesbeb4ac82003-08-15 03:50:08 +0000461 case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000462 case D3DFMT_X1R5G5B5: retVal = GL_RGB5_A1; break;
463 case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break;
464 case D3DFMT_X4R4G4B4: retVal = GL_RGBA4; break;
465 case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break;
466 case D3DFMT_X8R8G8B8: retVal = GL_RGBA8; break;
467 /* to see */
468 case D3DFMT_A8: retVal = GL_ALPHA8; break;
Jason Edmeadesbeb4ac82003-08-15 03:50:08 +0000469 default:
470 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
471 retVal = GL_RGB8;
472 }
473 }
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000474 TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
475 return retVal;
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000476}
477
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000478GLenum D3DFmt2GLFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000479 GLenum retVal = 0;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000480
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000481 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
482 switch (fmt) {
483 case D3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
484 case D3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
485 case D3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
486 default:
487 /* stupid compiler */
488 break;
489 }
490 }
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000491
492 if (retVal == 0) {
493 switch (fmt) {
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000494 /* Paletted */
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000495 case D3DFMT_P8: retVal = GL_COLOR_INDEX; break;
496 case D3DFMT_A8P8: retVal = GL_COLOR_INDEX; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000497 /* Luminance */
498 case D3DFMT_L8: retVal = GL_LUMINANCE; break;
499 case D3DFMT_A8L8: retVal = GL_LUMINANCE_ALPHA; break;
500 case D3DFMT_A4L4: retVal = GL_LUMINANCE_ALPHA; break;
501 /* Bump */
Raphael Junqueirad52c5082004-04-29 00:20:18 +0000502 case D3DFMT_V8U8: retVal = GL_COLOR_INDEX; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000503 case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
504 case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX; break;
505 case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
506 /* color buffer */
507 case D3DFMT_R3G3B2: retVal = GL_BGR; break;
508 case D3DFMT_R5G6B5: retVal = GL_RGB; break;
509 case D3DFMT_R8G8B8: retVal = GL_RGB; break;
510 case D3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
511 case D3DFMT_X1R5G5B5: retVal = GL_BGRA; break;
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000512 case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000513 case D3DFMT_X4R4G4B4: retVal = GL_BGRA; break;
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000514 case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break;
515 case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000516 /* to see */
517 case D3DFMT_A8: retVal = GL_ALPHA; break;
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000518 default:
519 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
520 retVal = GL_BGR;
521 }
522 }
523
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000524 TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
525 return retVal;
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000526}
527
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000528GLenum D3DFmt2GLType(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000529 GLenum retVal = 0;
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000530
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000531 if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
532 switch (fmt) {
533 case D3DFMT_DXT1: retVal = 0; break;
534 case D3DFMT_DXT3: retVal = 0; break;
535 case D3DFMT_DXT5: retVal = 0; break;
536 default:
537 /* stupid compiler */
538 break;
539 }
540 }
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000541
542 if (retVal == 0) {
543 switch (fmt) {
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000544 /* Paletted */
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000545 case D3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break;
Raphael Junqueirad52c5082004-04-29 00:20:18 +0000546 case D3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000547 /* Luminance */
548 case D3DFMT_L8: retVal = GL_UNSIGNED_BYTE; break;
549 case D3DFMT_A8L8: retVal = GL_UNSIGNED_BYTE; break;
550 case D3DFMT_A4L4: retVal = GL_UNSIGNED_BYTE; break;
551 /* Bump */
552 case D3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break;
553 case D3DFMT_V16U16: retVal = GL_UNSIGNED_SHORT; break;
554 case D3DFMT_L6V5U5: retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
555 case D3DFMT_X8L8V8U8: retVal = GL_UNSIGNED_BYTE; break;
556 /* Color buffer */
557 case D3DFMT_R3G3B2: retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000558 case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break;
559 case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break;
560 case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
Raphael Junqueira40dd9692004-05-19 04:33:42 +0000561 case D3DFMT_X1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
562 case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
563 case D3DFMT_X4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
564 case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
565 case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
566 /* to see */
567 case D3DFMT_A8: retVal = GL_ALPHA; break;
Jason Edmeades7ac9d252003-09-19 00:20:19 +0000568 default:
569 FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
570 retVal = GL_UNSIGNED_BYTE;
571 }
572 }
573
Raphael Junqueira0b5e9d92003-06-04 22:12:34 +0000574 TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
575 return retVal;
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000576}
577
578int SOURCEx_RGB_EXT(DWORD arg) {
579 switch(arg) {
580 case D3DTSS_COLORARG0: return GL_SOURCE2_RGB_EXT;
581 case D3DTSS_COLORARG1: return GL_SOURCE0_RGB_EXT;
582 case D3DTSS_COLORARG2: return GL_SOURCE1_RGB_EXT;
583 case D3DTSS_ALPHAARG0:
584 case D3DTSS_ALPHAARG1:
585 case D3DTSS_ALPHAARG2:
586 default:
587 FIXME("Invalid arg %ld\n", arg);
588 return GL_SOURCE0_RGB_EXT;
589 }
590}
591
592int OPERANDx_RGB_EXT(DWORD arg) {
593 switch(arg) {
594 case D3DTSS_COLORARG0: return GL_OPERAND2_RGB_EXT;
595 case D3DTSS_COLORARG1: return GL_OPERAND0_RGB_EXT;
596 case D3DTSS_COLORARG2: return GL_OPERAND1_RGB_EXT;
597 case D3DTSS_ALPHAARG0:
598 case D3DTSS_ALPHAARG1:
599 case D3DTSS_ALPHAARG2:
600 default:
601 FIXME("Invalid arg %ld\n", arg);
602 return GL_OPERAND0_RGB_EXT;
603 }
604}
605
606int SOURCEx_ALPHA_EXT(DWORD arg) {
607 switch(arg) {
608 case D3DTSS_ALPHAARG0: return GL_SOURCE2_ALPHA_EXT;
609 case D3DTSS_ALPHAARG1: return GL_SOURCE0_ALPHA_EXT;
610 case D3DTSS_ALPHAARG2: return GL_SOURCE1_ALPHA_EXT;
611 case D3DTSS_COLORARG0:
612 case D3DTSS_COLORARG1:
613 case D3DTSS_COLORARG2:
614 default:
615 FIXME("Invalid arg %ld\n", arg);
616 return GL_SOURCE0_ALPHA_EXT;
617 }
618}
619
620int OPERANDx_ALPHA_EXT(DWORD arg) {
621 switch(arg) {
622 case D3DTSS_ALPHAARG0: return GL_OPERAND2_ALPHA_EXT;
623 case D3DTSS_ALPHAARG1: return GL_OPERAND0_ALPHA_EXT;
624 case D3DTSS_ALPHAARG2: return GL_OPERAND1_ALPHA_EXT;
625 case D3DTSS_COLORARG0:
626 case D3DTSS_COLORARG1:
627 case D3DTSS_COLORARG2:
628 default:
629 FIXME("Invalid arg %ld\n", arg);
630 return GL_OPERAND0_ALPHA_EXT;
631 }
632}
633
634GLenum StencilOp(DWORD op) {
635 switch(op) {
636 case D3DSTENCILOP_KEEP : return GL_KEEP;
637 case D3DSTENCILOP_ZERO : return GL_ZERO;
638 case D3DSTENCILOP_REPLACE : return GL_REPLACE;
639 case D3DSTENCILOP_INCRSAT : return GL_INCR;
640 case D3DSTENCILOP_DECRSAT : return GL_DECR;
Jason Edmeades84cd1922003-06-04 22:01:05 +0000641 case D3DSTENCILOP_INVERT : return GL_INVERT;
Jason Edmeades84cd1922003-06-04 22:01:05 +0000642 case D3DSTENCILOP_INCR : return GL_INCR_WRAP_EXT;
643 case D3DSTENCILOP_DECR : return GL_DECR_WRAP_EXT;
Raphael Junqueira3cae8cf2003-06-04 21:55:29 +0000644 default:
645 FIXME("Invalid stencil op %ld\n", op);
646 return GL_ALWAYS;
647 }
648}
Jason Edmeades3d51c862003-06-04 22:20:47 +0000649
650/**
651 * @nodoc: todo
652 */
653void GetSrcAndOpFromValue(DWORD iValue, BOOL isAlphaArg, GLenum* source, GLenum* operand)
654{
655 BOOL isAlphaReplicate = FALSE;
656 BOOL isComplement = FALSE;
657
658 *operand = GL_SRC_COLOR;
659 *source = GL_TEXTURE;
660
661 /* Catch alpha replicate */
662 if (iValue & D3DTA_ALPHAREPLICATE) {
663 iValue = iValue & ~D3DTA_ALPHAREPLICATE;
664 isAlphaReplicate = TRUE;
665 }
666
667 /* Catch Complement */
668 if (iValue & D3DTA_COMPLEMENT) {
669 iValue = iValue & ~D3DTA_COMPLEMENT;
670 isComplement = TRUE;
671 }
672
673 /* Calculate the operand */
674 if (isAlphaReplicate && !isComplement) {
675 *operand = GL_SRC_ALPHA;
676 } else if (isAlphaReplicate && isComplement) {
677 *operand = GL_ONE_MINUS_SRC_ALPHA;
678 } else if (isComplement) {
679 if (isAlphaArg) {
680 *operand = GL_ONE_MINUS_SRC_ALPHA;
681 } else {
682 *operand = GL_ONE_MINUS_SRC_COLOR;
683 }
684 } else {
685 if (isAlphaArg) {
686 *operand = GL_SRC_ALPHA;
687 } else {
688 *operand = GL_SRC_COLOR;
689 }
690 }
691
692 /* Calculate the source */
693 switch (iValue & D3DTA_SELECTMASK) {
694 case D3DTA_CURRENT: *source = GL_PREVIOUS_EXT;
695 break;
696 case D3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT;
697 break;
698 case D3DTA_TEXTURE: *source = GL_TEXTURE;
699 break;
700 case D3DTA_TFACTOR: *source = GL_CONSTANT_EXT;
701 break;
702 case D3DTA_SPECULAR:
Christian Costa15ccb112004-04-26 23:34:17 +0000703 /*
Francois Gouget640cc3f2004-01-06 22:08:33 +0000704 * According to the GL_ARB_texture_env_combine specs, SPECULAR is
705 * 'Secondary color' and isn't supported until base GL supports it
Jason Edmeades3d51c862003-06-04 22:20:47 +0000706 * There is no concept of temp registers as far as I can tell
707 */
Christian Costa15ccb112004-04-26 23:34:17 +0000708 FIXME("Unhandled texture arg D3DTA_SPECULAR\n");
709 *source = GL_TEXTURE;
710 break;
Jason Edmeades3d51c862003-06-04 22:20:47 +0000711
712 default:
Christian Costa15ccb112004-04-26 23:34:17 +0000713 FIXME("Unrecognized texture arg %ld\n", iValue);
Jason Edmeades3d51c862003-06-04 22:20:47 +0000714 *source = GL_TEXTURE;
715 }
716}
717
Raphael Junqueira114c9072004-03-30 05:14:57 +0000718
Jason Edmeades3d51c862003-06-04 22:20:47 +0000719/* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
720#if defined (GL_VERSION_1_3)
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000721# define useext(A) A
722# define combine_ext 1
Jason Edmeades3d51c862003-06-04 22:20:47 +0000723#elif defined (GL_EXT_texture_env_combine)
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000724# define useext(A) A##_EXT
725# define combine_ext 1
Jason Edmeades3d51c862003-06-04 22:20:47 +0000726#elif defined (GL_ARB_texture_env_combine)
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000727# define useext(A) A##_ARB
728# define combine_ext 1
Jason Edmeades3d51c862003-06-04 22:20:47 +0000729#else
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000730# undef combine_ext
Jason Edmeades3d51c862003-06-04 22:20:47 +0000731#endif
732
733#if !defined(combine_ext)
734void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
735{
736 FIXME("Requires opengl combine extensions to work\n");
737 return;
738}
739#else
740/* Setup the texture operations texture stage states */
741void set_tex_op(LPDIRECT3DDEVICE8 iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
742{
743 GLenum src1, src2, src3;
744 GLenum opr1, opr2, opr3;
745 GLenum comb_target;
746 GLenum src0_target, src1_target, src2_target;
747 GLenum opr0_target, opr1_target, opr2_target;
748 GLenum scal_target;
749 GLenum opr=0, invopr, src3_target, opr3_target;
750 BOOL Handled = FALSE;
751 ICOM_THIS(IDirect3DDevice8Impl,iface);
752
753 TRACE("Alpha?(%d), Stage:%d Op(%d), a1(%ld), a2(%ld), a3(%ld)\n", isAlpha, Stage, op, arg1, arg2, arg3);
Jason Edmeades3d51c862003-06-04 22:20:47 +0000754
Raphael Junqueira44edc0c2003-06-18 03:17:42 +0000755 ENTER_GL();
756
Jason Edmeades21a09282003-06-13 19:14:34 +0000757 /* Note: Operations usually involve two ars, src0 and src1 and are operations of
758 the form (a1 <operation> a2). However, some of the more complex operations
759 take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added
760 in a third parameter called a0. Therefore these are operations of the form
761 a0 <operation> a1 <operation> a2, ie the new parameter goes to the front.
762
763 However, below we treat the new (a0) parameter as src2/opr2, so in the actual
764 functions below, expect their syntax to differ slightly to those listed in the
765 manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2
766 This affects D3DTOP_MULTIPLYADD and D3DTOP_LERP */
767
Jason Edmeades3d51c862003-06-04 22:20:47 +0000768 if (isAlpha) {
769 comb_target = useext(GL_COMBINE_ALPHA);
770 src0_target = useext(GL_SOURCE0_ALPHA);
771 src1_target = useext(GL_SOURCE1_ALPHA);
772 src2_target = useext(GL_SOURCE2_ALPHA);
773 opr0_target = useext(GL_OPERAND0_ALPHA);
774 opr1_target = useext(GL_OPERAND1_ALPHA);
775 opr2_target = useext(GL_OPERAND2_ALPHA);
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000776 scal_target = GL_ALPHA_SCALE;
Jason Edmeades3d51c862003-06-04 22:20:47 +0000777 }
778 else {
779 comb_target = useext(GL_COMBINE_RGB);
780 src0_target = useext(GL_SOURCE0_RGB);
781 src1_target = useext(GL_SOURCE1_RGB);
782 src2_target = useext(GL_SOURCE2_RGB);
783 opr0_target = useext(GL_OPERAND0_RGB);
784 opr1_target = useext(GL_OPERAND1_RGB);
785 opr2_target = useext(GL_OPERAND2_RGB);
786 scal_target = useext(GL_RGB_SCALE);
787 }
788
789 /* From MSDN (D3DTSS_ALPHAARG1) :
790 The default argument is D3DTA_TEXTURE. If no texture is set for this stage,
791 then the default argument is D3DTA_DIFFUSE.
792 FIXME? If texture added/removed, may need to reset back as well? */
Jason Edmeades21a09282003-06-13 19:14:34 +0000793 if (isAlpha && This->StateBlock->textures[Stage] == NULL && arg1 == D3DTA_TEXTURE) {
Jason Edmeades3d51c862003-06-04 22:20:47 +0000794 GetSrcAndOpFromValue(D3DTA_DIFFUSE, isAlpha, &src1, &opr1);
795 } else {
796 GetSrcAndOpFromValue(arg1, isAlpha, &src1, &opr1);
797 }
798 GetSrcAndOpFromValue(arg2, isAlpha, &src2, &opr2);
799 GetSrcAndOpFromValue(arg3, isAlpha, &src3, &opr3);
800
801 TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);
802
803 Handled = TRUE; /* Assume will be handled */
804 switch (op) {
Jason Edmeades021604c2003-07-03 18:10:22 +0000805 case D3DTOP_DISABLE: /* Only for alpha */
806 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
807 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
808 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
809 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
810 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
811 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
812 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
813 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
814 break;
Jason Edmeades3d51c862003-06-04 22:20:47 +0000815 case D3DTOP_SELECTARG1:
816 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
817 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
818 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
819 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
820 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
821 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
822 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
823 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
824 break;
825 case D3DTOP_SELECTARG2:
826 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
827 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
828 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
829 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
830 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
831 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
832 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
833 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
834 break;
835 case D3DTOP_MODULATE:
836 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
837 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
838 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
839 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
840 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
841 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
842 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
843 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
844 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
845 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
846 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
847 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
848 break;
849 case D3DTOP_MODULATE2X:
850 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
851 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
852 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
853 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
854 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
855 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
856 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
857 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
858 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
859 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
860 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
861 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
862 break;
863 case D3DTOP_MODULATE4X:
864 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
865 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
866 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
867 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
868 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
869 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
870 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
871 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
872 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
873 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
874 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
875 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
876 break;
877 case D3DTOP_ADD:
878 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
879 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
880 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
881 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
882 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
883 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
884 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
885 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
886 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
887 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
888 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
889 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
890 break;
891 case D3DTOP_ADDSIGNED:
892 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
893 checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)");
894 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
895 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
896 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
897 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
898 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
899 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
900 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
901 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
902 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
903 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
904 break;
905 case D3DTOP_ADDSIGNED2X:
906 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
907 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
908 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
909 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
910 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
911 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
912 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
913 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
914 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
915 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
916 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
917 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
918 break;
919 case D3DTOP_SUBTRACT:
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000920 if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {
921 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);
Jason Edmeades3d51c862003-06-04 22:20:47 +0000922 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)");
923 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
924 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
925 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
926 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
927 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
928 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
929 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
930 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
931 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
932 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000933 } else {
Jason Edmeades3d51c862003-06-04 22:20:47 +0000934 FIXME("This version of opengl does not support GL_SUBTRACT\n");
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000935 }
936 break;
937
Jason Edmeades3d51c862003-06-04 22:20:47 +0000938 case D3DTOP_BLENDDIFFUSEALPHA:
939 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
940 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
941 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
942 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
943 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
944 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
945 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
946 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
947 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
948 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000949 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR));
Jason Edmeades3d51c862003-06-04 22:20:47 +0000950 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR");
951 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
952 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
953 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
954 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
955 break;
956 case D3DTOP_BLENDTEXTUREALPHA:
957 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
958 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
959 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
960 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
961 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
962 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
963 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
964 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
965 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
966 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
967 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);
968 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");
969 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
970 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
971 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
972 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
973 break;
974 case D3DTOP_BLENDFACTORALPHA:
975 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
976 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
977 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
978 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
979 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
980 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
981 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
982 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
983 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
984 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
Raphael Junqueira85aa2982003-06-06 18:12:59 +0000985 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));
Jason Edmeades3d51c862003-06-04 22:20:47 +0000986 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");
987 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
988 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
989 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
990 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
991 break;
992 case D3DTOP_BLENDCURRENTALPHA:
993 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
994 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
995 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
996 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
997 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
998 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
999 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1000 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1001 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1002 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
Raphael Junqueira85aa2982003-06-06 18:12:59 +00001003 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));
Jason Edmeades3d51c862003-06-04 22:20:47 +00001004 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");
1005 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1006 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1007 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1008 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1009 break;
1010 case D3DTOP_DOTPRODUCT3:
Raphael Junqueira85aa2982003-06-06 18:12:59 +00001011 if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
Raphael Junqueira114c9072004-03-30 05:14:57 +00001012 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
1013 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
1014 } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
1015 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
1016 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
Raphael Junqueira85aa2982003-06-06 18:12:59 +00001017 } else {
1018 FIXME("This version of opengl does not support GL_DOT3\n");
1019 }
Jason Edmeades3d51c862003-06-04 22:20:47 +00001020 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1021 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1022 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1023 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1024 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1025 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1026 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1027 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1028 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1029 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1030 break;
1031 case D3DTOP_LERP:
1032 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1033 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
Jason Edmeades21a09282003-06-13 19:14:34 +00001034 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001035 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
Jason Edmeades21a09282003-06-13 19:14:34 +00001036 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001037 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
Jason Edmeades21a09282003-06-13 19:14:34 +00001038 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001039 checkGLcall("GL_TEXTURE_ENV, src1_target, src3");
Jason Edmeades21a09282003-06-13 19:14:34 +00001040 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001041 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr3");
Jason Edmeades21a09282003-06-13 19:14:34 +00001042 glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001043 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
Jason Edmeades21a09282003-06-13 19:14:34 +00001044 glTexEnvi(GL_TEXTURE_ENV, opr2_target, src3);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001045 checkGLcall("GL_TEXTURE_ENV, opr2_target, src1");
1046 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1047 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1048 break;
1049 default:
1050 Handled = FALSE;
1051 }
Jason Edmeades21a09282003-06-13 19:14:34 +00001052
Jason Edmeades3d51c862003-06-04 22:20:47 +00001053 if (Handled) {
Raphael Junqueira114c9072004-03-30 05:14:57 +00001054 BOOL combineOK = TRUE;
1055 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1056 DWORD op2;
1057
1058 if (isAlpha) {
1059 op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_COLOROP];
1060 } else {
1061 op2 = This->UpdateStateBlock->texture_state[Stage][D3DTSS_ALPHAOP];
1062 }
1063
1064 /* Note: If COMBINE4 in effect can't go back to combine! */
1065 switch (op2) {
1066 case D3DTOP_ADDSMOOTH:
1067 case D3DTOP_BLENDTEXTUREALPHAPM:
1068 case D3DTOP_MODULATEALPHA_ADDCOLOR:
1069 case D3DTOP_MODULATECOLOR_ADDALPHA:
1070 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1071 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1072 case D3DTOP_MULTIPLYADD:
1073 /* Ignore those implemented in both cases */
1074 switch (op) {
1075 case D3DTOP_SELECTARG1:
1076 case D3DTOP_SELECTARG2:
1077 combineOK = FALSE;
1078 Handled = FALSE;
1079 break;
1080 default:
Francois Gouget359c7092004-03-31 20:06:10 +00001081 FIXME("Can't use COMBINE4 and COMBINE together, thisop=%d, otherop=%ld, isAlpha(%d)\n", op, op2, isAlpha);
Raphael Junqueira114c9072004-03-30 05:14:57 +00001082 LEAVE_GL();
1083 return;
1084 }
1085 }
1086 }
1087
1088 if (combineOK == TRUE) {
1089 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
1090 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
1091
1092 LEAVE_GL();
1093 return;
1094 }
Jason Edmeades3d51c862003-06-04 22:20:47 +00001095 }
1096
1097 /* Other texture operations require special extensions: */
Raphael Junqueira114c9072004-03-30 05:14:57 +00001098 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1099 if (isAlpha) {
1100 opr = GL_SRC_ALPHA;
1101 invopr = GL_ONE_MINUS_SRC_ALPHA;
1102 src3_target = GL_SOURCE3_ALPHA_NV;
1103 opr3_target = GL_OPERAND3_ALPHA_NV;
1104 } else {
1105 opr = GL_SRC_COLOR;
1106 invopr = GL_ONE_MINUS_SRC_COLOR;
1107 src3_target = GL_SOURCE3_RGB_NV;
1108 opr3_target = GL_OPERAND3_RGB_NV;
1109 }
1110 Handled = TRUE; /* Again, assume handled */
1111 switch (op) {
1112 case D3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */
1113 case D3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */
1114 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1115 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1116 if (op == D3DTOP_SELECTARG1) {
1117 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1118 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1119 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1120 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1121 } else {
1122 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
1123 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
1124 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
1125 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
1126 }
1127 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1128 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1129 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1130 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1131 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
1132 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
1133 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1134 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
1135 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1136 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1137 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1138 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1139 break;
1140
1141 case D3DTOP_ADDSMOOTH:
1142 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1143 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1144 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1145 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1146 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1147 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1148 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1149 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1150 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1151 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1152 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1153 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1154 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1155 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1156 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
1157 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
1158 switch (opr1) {
1159 case GL_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_COLOR; break;
1160 case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_SRC_COLOR; break;
1161 case GL_SRC_ALPHA: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
1162 case GL_ONE_MINUS_SRC_ALPHA: opr1 = GL_SRC_ALPHA; break;
1163 }
1164 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
1165 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
1166 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1167 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1168 break;
1169 case D3DTOP_BLENDTEXTUREALPHAPM:
1170 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1171 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1172 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1173 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1174 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1175 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1176 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1177 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1178 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1179 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1180 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1181 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1182 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1183 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1184 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
1185 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
1186 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
1187 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
1188 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1189 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1190 break;
1191 case D3DTOP_MODULATEALPHA_ADDCOLOR:
1192 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1193 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
1194 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */
1195 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1196 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1197 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */
1198 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1199 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1200 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1201 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1202 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */
1203 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1204 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1205 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */
1206 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
1207 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
1208 switch (opr1) {
1209 case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
1210 case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
1211 }
1212 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr1);
1213 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
1214 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1215 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1216 break;
1217 case D3DTOP_MODULATECOLOR_ADDALPHA:
1218 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1219 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1220 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1221 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1222 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1223 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1224 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1225 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1226 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1227 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1228 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
1229 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
1230 switch (opr1) {
1231 case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
1232 case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
1233 }
1234 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
1235 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
1236 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1237 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1238 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1239 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1240 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1241 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1242 break;
1243 case D3DTOP_MODULATEINVALPHA_ADDCOLOR:
1244 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1245 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1246 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1247 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1248 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1249 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1250 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1251 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1252 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1253 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1254 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1255 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1256 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1257 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1258 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
1259 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
1260 switch (opr1) {
1261 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1262 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1263 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1264 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1265 }
1266 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1267 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1268 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1269 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1270 break;
1271 case D3DTOP_MODULATEINVCOLOR_ADDALPHA:
1272 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1273 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1274 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1275 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1276 switch (opr1) {
1277 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1278 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1279 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1280 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1281 }
1282 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1283 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1284 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1285 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1286 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1287 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1288 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
1289 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
1290 switch (opr1) {
1291 case GL_SRC_COLOR: opr1 = GL_SRC_ALPHA; break;
1292 case GL_ONE_MINUS_SRC_COLOR: opr1 = GL_ONE_MINUS_SRC_ALPHA; break;
1293 }
1294 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
1295 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr1");
1296 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1297 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1298 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1299 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1300 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1301 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1302 break;
1303 case D3DTOP_MULTIPLYADD:
1304 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1305 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1306 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
1307 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1308 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
1309 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1310 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1311 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1312 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1313 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1314 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
1315 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1316 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
1317 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1318 glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
1319 checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
1320 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
1321 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
1322 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1323 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1324 break;
Raphael Junqueirad52c5082004-04-29 00:20:18 +00001325
1326 case D3DTOP_BUMPENVMAP:
1327 {
1328 if (GL_SUPPORT(NV_TEXTURE_SHADER)) {
1329 /*
1330 texture unit 0: GL_TEXTURE_2D
1331 texture unit 1: GL_DOT_PRODUCT_NV
1332 texture unit 2: GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV
1333 texture unit 3: GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV
1334 */
1335 float m[2][2];
1336
1337 union {
1338 float f;
1339 DWORD d;
1340 } tmpvalue;
1341
1342 tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT00];
1343 m[0][0] = tmpvalue.f;
1344 tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT01];
1345 m[0][1] = tmpvalue.f;
1346 tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT10];
1347 m[1][0] = tmpvalue.f;
1348 tmpvalue.d = This->StateBlock->texture_state[Stage][D3DTSS_BUMPENVMAT11];
1349 m[1][1] = tmpvalue.f;
1350
1351 if (FALSE == This->texture_shader_active) {
1352 This->texture_shader_active = TRUE;
1353 glEnable(GL_TEXTURE_SHADER_NV);
1354 }
1355 /*
1356 glActiveTextureARB(GL_TEXTURE0_ARB + Stage - 1);
1357 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
1358 */
1359 glActiveTextureARB(GL_TEXTURE1_ARB + Stage);
1360 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV);
1361 glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + Stage - 1);
1362 glTexEnvfv(GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, (float*)&m[0]);
1363 break;
1364 }
1365 }
1366
1367 case D3DTOP_BUMPENVMAPLUMINANCE:
Jason Edmeades21a09282003-06-13 19:14:34 +00001368
Raphael Junqueira114c9072004-03-30 05:14:57 +00001369 default:
1370 Handled = FALSE;
1371 }
1372 if (Handled) {
Jason Edmeades3d51c862003-06-04 22:20:47 +00001373 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
1374 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
Raphael Junqueira114c9072004-03-30 05:14:57 +00001375
Raphael Junqueira44edc0c2003-06-18 03:17:42 +00001376 LEAVE_GL();
1377 return;
Raphael Junqueira114c9072004-03-30 05:14:57 +00001378 }
1379 } /* GL_NV_texture_env_combine4 */
1380
Raphael Junqueira44edc0c2003-06-18 03:17:42 +00001381 LEAVE_GL();
Raphael Junqueira114c9072004-03-30 05:14:57 +00001382
1383 /* After all the extensions, if still unhandled, report fixme */
1384 FIXME("Unhandled texture operation %d\n", op);
Jason Edmeades3d51c862003-06-04 22:20:47 +00001385}
1386#endif