2 * Utility functions for the WineD3D Library
4 * Copyright 2002-2004 Jason Edmeades
5 * Copyright 2003-2004 Raphael Junqueira
6 * Copyright 2004 Christian Costa
7 * Copyright 2005 Oliver Stieber
8 * Copyright 2006-2007 Henri Verbeet
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "wined3d_private.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
30 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
32 /*****************************************************************************
35 static const PixelFormatDesc formats[] = {
36 /*{WINED3DFORMAT ,alphamask ,redmask ,greenmask ,bluemask ,bpp ,isFourcc ,internal ,format ,type }*/
37 {WINED3DFMT_UNKNOWN ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,0 ,0 ,0 },
38 /* FourCC formats, kept here to have WINED3DFMT_R8G8B8(=20) at position 20 */
39 {WINED3DFMT_UYVY ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
40 {WINED3DFMT_YUY2 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
41 {WINED3DFMT_DXT1 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,GL_RGBA ,GL_UNSIGNED_BYTE },
42 {WINED3DFMT_DXT2 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_RGBA ,GL_UNSIGNED_BYTE },
43 {WINED3DFMT_DXT3 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_RGBA ,GL_UNSIGNED_BYTE },
44 {WINED3DFMT_DXT4 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_RGBA ,GL_UNSIGNED_BYTE },
45 {WINED3DFMT_DXT5 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_RGBA ,GL_UNSIGNED_BYTE },
46 {WINED3DFMT_MULTI2_ARGB8,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
47 {WINED3DFMT_G8R8_G8B8 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
48 {WINED3DFMT_R8G8_B8G8 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
50 {WINED3DFMT_R32F ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_RGB32F_ARB ,GL_RED ,GL_FLOAT },
51 {WINED3DFMT_G32R32F ,0x0 ,0x0 ,0x0 ,0x0 ,8 ,FALSE ,0 ,0 ,0 },
52 {WINED3DFMT_A32B32G32R32F,0x0 ,0x0 ,0x0 ,0x0 ,16 ,FALSE ,GL_RGBA32F_ARB ,GL_RGBA ,GL_FLOAT },
54 {WINED3DFMT_CxV8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
56 {WINED3DFMT_R16F ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_RGB16F_ARB ,GL_RED ,GL_HALF_FLOAT_ARB },
57 {WINED3DFMT_G16R16F ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
58 {WINED3DFMT_A16B16G16R16F,0x0 ,0x0 ,0x0 ,0x0 ,8 ,FALSE ,GL_RGBA16F_ARB ,GL_RGBA ,GL_HALF_FLOAT_ARB },
59 /* Palettized formats */
60 {WINED3DFMT_A8P8 ,0x0000ff00 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
61 {WINED3DFMT_P8 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX ,GL_UNSIGNED_BYTE },
62 /* Standard ARGB formats. Keep WINED3DFMT_R8G8B8(=20) at position 20 */
63 {WINED3DFMT_R8G8B8 ,0x0 ,0x00ff0000 ,0x0000ff00 ,0x000000ff ,3 ,FALSE ,GL_RGB8 ,GL_BGR ,GL_UNSIGNED_BYTE },
64 {WINED3DFMT_A8R8G8B8 ,0xff000000 ,0x00ff0000 ,0x0000ff00 ,0x000000ff ,4 ,FALSE ,GL_RGBA8 ,GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV },
65 {WINED3DFMT_X8R8G8B8 ,0x0 ,0x00ff0000 ,0x0000ff00 ,0x000000ff ,4 ,FALSE ,GL_RGB8 ,GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV },
66 {WINED3DFMT_R5G6B5 ,0x0 ,0x0000F800 ,0x000007e0 ,0x0000001f ,2 ,FALSE ,GL_RGB5 ,GL_RGB ,GL_UNSIGNED_SHORT_5_6_5 },
67 {WINED3DFMT_X1R5G5B5 ,0x0 ,0x00007c00 ,0x000003e0 ,0x0000001f ,2 ,FALSE ,GL_RGB5_A1 ,GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV },
68 {WINED3DFMT_A1R5G5B5 ,0x00008000 ,0x00007c00 ,0x000003e0 ,0x0000001f ,2 ,FALSE ,GL_RGB5_A1 ,GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV },
69 {WINED3DFMT_A4R4G4B4 ,0x0000f000 ,0x00000f00 ,0x000000f0 ,0x0000000f ,2 ,FALSE ,GL_RGBA4 ,GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV },
70 {WINED3DFMT_R3G3B2 ,0x0 ,0x000000e0 ,0x0000001c ,0x00000003 ,1 ,FALSE ,GL_R3_G3_B2 ,GL_RGB ,GL_UNSIGNED_BYTE_2_3_3_REV },
71 {WINED3DFMT_A8 ,0x000000ff ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_ALPHA8 ,GL_ALPHA ,GL_UNSIGNED_BYTE },
72 {WINED3DFMT_A8R3G3B2 ,0x0000ff00 ,0x000000e0 ,0x0000001c ,0x00000003 ,2 ,FALSE ,0 ,0 ,0 },
73 {WINED3DFMT_X4R4G4B4 ,0x0 ,0x00000f00 ,0x000000f0 ,0x0000000f ,2 ,FALSE ,GL_RGB4 ,GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV },
74 {WINED3DFMT_A2B10G10R10 ,0xb0000000 ,0x000003ff ,0x000ffc00 ,0x3ff00000 ,4 ,FALSE ,GL_RGB ,GL_RGBA ,GL_UNSIGNED_INT_2_10_10_10_REV },
75 {WINED3DFMT_A8B8G8R8 ,0xff000000 ,0x000000ff ,0x0000ff00 ,0x00ff0000 ,4 ,FALSE ,GL_RGBA8 ,GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV },
76 {WINED3DFMT_X8B8G8R8 ,0x0 ,0x000000ff ,0x0000ff00 ,0x00ff0000 ,4 ,FALSE ,GL_RGB8 ,GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV },
77 {WINED3DFMT_G16R16 ,0x0 ,0x0000ffff ,0xffff0000 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
78 {WINED3DFMT_A2R10G10B10 ,0xb0000000 ,0x3ff00000 ,0x000ffc00 ,0x000003ff ,4 ,FALSE ,GL_RGBA ,GL_BGRA ,GL_UNSIGNED_INT_2_10_10_10_REV },
79 {WINED3DFMT_A16B16G16R16,0x0 ,0x0000ffff ,0xffff0000 ,0x0 ,8 ,FALSE ,GL_RGBA16_EXT ,GL_RGBA ,GL_UNSIGNED_SHORT },
81 {WINED3DFMT_L8 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_LUMINANCE8 ,GL_LUMINANCE ,GL_UNSIGNED_BYTE },
82 {WINED3DFMT_A8L8 ,0x0000ff00 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_LUMINANCE8_ALPHA8 ,GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE },
83 {WINED3DFMT_A4L4 ,0x000000f0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_LUMINANCE4_ALPHA4 ,GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE },
84 /* Bump mapping stuff */
85 {WINED3DFMT_V8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_DSDT8_NV ,GL_DSDT_NV ,GL_BYTE },
86 {WINED3DFMT_L6V5U5 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT_5_5_5_1 },
87 {WINED3DFMT_X8L8V8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DSDT8_MAG8_INTENSITY8_NV,GL_DSDT_MAG_INTENSITY_NV,GL_BYTE },
88 {WINED3DFMT_Q8W8V8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_SIGNED_RGBA8_NV ,GL_RGBA ,GL_BYTE },
89 {WINED3DFMT_V16U16 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_SIGNED_HILO16_NV ,GL_HILO_NV ,GL_SHORT },
90 {WINED3DFMT_W11V11U10 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
91 {WINED3DFMT_A2W10V10U10 ,0xb0000000 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
92 /* Depth stencil formats */
93 {WINED3DFMT_D16_LOCKABLE,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_SHORT },
94 {WINED3DFMT_D32 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT32_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_INT },
95 {WINED3DFMT_D15S1 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_SHORT },
96 {WINED3DFMT_D24S8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_INT },
97 {WINED3DFMT_D24X8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_INT },
98 {WINED3DFMT_D24X4S4 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_INT },
99 {WINED3DFMT_D16 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_UNSIGNED_SHORT },
100 {WINED3DFMT_L16 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_LUMINANCE16_EXT ,GL_LUMINANCE ,GL_UNSIGNED_SHORT },
101 {WINED3DFMT_D32F_LOCKABLE,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT32_ARB,GL_DEPTH_COMPONENT,GL_FLOAT },
102 {WINED3DFMT_D24FS8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_DEPTH_COMPONENT24_ARB,GL_DEPTH_COMPONENT,GL_FLOAT },
103 /* Is this a vertex buffer? */
104 {WINED3DFMT_VERTEXDATA ,0x0 ,0x0 ,0x0 ,0x0 ,0 ,FALSE ,0 ,0 ,0 },
105 {WINED3DFMT_INDEX16 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
106 {WINED3DFMT_INDEX32 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
107 {WINED3DFMT_Q16W16V16U16,0x0 ,0x0 ,0x0 ,0x0 ,8 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT }
110 const PixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt)
112 /* First check if the format is at the position of its value.
113 * This will catch the argb formats before the loop is entered
115 if(fmt < (sizeof(formats) / sizeof(formats[0])) && formats[fmt].format == fmt) {
116 return &formats[fmt];
119 for(i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) {
120 if(formats[i].format == fmt) {
125 FIXME("Can't find format %s(%d) in the format lookup table\n", debug_d3dformat(fmt), fmt);
126 if(fmt == WINED3DFMT_UNKNOWN) {
127 ERR("Format table corrupt - Can't find WINED3DFMT_UNKNOWN\n");
130 /* Get the caller a valid pointer */
131 return getFormatDescEntry(WINED3DFMT_UNKNOWN);
134 /*****************************************************************************
135 * Trace formatting of useful values
137 const char* debug_d3dformat(WINED3DFORMAT fmt) {
139 #define FMT_TO_STR(fmt) case fmt: return #fmt
140 FMT_TO_STR(WINED3DFMT_UNKNOWN);
141 FMT_TO_STR(WINED3DFMT_R8G8B8);
142 FMT_TO_STR(WINED3DFMT_A8R8G8B8);
143 FMT_TO_STR(WINED3DFMT_X8R8G8B8);
144 FMT_TO_STR(WINED3DFMT_R5G6B5);
145 FMT_TO_STR(WINED3DFMT_X1R5G5B5);
146 FMT_TO_STR(WINED3DFMT_A1R5G5B5);
147 FMT_TO_STR(WINED3DFMT_A4R4G4B4);
148 FMT_TO_STR(WINED3DFMT_R3G3B2);
149 FMT_TO_STR(WINED3DFMT_A8);
150 FMT_TO_STR(WINED3DFMT_A8R3G3B2);
151 FMT_TO_STR(WINED3DFMT_X4R4G4B4);
152 FMT_TO_STR(WINED3DFMT_A2B10G10R10);
153 FMT_TO_STR(WINED3DFMT_A8B8G8R8);
154 FMT_TO_STR(WINED3DFMT_X8B8G8R8);
155 FMT_TO_STR(WINED3DFMT_G16R16);
156 FMT_TO_STR(WINED3DFMT_A2R10G10B10);
157 FMT_TO_STR(WINED3DFMT_A16B16G16R16);
158 FMT_TO_STR(WINED3DFMT_A8P8);
159 FMT_TO_STR(WINED3DFMT_P8);
160 FMT_TO_STR(WINED3DFMT_L8);
161 FMT_TO_STR(WINED3DFMT_A8L8);
162 FMT_TO_STR(WINED3DFMT_A4L4);
163 FMT_TO_STR(WINED3DFMT_V8U8);
164 FMT_TO_STR(WINED3DFMT_L6V5U5);
165 FMT_TO_STR(WINED3DFMT_X8L8V8U8);
166 FMT_TO_STR(WINED3DFMT_Q8W8V8U8);
167 FMT_TO_STR(WINED3DFMT_V16U16);
168 FMT_TO_STR(WINED3DFMT_W11V11U10);
169 FMT_TO_STR(WINED3DFMT_A2W10V10U10);
170 FMT_TO_STR(WINED3DFMT_UYVY);
171 FMT_TO_STR(WINED3DFMT_YUY2);
172 FMT_TO_STR(WINED3DFMT_DXT1);
173 FMT_TO_STR(WINED3DFMT_DXT2);
174 FMT_TO_STR(WINED3DFMT_DXT3);
175 FMT_TO_STR(WINED3DFMT_DXT4);
176 FMT_TO_STR(WINED3DFMT_DXT5);
177 FMT_TO_STR(WINED3DFMT_MULTI2_ARGB8);
178 FMT_TO_STR(WINED3DFMT_G8R8_G8B8);
179 FMT_TO_STR(WINED3DFMT_R8G8_B8G8);
180 FMT_TO_STR(WINED3DFMT_D16_LOCKABLE);
181 FMT_TO_STR(WINED3DFMT_D32);
182 FMT_TO_STR(WINED3DFMT_D15S1);
183 FMT_TO_STR(WINED3DFMT_D24S8);
184 FMT_TO_STR(WINED3DFMT_D24X8);
185 FMT_TO_STR(WINED3DFMT_D24X4S4);
186 FMT_TO_STR(WINED3DFMT_D16);
187 FMT_TO_STR(WINED3DFMT_L16);
188 FMT_TO_STR(WINED3DFMT_D32F_LOCKABLE);
189 FMT_TO_STR(WINED3DFMT_D24FS8);
190 FMT_TO_STR(WINED3DFMT_VERTEXDATA);
191 FMT_TO_STR(WINED3DFMT_INDEX16);
192 FMT_TO_STR(WINED3DFMT_INDEX32);
193 FMT_TO_STR(WINED3DFMT_Q16W16V16U16);
194 FMT_TO_STR(WINED3DFMT_R16F);
195 FMT_TO_STR(WINED3DFMT_G16R16F);
196 FMT_TO_STR(WINED3DFMT_A16B16G16R16F);
197 FMT_TO_STR(WINED3DFMT_R32F);
198 FMT_TO_STR(WINED3DFMT_G32R32F);
199 FMT_TO_STR(WINED3DFMT_A32B32G32R32F);
200 FMT_TO_STR(WINED3DFMT_CxV8U8);
205 fourcc[0] = (char)(fmt);
206 fourcc[1] = (char)(fmt >> 8);
207 fourcc[2] = (char)(fmt >> 16);
208 fourcc[3] = (char)(fmt >> 24);
210 if( isprint(fourcc[0]) && isprint(fourcc[1]) && isprint(fourcc[2]) && isprint(fourcc[3]) )
211 FIXME("Unrecognized %u (as fourcc: %s) WINED3DFORMAT!\n", fmt, fourcc);
213 FIXME("Unrecognized %u WINED3DFORMAT!\n", fmt);
215 return "unrecognized";
219 const char* debug_d3ddevicetype(WINED3DDEVTYPE devtype) {
221 #define DEVTYPE_TO_STR(dev) case dev: return #dev
222 DEVTYPE_TO_STR(WINED3DDEVTYPE_HAL);
223 DEVTYPE_TO_STR(WINED3DDEVTYPE_REF);
224 DEVTYPE_TO_STR(WINED3DDEVTYPE_SW);
225 #undef DEVTYPE_TO_STR
227 FIXME("Unrecognized %u WINED3DDEVTYPE!\n", devtype);
228 return "unrecognized";
232 const char* debug_d3dusage(DWORD usage) {
233 switch (usage & WINED3DUSAGE_MASK) {
234 #define WINED3DUSAGE_TO_STR(u) case u: return #u
235 WINED3DUSAGE_TO_STR(WINED3DUSAGE_RENDERTARGET);
236 WINED3DUSAGE_TO_STR(WINED3DUSAGE_DEPTHSTENCIL);
237 WINED3DUSAGE_TO_STR(WINED3DUSAGE_WRITEONLY);
238 WINED3DUSAGE_TO_STR(WINED3DUSAGE_SOFTWAREPROCESSING);
239 WINED3DUSAGE_TO_STR(WINED3DUSAGE_DONOTCLIP);
240 WINED3DUSAGE_TO_STR(WINED3DUSAGE_POINTS);
241 WINED3DUSAGE_TO_STR(WINED3DUSAGE_RTPATCHES);
242 WINED3DUSAGE_TO_STR(WINED3DUSAGE_NPATCHES);
243 WINED3DUSAGE_TO_STR(WINED3DUSAGE_DYNAMIC);
244 WINED3DUSAGE_TO_STR(WINED3DUSAGE_AUTOGENMIPMAP);
245 WINED3DUSAGE_TO_STR(WINED3DUSAGE_DMAP);
246 #undef WINED3DUSAGE_TO_STR
247 case 0: return "none";
249 FIXME("Unrecognized %u Usage!\n", usage);
250 return "unrecognized";
254 const char* debug_d3dusagequery(DWORD usagequery) {
255 switch (usagequery & WINED3DUSAGE_QUERY_MASK) {
256 #define WINED3DUSAGEQUERY_TO_STR(u) case u: return #u
257 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_FILTER);
258 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_LEGACYBUMPMAP);
259 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING);
260 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_SRGBREAD);
261 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_SRGBWRITE);
262 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_VERTEXTEXTURE);
263 WINED3DUSAGEQUERY_TO_STR(WINED3DUSAGE_QUERY_WRAPANDMIP);
264 #undef WINED3DUSAGEQUERY_TO_STR
265 case 0: return "none";
267 FIXME("Unrecognized %u Usage Query!\n", usagequery);
268 return "unrecognized";
272 const char* debug_d3ddeclmethod(WINED3DDECLMETHOD method) {
274 #define WINED3DDECLMETHOD_TO_STR(u) case u: return #u
275 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_DEFAULT);
276 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_PARTIALU);
277 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_PARTIALV);
278 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_CROSSUV);
279 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_UV);
280 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_LOOKUP);
281 WINED3DDECLMETHOD_TO_STR(WINED3DDECLMETHOD_LOOKUPPRESAMPLED);
282 #undef WINED3DDECLMETHOD_TO_STR
284 FIXME("Unrecognized %u declaration method!\n", method);
285 return "unrecognized";
289 const char* debug_d3ddecltype(WINED3DDECLTYPE type) {
291 #define WINED3DDECLTYPE_TO_STR(u) case u: return #u
292 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_FLOAT1);
293 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_FLOAT2);
294 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_FLOAT3);
295 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_FLOAT4);
296 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_D3DCOLOR);
297 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_UBYTE4);
298 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_SHORT2);
299 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_SHORT4);
300 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_UBYTE4N);
301 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_SHORT2N);
302 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_SHORT4N);
303 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_USHORT2N);
304 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_USHORT4N);
305 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_UDEC3);
306 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_DEC3N);
307 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_FLOAT16_2);
308 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_FLOAT16_4);
309 WINED3DDECLTYPE_TO_STR(WINED3DDECLTYPE_UNUSED);
310 #undef WINED3DDECLTYPE_TO_STR
312 FIXME("Unrecognized %u declaration type!\n", type);
313 return "unrecognized";
317 const char* debug_d3ddeclusage(BYTE usage) {
319 #define WINED3DDECLUSAGE_TO_STR(u) case u: return #u
320 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_POSITION);
321 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_BLENDWEIGHT);
322 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_BLENDINDICES);
323 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_NORMAL);
324 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_PSIZE);
325 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_TEXCOORD);
326 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_TANGENT);
327 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_BINORMAL);
328 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_TESSFACTOR);
329 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_POSITIONT);
330 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_COLOR);
331 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_FOG);
332 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_DEPTH);
333 WINED3DDECLUSAGE_TO_STR(WINED3DDECLUSAGE_SAMPLE);
334 #undef WINED3DDECLUSAGE_TO_STR
336 FIXME("Unrecognized %u declaration usage!\n", usage);
337 return "unrecognized";
341 const char* debug_d3dresourcetype(WINED3DRESOURCETYPE res) {
343 #define RES_TO_STR(res) case res: return #res;
344 RES_TO_STR(WINED3DRTYPE_SURFACE);
345 RES_TO_STR(WINED3DRTYPE_VOLUME);
346 RES_TO_STR(WINED3DRTYPE_TEXTURE);
347 RES_TO_STR(WINED3DRTYPE_VOLUMETEXTURE);
348 RES_TO_STR(WINED3DRTYPE_CUBETEXTURE);
349 RES_TO_STR(WINED3DRTYPE_VERTEXBUFFER);
350 RES_TO_STR(WINED3DRTYPE_INDEXBUFFER);
353 FIXME("Unrecognized %u WINED3DRESOURCETYPE!\n", res);
354 return "unrecognized";
358 const char* debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) {
359 switch (PrimitiveType) {
360 #define PRIM_TO_STR(prim) case prim: return #prim;
361 PRIM_TO_STR(WINED3DPT_POINTLIST);
362 PRIM_TO_STR(WINED3DPT_LINELIST);
363 PRIM_TO_STR(WINED3DPT_LINESTRIP);
364 PRIM_TO_STR(WINED3DPT_TRIANGLELIST);
365 PRIM_TO_STR(WINED3DPT_TRIANGLESTRIP);
366 PRIM_TO_STR(WINED3DPT_TRIANGLEFAN);
369 FIXME("Unrecognized %u WINED3DPRIMITIVETYPE!\n", PrimitiveType);
370 return "unrecognized";
374 const char* debug_d3drenderstate(DWORD state) {
376 #define D3DSTATE_TO_STR(u) case u: return #u
377 D3DSTATE_TO_STR(WINED3DRS_TEXTUREHANDLE );
378 D3DSTATE_TO_STR(WINED3DRS_ANTIALIAS );
379 D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESS );
380 D3DSTATE_TO_STR(WINED3DRS_TEXTUREPERSPECTIVE );
381 D3DSTATE_TO_STR(WINED3DRS_WRAPU );
382 D3DSTATE_TO_STR(WINED3DRS_WRAPV );
383 D3DSTATE_TO_STR(WINED3DRS_ZENABLE );
384 D3DSTATE_TO_STR(WINED3DRS_FILLMODE );
385 D3DSTATE_TO_STR(WINED3DRS_SHADEMODE );
386 D3DSTATE_TO_STR(WINED3DRS_LINEPATTERN );
387 D3DSTATE_TO_STR(WINED3DRS_MONOENABLE );
388 D3DSTATE_TO_STR(WINED3DRS_ROP2 );
389 D3DSTATE_TO_STR(WINED3DRS_PLANEMASK );
390 D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE );
391 D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE );
392 D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL );
393 D3DSTATE_TO_STR(WINED3DRS_TEXTUREMAG );
394 D3DSTATE_TO_STR(WINED3DRS_TEXTUREMIN );
395 D3DSTATE_TO_STR(WINED3DRS_SRCBLEND );
396 D3DSTATE_TO_STR(WINED3DRS_DESTBLEND );
397 D3DSTATE_TO_STR(WINED3DRS_TEXTUREMAPBLEND );
398 D3DSTATE_TO_STR(WINED3DRS_CULLMODE );
399 D3DSTATE_TO_STR(WINED3DRS_ZFUNC );
400 D3DSTATE_TO_STR(WINED3DRS_ALPHAREF );
401 D3DSTATE_TO_STR(WINED3DRS_ALPHAFUNC );
402 D3DSTATE_TO_STR(WINED3DRS_DITHERENABLE );
403 D3DSTATE_TO_STR(WINED3DRS_ALPHABLENDENABLE );
404 D3DSTATE_TO_STR(WINED3DRS_FOGENABLE );
405 D3DSTATE_TO_STR(WINED3DRS_SPECULARENABLE );
406 D3DSTATE_TO_STR(WINED3DRS_ZVISIBLE );
407 D3DSTATE_TO_STR(WINED3DRS_SUBPIXEL );
408 D3DSTATE_TO_STR(WINED3DRS_SUBPIXELX );
409 D3DSTATE_TO_STR(WINED3DRS_STIPPLEDALPHA );
410 D3DSTATE_TO_STR(WINED3DRS_FOGCOLOR );
411 D3DSTATE_TO_STR(WINED3DRS_FOGTABLEMODE );
412 D3DSTATE_TO_STR(WINED3DRS_FOGSTART );
413 D3DSTATE_TO_STR(WINED3DRS_FOGEND );
414 D3DSTATE_TO_STR(WINED3DRS_FOGDENSITY );
415 D3DSTATE_TO_STR(WINED3DRS_STIPPLEENABLE );
416 D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS );
417 D3DSTATE_TO_STR(WINED3DRS_COLORKEYENABLE );
418 D3DSTATE_TO_STR(WINED3DRS_BORDERCOLOR );
419 D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESSU );
420 D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESSV );
421 D3DSTATE_TO_STR(WINED3DRS_MIPMAPLODBIAS );
422 D3DSTATE_TO_STR(WINED3DRS_ZBIAS );
423 D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE );
424 D3DSTATE_TO_STR(WINED3DRS_ANISOTROPY );
425 D3DSTATE_TO_STR(WINED3DRS_FLUSHBATCH );
426 D3DSTATE_TO_STR(WINED3DRS_TRANSLUCENTSORTINDEPENDENT);
427 D3DSTATE_TO_STR(WINED3DRS_STENCILENABLE );
428 D3DSTATE_TO_STR(WINED3DRS_STENCILFAIL );
429 D3DSTATE_TO_STR(WINED3DRS_STENCILZFAIL );
430 D3DSTATE_TO_STR(WINED3DRS_STENCILPASS );
431 D3DSTATE_TO_STR(WINED3DRS_STENCILFUNC );
432 D3DSTATE_TO_STR(WINED3DRS_STENCILREF );
433 D3DSTATE_TO_STR(WINED3DRS_STENCILMASK );
434 D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK );
435 D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR );
436 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN00 );
437 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN01 );
438 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN02 );
439 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN03 );
440 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN04 );
441 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN05 );
442 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN06 );
443 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN07 );
444 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN08 );
445 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN09 );
446 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN10 );
447 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN11 );
448 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN12 );
449 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN13 );
450 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN14 );
451 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN15 );
452 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN16 );
453 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN17 );
454 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN18 );
455 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN19 );
456 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN20 );
457 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN21 );
458 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN22 );
459 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN23 );
460 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN24 );
461 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN25 );
462 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN26 );
463 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN27 );
464 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN28 );
465 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN29 );
466 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN30 );
467 D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN31 );
468 D3DSTATE_TO_STR(WINED3DRS_WRAP0 );
469 D3DSTATE_TO_STR(WINED3DRS_WRAP1 );
470 D3DSTATE_TO_STR(WINED3DRS_WRAP2 );
471 D3DSTATE_TO_STR(WINED3DRS_WRAP3 );
472 D3DSTATE_TO_STR(WINED3DRS_WRAP4 );
473 D3DSTATE_TO_STR(WINED3DRS_WRAP5 );
474 D3DSTATE_TO_STR(WINED3DRS_WRAP6 );
475 D3DSTATE_TO_STR(WINED3DRS_WRAP7 );
476 D3DSTATE_TO_STR(WINED3DRS_CLIPPING );
477 D3DSTATE_TO_STR(WINED3DRS_LIGHTING );
478 D3DSTATE_TO_STR(WINED3DRS_EXTENTS );
479 D3DSTATE_TO_STR(WINED3DRS_AMBIENT );
480 D3DSTATE_TO_STR(WINED3DRS_FOGVERTEXMODE );
481 D3DSTATE_TO_STR(WINED3DRS_COLORVERTEX );
482 D3DSTATE_TO_STR(WINED3DRS_LOCALVIEWER );
483 D3DSTATE_TO_STR(WINED3DRS_NORMALIZENORMALS );
484 D3DSTATE_TO_STR(WINED3DRS_COLORKEYBLENDENABLE );
485 D3DSTATE_TO_STR(WINED3DRS_DIFFUSEMATERIALSOURCE );
486 D3DSTATE_TO_STR(WINED3DRS_SPECULARMATERIALSOURCE );
487 D3DSTATE_TO_STR(WINED3DRS_AMBIENTMATERIALSOURCE );
488 D3DSTATE_TO_STR(WINED3DRS_EMISSIVEMATERIALSOURCE );
489 D3DSTATE_TO_STR(WINED3DRS_VERTEXBLEND );
490 D3DSTATE_TO_STR(WINED3DRS_CLIPPLANEENABLE );
491 D3DSTATE_TO_STR(WINED3DRS_SOFTWAREVERTEXPROCESSING );
492 D3DSTATE_TO_STR(WINED3DRS_POINTSIZE );
493 D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MIN );
494 D3DSTATE_TO_STR(WINED3DRS_POINTSPRITEENABLE );
495 D3DSTATE_TO_STR(WINED3DRS_POINTSCALEENABLE );
496 D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_A );
497 D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_B );
498 D3DSTATE_TO_STR(WINED3DRS_POINTSCALE_C );
499 D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEANTIALIAS );
500 D3DSTATE_TO_STR(WINED3DRS_MULTISAMPLEMASK );
501 D3DSTATE_TO_STR(WINED3DRS_PATCHEDGESTYLE );
502 D3DSTATE_TO_STR(WINED3DRS_PATCHSEGMENTS );
503 D3DSTATE_TO_STR(WINED3DRS_DEBUGMONITORTOKEN );
504 D3DSTATE_TO_STR(WINED3DRS_POINTSIZE_MAX );
505 D3DSTATE_TO_STR(WINED3DRS_INDEXEDVERTEXBLENDENABLE );
506 D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE );
507 D3DSTATE_TO_STR(WINED3DRS_TWEENFACTOR );
508 D3DSTATE_TO_STR(WINED3DRS_BLENDOP );
509 D3DSTATE_TO_STR(WINED3DRS_POSITIONDEGREE );
510 D3DSTATE_TO_STR(WINED3DRS_NORMALDEGREE );
511 D3DSTATE_TO_STR(WINED3DRS_SCISSORTESTENABLE );
512 D3DSTATE_TO_STR(WINED3DRS_SLOPESCALEDEPTHBIAS );
513 D3DSTATE_TO_STR(WINED3DRS_ANTIALIASEDLINEENABLE );
514 D3DSTATE_TO_STR(WINED3DRS_MINTESSELLATIONLEVEL );
515 D3DSTATE_TO_STR(WINED3DRS_MAXTESSELLATIONLEVEL );
516 D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_X );
517 D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_Y );
518 D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_Z );
519 D3DSTATE_TO_STR(WINED3DRS_ADAPTIVETESS_W );
520 D3DSTATE_TO_STR(WINED3DRS_ENABLEADAPTIVETESSELLATION);
521 D3DSTATE_TO_STR(WINED3DRS_TWOSIDEDSTENCILMODE );
522 D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILFAIL );
523 D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILZFAIL );
524 D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILPASS );
525 D3DSTATE_TO_STR(WINED3DRS_CCW_STENCILFUNC );
526 D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE1 );
527 D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE2 );
528 D3DSTATE_TO_STR(WINED3DRS_COLORWRITEENABLE3 );
529 D3DSTATE_TO_STR(WINED3DRS_BLENDFACTOR );
530 D3DSTATE_TO_STR(WINED3DRS_SRGBWRITEENABLE );
531 D3DSTATE_TO_STR(WINED3DRS_DEPTHBIAS );
532 D3DSTATE_TO_STR(WINED3DRS_WRAP8 );
533 D3DSTATE_TO_STR(WINED3DRS_WRAP9 );
534 D3DSTATE_TO_STR(WINED3DRS_WRAP10 );
535 D3DSTATE_TO_STR(WINED3DRS_WRAP11 );
536 D3DSTATE_TO_STR(WINED3DRS_WRAP12 );
537 D3DSTATE_TO_STR(WINED3DRS_WRAP13 );
538 D3DSTATE_TO_STR(WINED3DRS_WRAP14 );
539 D3DSTATE_TO_STR(WINED3DRS_WRAP15 );
540 D3DSTATE_TO_STR(WINED3DRS_SEPARATEALPHABLENDENABLE );
541 D3DSTATE_TO_STR(WINED3DRS_SRCBLENDALPHA );
542 D3DSTATE_TO_STR(WINED3DRS_DESTBLENDALPHA );
543 D3DSTATE_TO_STR(WINED3DRS_BLENDOPALPHA );
544 #undef D3DSTATE_TO_STR
546 FIXME("Unrecognized %u render state!\n", state);
547 return "unrecognized";
551 const char* debug_d3dsamplerstate(DWORD state) {
553 #define D3DSTATE_TO_STR(u) case u: return #u
554 D3DSTATE_TO_STR(WINED3DSAMP_BORDERCOLOR );
555 D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSU );
556 D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSV );
557 D3DSTATE_TO_STR(WINED3DSAMP_ADDRESSW );
558 D3DSTATE_TO_STR(WINED3DSAMP_MAGFILTER );
559 D3DSTATE_TO_STR(WINED3DSAMP_MINFILTER );
560 D3DSTATE_TO_STR(WINED3DSAMP_MIPFILTER );
561 D3DSTATE_TO_STR(WINED3DSAMP_MIPMAPLODBIAS);
562 D3DSTATE_TO_STR(WINED3DSAMP_MAXMIPLEVEL );
563 D3DSTATE_TO_STR(WINED3DSAMP_MAXANISOTROPY);
564 D3DSTATE_TO_STR(WINED3DSAMP_SRGBTEXTURE );
565 D3DSTATE_TO_STR(WINED3DSAMP_ELEMENTINDEX );
566 D3DSTATE_TO_STR(WINED3DSAMP_DMAPOFFSET );
567 #undef D3DSTATE_TO_STR
569 FIXME("Unrecognized %u sampler state!\n", state);
570 return "unrecognized";
574 const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) {
575 switch (filter_type) {
576 #define D3DTEXTUREFILTERTYPE_TO_STR(u) case u: return #u
577 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_NONE);
578 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_POINT);
579 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_LINEAR);
580 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_ANISOTROPIC);
581 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_FLATCUBIC);
582 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_GAUSSIANCUBIC);
583 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_PYRAMIDALQUAD);
584 D3DTEXTUREFILTERTYPE_TO_STR(WINED3DTEXF_GAUSSIANQUAD);
585 #undef D3DTEXTUREFILTERTYPE_TO_STR
587 FIXME("Unrecognied texture filter type 0x%08x\n", filter_type);
588 return "unrecognized";
592 const char* debug_d3dtexturestate(DWORD state) {
594 #define D3DSTATE_TO_STR(u) case u: return #u
595 D3DSTATE_TO_STR(WINED3DTSS_COLOROP );
596 D3DSTATE_TO_STR(WINED3DTSS_COLORARG1 );
597 D3DSTATE_TO_STR(WINED3DTSS_COLORARG2 );
598 D3DSTATE_TO_STR(WINED3DTSS_ALPHAOP );
599 D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG1 );
600 D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG2 );
601 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT00 );
602 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT01 );
603 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT10 );
604 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVMAT11 );
605 D3DSTATE_TO_STR(WINED3DTSS_TEXCOORDINDEX );
606 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLSCALE );
607 D3DSTATE_TO_STR(WINED3DTSS_BUMPENVLOFFSET );
608 D3DSTATE_TO_STR(WINED3DTSS_TEXTURETRANSFORMFLAGS );
609 D3DSTATE_TO_STR(WINED3DTSS_ADDRESSW );
610 D3DSTATE_TO_STR(WINED3DTSS_COLORARG0 );
611 D3DSTATE_TO_STR(WINED3DTSS_ALPHAARG0 );
612 D3DSTATE_TO_STR(WINED3DTSS_RESULTARG );
613 D3DSTATE_TO_STR(WINED3DTSS_CONSTANT );
614 #undef D3DSTATE_TO_STR
616 /* Note WINED3DTSS are not consecutive, so skip these */
620 FIXME("Unrecognized %u texture state!\n", state);
621 return "unrecognized";
625 static const char* debug_d3dtop(WINED3DTEXTUREOP d3dtop) {
627 #define D3DTOP_TO_STR(u) case u: return #u
628 D3DTOP_TO_STR(WINED3DTOP_DISABLE);
629 D3DTOP_TO_STR(WINED3DTOP_SELECTARG1);
630 D3DTOP_TO_STR(WINED3DTOP_SELECTARG2);
631 D3DTOP_TO_STR(WINED3DTOP_MODULATE);
632 D3DTOP_TO_STR(WINED3DTOP_MODULATE2X);
633 D3DTOP_TO_STR(WINED3DTOP_MODULATE4X);
634 D3DTOP_TO_STR(WINED3DTOP_ADD);
635 D3DTOP_TO_STR(WINED3DTOP_ADDSIGNED);
636 D3DTOP_TO_STR(WINED3DTOP_SUBTRACT);
637 D3DTOP_TO_STR(WINED3DTOP_ADDSMOOTH);
638 D3DTOP_TO_STR(WINED3DTOP_BLENDDIFFUSEALPHA);
639 D3DTOP_TO_STR(WINED3DTOP_BLENDTEXTUREALPHA);
640 D3DTOP_TO_STR(WINED3DTOP_BLENDFACTORALPHA);
641 D3DTOP_TO_STR(WINED3DTOP_BLENDTEXTUREALPHAPM);
642 D3DTOP_TO_STR(WINED3DTOP_BLENDCURRENTALPHA);
643 D3DTOP_TO_STR(WINED3DTOP_PREMODULATE);
644 D3DTOP_TO_STR(WINED3DTOP_MODULATEALPHA_ADDCOLOR);
645 D3DTOP_TO_STR(WINED3DTOP_MODULATECOLOR_ADDALPHA);
646 D3DTOP_TO_STR(WINED3DTOP_MODULATEINVALPHA_ADDCOLOR);
647 D3DTOP_TO_STR(WINED3DTOP_MODULATEINVCOLOR_ADDALPHA);
648 D3DTOP_TO_STR(WINED3DTOP_BUMPENVMAP);
649 D3DTOP_TO_STR(WINED3DTOP_BUMPENVMAPLUMINANCE);
650 D3DTOP_TO_STR(WINED3DTOP_DOTPRODUCT3);
651 D3DTOP_TO_STR(WINED3DTOP_MULTIPLYADD);
652 D3DTOP_TO_STR(WINED3DTOP_LERP);
655 FIXME("Unrecognized %u WINED3DTOP\n", d3dtop);
656 return "unrecognized";
660 const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) {
662 #define TSTYPE_TO_STR(tstype) case tstype: return #tstype
663 TSTYPE_TO_STR(WINED3DTS_VIEW);
664 TSTYPE_TO_STR(WINED3DTS_PROJECTION);
665 TSTYPE_TO_STR(WINED3DTS_TEXTURE0);
666 TSTYPE_TO_STR(WINED3DTS_TEXTURE1);
667 TSTYPE_TO_STR(WINED3DTS_TEXTURE2);
668 TSTYPE_TO_STR(WINED3DTS_TEXTURE3);
669 TSTYPE_TO_STR(WINED3DTS_TEXTURE4);
670 TSTYPE_TO_STR(WINED3DTS_TEXTURE5);
671 TSTYPE_TO_STR(WINED3DTS_TEXTURE6);
672 TSTYPE_TO_STR(WINED3DTS_TEXTURE7);
673 TSTYPE_TO_STR(WINED3DTS_WORLDMATRIX(0));
676 if (tstype > 256 && tstype < 512) {
677 FIXME("WINED3DTS_WORLDMATRIX(%u). 1..255 not currently supported\n", tstype);
678 return ("WINED3DTS_WORLDMATRIX > 0");
680 FIXME("Unrecognized %u WINED3DTS\n", tstype);
681 return "unrecognized";
685 const char* debug_d3dpool(WINED3DPOOL Pool) {
687 #define POOL_TO_STR(p) case p: return #p;
688 POOL_TO_STR(WINED3DPOOL_DEFAULT);
689 POOL_TO_STR(WINED3DPOOL_MANAGED);
690 POOL_TO_STR(WINED3DPOOL_SYSTEMMEM);
691 POOL_TO_STR(WINED3DPOOL_SCRATCH);
694 FIXME("Unrecognized %u WINED3DPOOL!\n", Pool);
695 return "unrecognized";
699 const char *debug_fbostatus(GLenum status) {
701 #define FBOSTATUS_TO_STR(u) case u: return #u
702 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_COMPLETE_EXT);
703 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT);
704 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT);
705 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT);
706 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT);
707 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT);
708 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT);
709 FBOSTATUS_TO_STR(GL_FRAMEBUFFER_UNSUPPORTED_EXT);
710 #undef FBOSTATUS_TO_STR
712 FIXME("Unrecognied FBO status 0x%08x\n", status);
713 return "unrecognized";
717 const char *debug_glerror(GLenum error) {
719 #define GLERROR_TO_STR(u) case u: return #u
720 GLERROR_TO_STR(GL_NO_ERROR);
721 GLERROR_TO_STR(GL_INVALID_ENUM);
722 GLERROR_TO_STR(GL_INVALID_VALUE);
723 GLERROR_TO_STR(GL_INVALID_OPERATION);
724 GLERROR_TO_STR(GL_STACK_OVERFLOW);
725 GLERROR_TO_STR(GL_STACK_UNDERFLOW);
726 GLERROR_TO_STR(GL_OUT_OF_MEMORY);
727 GLERROR_TO_STR(GL_INVALID_FRAMEBUFFER_OPERATION_EXT);
728 #undef GLERROR_TO_STR
730 FIXME("Unrecognied GL error 0x%08x\n", error);
731 return "unrecognized";
735 /*****************************************************************************
736 * Useful functions mapping GL <-> D3D values
738 GLenum StencilOp(DWORD op) {
740 case WINED3DSTENCILOP_KEEP : return GL_KEEP;
741 case WINED3DSTENCILOP_ZERO : return GL_ZERO;
742 case WINED3DSTENCILOP_REPLACE : return GL_REPLACE;
743 case WINED3DSTENCILOP_INCRSAT : return GL_INCR;
744 case WINED3DSTENCILOP_DECRSAT : return GL_DECR;
745 case WINED3DSTENCILOP_INVERT : return GL_INVERT;
746 case WINED3DSTENCILOP_INCR : return GL_INCR_WRAP_EXT;
747 case WINED3DSTENCILOP_DECR : return GL_DECR_WRAP_EXT;
749 FIXME("Unrecognized stencil op %d\n", op);
754 GLenum CompareFunc(DWORD func) {
755 switch ((WINED3DCMPFUNC)func) {
756 case WINED3DCMP_NEVER : return GL_NEVER;
757 case WINED3DCMP_LESS : return GL_LESS;
758 case WINED3DCMP_EQUAL : return GL_EQUAL;
759 case WINED3DCMP_LESSEQUAL : return GL_LEQUAL;
760 case WINED3DCMP_GREATER : return GL_GREATER;
761 case WINED3DCMP_NOTEQUAL : return GL_NOTEQUAL;
762 case WINED3DCMP_GREATEREQUAL : return GL_GEQUAL;
763 case WINED3DCMP_ALWAYS : return GL_ALWAYS;
765 FIXME("Unrecognized WINED3DCMPFUNC value %d\n", func);
770 static GLenum d3dta_to_combiner_input(DWORD d3dta, DWORD stage, INT texture_idx) {
772 case WINED3DTA_DIFFUSE:
773 return GL_PRIMARY_COLOR_NV;
775 case WINED3DTA_CURRENT:
776 if (stage) return GL_SPARE0_NV;
777 else return GL_PRIMARY_COLOR_NV;
779 case WINED3DTA_TEXTURE:
780 if (texture_idx > -1) return GL_TEXTURE0_ARB + texture_idx;
781 else return GL_PRIMARY_COLOR_NV;
783 case WINED3DTA_TFACTOR:
784 return GL_CONSTANT_COLOR0_NV;
786 case WINED3DTA_SPECULAR:
787 return GL_SECONDARY_COLOR_NV;
790 /* TODO: Support WINED3DTSS_RESULTARG */
791 FIXME("WINED3DTA_TEMP, not properly supported.\n");
794 case WINED3DTA_CONSTANT:
795 /* TODO: Support per stage constants (WINED3DTSS_CONSTANT, NV_register_combiners2) */
796 FIXME("WINED3DTA_CONSTANT, not properly supported.\n");
797 return GL_CONSTANT_COLOR1_NV;
800 FIXME("Unrecognized texture arg %#x\n", d3dta);
805 static GLenum invert_mapping(GLenum mapping) {
806 if (mapping == GL_UNSIGNED_INVERT_NV) return GL_SIGNED_IDENTITY_NV;
807 else if (mapping == GL_SIGNED_IDENTITY_NV) return GL_UNSIGNED_INVERT_NV;
809 FIXME("Unhandled mapping %#x\n", mapping);
813 static void get_src_and_opr_nvrc(DWORD stage, DWORD arg, BOOL is_alpha, GLenum* input, GLenum* mapping, GLenum *component_usage, INT texture_idx) {
814 /* The WINED3DTA_COMPLEMENT flag specifies the complement of the input should
816 if (arg & WINED3DTA_COMPLEMENT) *mapping = GL_UNSIGNED_INVERT_NV;
817 else *mapping = GL_SIGNED_IDENTITY_NV;
819 /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component of the input
820 * should be used for all input components. */
821 if (is_alpha || arg & WINED3DTA_ALPHAREPLICATE) *component_usage = GL_ALPHA;
822 else *component_usage = GL_RGB;
824 *input = d3dta_to_combiner_input(arg & WINED3DTA_SELECTMASK, stage, texture_idx);
830 GLenum component_usage[3];
833 static BOOL is_invalid_op(IWineD3DDeviceImpl *This, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3) {
834 if (op == WINED3DTOP_DISABLE) return FALSE;
835 if (This->stateBlock->textures[stage]) return FALSE;
837 if (arg1 == WINED3DTA_TEXTURE && op != WINED3DTOP_SELECTARG2) return TRUE;
838 if (arg2 == WINED3DTA_TEXTURE && op != WINED3DTOP_SELECTARG1) return TRUE;
839 if (arg3 == WINED3DTA_TEXTURE && (op == WINED3DTOP_MULTIPLYADD || op == WINED3DTOP_LERP)) return TRUE;
844 void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx) {
845 IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl*)iface;
846 tex_op_args tex_op_args = {{0}, {0}, {0}};
847 GLenum portion = is_alpha ? GL_ALPHA : GL_RGB;
848 GLenum target = GL_COMBINER0_NV + stage;
850 TRACE("stage %d, is_alpha %d, op %s, arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",
851 stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, texture_idx);
853 /* If a texture stage references an invalid texture unit the stage just
854 * passes through the result from the previous stage */
855 if (is_invalid_op(This, stage, op, arg1, arg2, arg3)) {
856 arg1 = WINED3DTA_CURRENT;
857 op = WINED3DTOP_SELECTARG1;
860 get_src_and_opr_nvrc(stage, arg1, is_alpha, &tex_op_args.input[0],
861 &tex_op_args.mapping[0], &tex_op_args.component_usage[0], texture_idx);
862 get_src_and_opr_nvrc(stage, arg2, is_alpha, &tex_op_args.input[1],
863 &tex_op_args.mapping[1], &tex_op_args.component_usage[1], texture_idx);
864 get_src_and_opr_nvrc(stage, arg3, is_alpha, &tex_op_args.input[2],
865 &tex_op_args.mapping[2], &tex_op_args.component_usage[2], texture_idx);
868 /* This is called by a state handler which has the gl lock held and a context for the thread */
871 case WINED3DTOP_DISABLE:
873 if (!is_alpha) ERR("Shouldn't be called for WINED3DTSS_COLOROP (WINED3DTOP_DISABLE)\n");
874 /* Input, prev_alpha*1 */
875 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
876 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA));
877 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
878 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA));
881 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
882 GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
885 case WINED3DTOP_SELECTARG1:
886 case WINED3DTOP_SELECTARG2:
888 if (op == WINED3DTOP_SELECTARG1) {
889 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
890 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
892 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
893 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
895 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
896 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
899 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
900 GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
903 case WINED3DTOP_MODULATE:
904 case WINED3DTOP_MODULATE2X:
905 case WINED3DTOP_MODULATE4X:
906 /* Input, arg1*arg2 */
907 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
908 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
909 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
910 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
913 if (op == WINED3DTOP_MODULATE) {
914 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
915 GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
916 } else if (op == WINED3DTOP_MODULATE2X) {
917 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
918 GL_DISCARD_NV, GL_SCALE_BY_TWO_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
919 } else if (op == WINED3DTOP_MODULATE4X) {
920 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
921 GL_DISCARD_NV, GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
926 case WINED3DTOP_ADDSIGNED:
927 case WINED3DTOP_ADDSIGNED2X:
928 /* Input, arg1*1+arg2*1 */
929 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
930 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
931 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
932 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
933 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
934 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
935 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
936 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
939 if (op == WINED3DTOP_ADD) {
940 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
941 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
942 } else if (op == WINED3DTOP_ADDSIGNED) {
943 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
944 GL_SPARE0_NV, GL_NONE, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));
945 } else if (op == WINED3DTOP_ADDSIGNED2X) {
946 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
947 GL_SPARE0_NV, GL_SCALE_BY_TWO_NV, GL_BIAS_BY_NEGATIVE_ONE_HALF_NV, GL_FALSE, GL_FALSE, GL_FALSE));
951 case WINED3DTOP_SUBTRACT:
952 /* Input, arg1*1+-arg2*1 */
953 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
954 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
955 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
956 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
957 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
958 tex_op_args.input[1], GL_SIGNED_NEGATE_NV, tex_op_args.component_usage[1]));
959 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
960 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
963 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
964 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
967 case WINED3DTOP_ADDSMOOTH:
968 /* Input, arg1*1+(1-arg1)*arg2 */
969 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
970 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
971 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
972 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
973 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
974 tex_op_args.input[0], invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));
975 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
976 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
979 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
980 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
983 case WINED3DTOP_BLENDDIFFUSEALPHA:
984 case WINED3DTOP_BLENDTEXTUREALPHA:
985 case WINED3DTOP_BLENDFACTORALPHA:
986 case WINED3DTOP_BLENDTEXTUREALPHAPM:
987 case WINED3DTOP_BLENDCURRENTALPHA:
989 GLenum alpha_src = GL_PRIMARY_COLOR_NV;
990 if (op == WINED3DTOP_BLENDDIFFUSEALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_DIFFUSE, stage, texture_idx);
991 else if (op == WINED3DTOP_BLENDTEXTUREALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);
992 else if (op == WINED3DTOP_BLENDFACTORALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_TFACTOR, stage, texture_idx);
993 else if (op == WINED3DTOP_BLENDTEXTUREALPHAPM) alpha_src = d3dta_to_combiner_input(WINED3DTA_TEXTURE, stage, texture_idx);
994 else if (op == WINED3DTOP_BLENDCURRENTALPHA) alpha_src = d3dta_to_combiner_input(WINED3DTA_CURRENT, stage, texture_idx);
995 else FIXME("Unhandled WINED3DTOP %s, shouldn't happen\n", debug_d3dtop(op));
997 /* Input, arg1*alpha_src+arg2*(1-alpha_src) */
998 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
999 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
1000 if (op == WINED3DTOP_BLENDTEXTUREALPHAPM)
1002 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1003 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1005 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1006 alpha_src, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA));
1008 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1009 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1010 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1011 alpha_src, GL_UNSIGNED_INVERT_NV, GL_ALPHA));
1014 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1015 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1019 case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
1020 /* Input, arg1_alpha*arg2_rgb+arg1_rgb*1 */
1021 if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATEALPHA_ADDCOLOR)\n");
1022 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1023 tex_op_args.input[0], tex_op_args.mapping[0], GL_ALPHA));
1024 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1025 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1026 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1027 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
1028 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1029 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1032 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1033 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1036 case WINED3DTOP_MODULATECOLOR_ADDALPHA:
1037 /* Input, arg1_rgb*arg2_rgb+arg1_alpha*1 */
1038 if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATECOLOR_ADDALPHA)\n");
1039 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1040 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
1041 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1042 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1043 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1044 tex_op_args.input[0], tex_op_args.mapping[0], GL_ALPHA));
1045 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1046 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1049 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1050 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1053 case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
1054 /* Input, (1-arg1_alpha)*arg2_rgb+arg1_rgb*1 */
1055 if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATEINVALPHA_ADDCOLOR)\n");
1056 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1057 tex_op_args.input[0], invert_mapping(tex_op_args.mapping[0]), GL_ALPHA));
1058 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1059 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1060 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1061 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
1062 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1063 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1066 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1067 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1070 case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
1071 /* Input, (1-arg1_rgb)*arg2_rgb+arg1_alpha*1 */
1072 if (is_alpha) ERR("Only supported for WINED3DTSS_COLOROP (WINED3DTOP_MODULATEINVCOLOR_ADDALPHA)\n");
1073 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1074 tex_op_args.input[0], invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));
1075 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1076 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1077 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1078 tex_op_args.input[0], tex_op_args.mapping[0], GL_ALPHA));
1079 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1080 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1083 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1084 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1087 case WINED3DTOP_DOTPRODUCT3:
1088 /* Input, arg1 . arg2 */
1089 /* FIXME: DX7 uses a different calculation? */
1090 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1091 tex_op_args.input[0], GL_EXPAND_NORMAL_NV, tex_op_args.component_usage[0]));
1092 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1093 tex_op_args.input[1], GL_EXPAND_NORMAL_NV, tex_op_args.component_usage[1]));
1096 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
1097 GL_DISCARD_NV, GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE));
1100 case WINED3DTOP_MULTIPLYADD:
1101 /* Input, arg1*1+arg2*arg3 */
1102 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1103 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
1104 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1105 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1106 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1107 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1108 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1109 tex_op_args.input[2], tex_op_args.mapping[2], tex_op_args.component_usage[2]));
1112 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1113 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1116 case WINED3DTOP_LERP:
1117 /* Input, arg1*arg2+(1-arg1)*arg3 */
1118 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1119 tex_op_args.input[0], tex_op_args.mapping[0], tex_op_args.component_usage[0]));
1120 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1121 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1122 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_C_NV,
1123 tex_op_args.input[0], invert_mapping(tex_op_args.mapping[0]), tex_op_args.component_usage[0]));
1124 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_D_NV,
1125 tex_op_args.input[2], tex_op_args.mapping[2], tex_op_args.component_usage[2]));
1128 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_DISCARD_NV, GL_DISCARD_NV,
1129 GL_SPARE0_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1132 case WINED3DTOP_BUMPENVMAPLUMINANCE:
1133 case WINED3DTOP_BUMPENVMAP:
1134 if(GL_SUPPORT(NV_TEXTURE_SHADER)) {
1135 /* The bump map stage itself isn't exciting, just read the texture. But tell the next stage to
1136 * perform bump mapping and source from the current stage. Pretty much a SELECTARG2.
1137 * ARG2 is passed through unmodified(apps will most likely use D3DTA_CURRENT for arg2, arg1
1138 * (which will most likely be D3DTA_TEXTURE) is available as a texture shader input for the next stage
1140 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_A_NV,
1141 tex_op_args.input[1], tex_op_args.mapping[1], tex_op_args.component_usage[1]));
1142 GL_EXTCALL(glCombinerInputNV(target, portion, GL_VARIABLE_B_NV,
1143 GL_ZERO, GL_UNSIGNED_INVERT_NV, portion));
1144 GL_EXTCALL(glCombinerOutputNV(target, portion, GL_SPARE0_NV, GL_DISCARD_NV,
1145 GL_DISCARD_NV, GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE));
1150 FIXME("Unhandled WINED3DTOP: stage %d, is_alpha %d, op %s (%#x), arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",
1151 stage, is_alpha, debug_d3dtop(op), op, arg1, arg2, arg3, texture_idx);
1154 checkGLcall("set_tex_op_nvrc()\n");
1158 static void get_src_and_opr(DWORD arg, BOOL is_alpha, GLenum* source, GLenum* operand) {
1159 /* The WINED3DTA_ALPHAREPLICATE flag specifies the alpha component of the
1160 * input should be used for all input components. The WINED3DTA_COMPLEMENT
1161 * flag specifies the complement of the input should be used. */
1162 BOOL from_alpha = is_alpha || arg & WINED3DTA_ALPHAREPLICATE;
1163 BOOL complement = arg & WINED3DTA_COMPLEMENT;
1165 /* Calculate the operand */
1167 if (from_alpha) *operand = GL_ONE_MINUS_SRC_ALPHA;
1168 else *operand = GL_ONE_MINUS_SRC_COLOR;
1170 if (from_alpha) *operand = GL_SRC_ALPHA;
1171 else *operand = GL_SRC_COLOR;
1174 /* Calculate the source */
1175 switch (arg & WINED3DTA_SELECTMASK) {
1176 case WINED3DTA_CURRENT: *source = GL_PREVIOUS_EXT; break;
1177 case WINED3DTA_DIFFUSE: *source = GL_PRIMARY_COLOR_EXT; break;
1178 case WINED3DTA_TEXTURE: *source = GL_TEXTURE; break;
1179 case WINED3DTA_TFACTOR: *source = GL_CONSTANT_EXT; break;
1180 case WINED3DTA_SPECULAR:
1182 * According to the GL_ARB_texture_env_combine specs, SPECULAR is
1183 * 'Secondary color' and isn't supported until base GL supports it
1184 * There is no concept of temp registers as far as I can tell
1186 FIXME("Unhandled texture arg WINED3DTA_SPECULAR\n");
1187 *source = GL_TEXTURE;
1190 FIXME("Unrecognized texture arg %#x\n", arg);
1191 *source = GL_TEXTURE;
1196 /* Set texture operations up - The following avoids lots of ifdefs in this routine!*/
1197 #if defined (GL_VERSION_1_3)
1198 # define useext(A) A
1199 # define combine_ext 1
1200 #elif defined (GL_EXT_texture_env_combine)
1201 # define useext(A) A##_EXT
1202 # define combine_ext 1
1203 #elif defined (GL_ARB_texture_env_combine)
1204 # define useext(A) A##_ARB
1205 # define combine_ext 1
1210 #if !defined(combine_ext)
1211 void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
1213 FIXME("Requires opengl combine extensions to work\n");
1217 /* Setup the texture operations texture stage states */
1218 void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3)
1220 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
1221 GLenum src1, src2, src3;
1222 GLenum opr1, opr2, opr3;
1224 GLenum src0_target, src1_target, src2_target;
1225 GLenum opr0_target, opr1_target, opr2_target;
1227 GLenum opr=0, invopr, src3_target, opr3_target;
1228 BOOL Handled = FALSE;
1229 IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
1231 TRACE("Alpha?(%d), Stage:%d Op(%s), a1(%d), a2(%d), a3(%d)\n", isAlpha, Stage, debug_d3dtop(op), arg1, arg2, arg3);
1233 /* This is called by a state handler which has the gl lock held and a context for the thread */
1235 /* Note: Operations usually involve two ars, src0 and src1 and are operations of
1236 the form (a1 <operation> a2). However, some of the more complex operations
1237 take 3 parameters. Instead of the (sensible) addition of a3, Microsoft added
1238 in a third parameter called a0. Therefore these are operations of the form
1239 a0 <operation> a1 <operation> a2, ie the new parameter goes to the front.
1241 However, below we treat the new (a0) parameter as src2/opr2, so in the actual
1242 functions below, expect their syntax to differ slightly to those listed in the
1243 manuals, ie replace arg1 with arg3, arg2 with arg1 and arg3 with arg2
1244 This affects WINED3DTOP_MULTIPLYADD and WINED3DTOP_LERP */
1247 comb_target = useext(GL_COMBINE_ALPHA);
1248 src0_target = useext(GL_SOURCE0_ALPHA);
1249 src1_target = useext(GL_SOURCE1_ALPHA);
1250 src2_target = useext(GL_SOURCE2_ALPHA);
1251 opr0_target = useext(GL_OPERAND0_ALPHA);
1252 opr1_target = useext(GL_OPERAND1_ALPHA);
1253 opr2_target = useext(GL_OPERAND2_ALPHA);
1254 scal_target = GL_ALPHA_SCALE;
1257 comb_target = useext(GL_COMBINE_RGB);
1258 src0_target = useext(GL_SOURCE0_RGB);
1259 src1_target = useext(GL_SOURCE1_RGB);
1260 src2_target = useext(GL_SOURCE2_RGB);
1261 opr0_target = useext(GL_OPERAND0_RGB);
1262 opr1_target = useext(GL_OPERAND1_RGB);
1263 opr2_target = useext(GL_OPERAND2_RGB);
1264 scal_target = useext(GL_RGB_SCALE);
1267 /* If a texture stage references an invalid texture unit the stage just
1268 * passes through the result from the previous stage */
1269 if (is_invalid_op(This, Stage, op, arg1, arg2, arg3)) {
1270 arg1 = WINED3DTA_CURRENT;
1271 op = WINED3DTOP_SELECTARG1;
1274 /* From MSDN (WINED3DTSS_ALPHAARG1) :
1275 The default argument is WINED3DTA_TEXTURE. If no texture is set for this stage,
1276 then the default argument is WINED3DTA_DIFFUSE.
1277 FIXME? If texture added/removed, may need to reset back as well? */
1278 if (isAlpha && This->stateBlock->textures[Stage] == NULL && arg1 == WINED3DTA_TEXTURE) {
1279 get_src_and_opr(WINED3DTA_DIFFUSE, isAlpha, &src1, &opr1);
1281 get_src_and_opr(arg1, isAlpha, &src1, &opr1);
1283 get_src_and_opr(arg2, isAlpha, &src2, &opr2);
1284 get_src_and_opr(arg3, isAlpha, &src3, &opr3);
1286 TRACE("ct(%x), 1:(%x,%x), 2:(%x,%x), 3:(%x,%x)\n", comb_target, src1, opr1, src2, opr2, src3, opr3);
1288 Handled = TRUE; /* Assume will be handled */
1290 /* Other texture operations require special extensions: */
1291 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
1294 invopr = GL_ONE_MINUS_SRC_ALPHA;
1295 src3_target = GL_SOURCE3_ALPHA_NV;
1296 opr3_target = GL_OPERAND3_ALPHA_NV;
1299 invopr = GL_ONE_MINUS_SRC_COLOR;
1300 src3_target = GL_SOURCE3_RGB_NV;
1301 opr3_target = GL_OPERAND3_RGB_NV;
1304 case WINED3DTOP_DISABLE: /* Only for alpha */
1305 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1306 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
1307 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
1308 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1309 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
1310 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1311 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1312 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1313 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1314 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1315 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
1316 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
1317 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1318 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
1319 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1320 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1321 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1322 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1324 case WINED3DTOP_SELECTARG1: /* = a1 * 1 + 0 * 0 */
1325 case WINED3DTOP_SELECTARG2: /* = a2 * 1 + 0 * 0 */
1326 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1327 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1328 if (op == WINED3DTOP_SELECTARG1) {
1329 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1330 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1331 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1332 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1334 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
1335 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
1336 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
1337 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
1339 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1340 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1341 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1342 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1343 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
1344 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_ZERO");
1345 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1346 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
1347 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1348 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1349 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1350 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1353 case WINED3DTOP_MODULATE:
1354 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1355 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
1356 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1357 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1358 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1359 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1360 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1361 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1362 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1363 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1364 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
1365 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1366 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1367 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1368 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1369 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1370 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1371 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
1372 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1373 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1375 case WINED3DTOP_MODULATE2X:
1376 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1377 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
1378 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1379 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1380 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1381 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1382 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1383 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1384 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1385 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1386 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
1387 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1388 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1389 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1390 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1391 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1392 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1393 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
1394 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1395 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1397 case WINED3DTOP_MODULATE4X:
1398 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1399 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
1400 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1401 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1402 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1403 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1404 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1405 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1406 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1407 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1408 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_ZERO);
1409 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1410 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1411 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1412 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1413 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1414 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1415 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr1");
1416 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
1417 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
1420 case WINED3DTOP_ADD:
1421 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1422 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1423 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1424 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1425 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1426 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1427 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1428 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1429 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1430 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1431 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1432 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1433 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1434 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1435 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1436 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1437 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1438 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1439 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1440 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1443 case WINED3DTOP_ADDSIGNED:
1444 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1445 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
1446 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1447 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1448 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1449 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1450 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1451 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1452 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1453 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1454 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1455 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1456 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1457 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1458 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1459 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1460 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1461 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1462 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1463 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1466 case WINED3DTOP_ADDSIGNED2X:
1467 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1468 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
1469 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1470 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1471 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1472 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1473 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1474 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1475 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1476 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1477 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1478 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1479 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1480 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1481 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1482 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1483 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1484 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1485 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1486 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1489 case WINED3DTOP_ADDSMOOTH:
1490 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1491 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1492 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1493 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1494 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1495 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1496 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1497 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1498 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1499 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1500 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1501 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1502 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1503 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1504 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
1505 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
1507 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1508 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1509 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1510 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1512 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1513 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1514 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1515 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1518 case WINED3DTOP_BLENDDIFFUSEALPHA:
1519 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1520 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1521 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1522 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1523 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1524 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1525 glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR));
1526 checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_PRIMARY_COLOR)");
1527 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1528 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1529 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1530 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1531 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1532 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1533 glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR));
1534 checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_PRIMARY_COLOR)");
1535 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
1536 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
1537 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1538 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1540 case WINED3DTOP_BLENDTEXTUREALPHA:
1541 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1542 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1543 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1544 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1545 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1546 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1547 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_TEXTURE);
1548 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_TEXTURE");
1549 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1550 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1551 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1552 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1553 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1554 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1555 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
1556 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
1557 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
1558 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
1559 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1560 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1562 case WINED3DTOP_BLENDFACTORALPHA:
1563 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1564 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1565 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1566 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1567 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1568 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1569 glTexEnvi(GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT));
1570 checkGLcall("GL_TEXTURE_ENV, src1_target, useext(GL_CONSTANT)");
1571 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1572 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1573 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1574 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1575 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1576 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1577 glTexEnvi(GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT));
1578 checkGLcall("GL_TEXTURE_ENV, src3_target, useext(GL_CONSTANT)");
1579 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
1580 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
1581 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1582 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1584 case WINED3DTOP_BLENDTEXTUREALPHAPM:
1585 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1586 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1587 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1588 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1589 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1590 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1591 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1592 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1593 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1594 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1595 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1596 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1597 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1598 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1599 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_TEXTURE);
1600 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_TEXTURE");
1601 glTexEnvi(GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA);
1602 checkGLcall("GL_TEXTURE_ENV, opr3_target, GL_ONE_MINUS_SRC_ALPHA");
1603 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1604 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1606 case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
1607 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1608 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD"); /* Add = a0*a1 + a2*a3 */
1609 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1); /* a0 = src1/opr1 */
1610 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1611 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1612 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1"); /* a1 = 1 (see docs) */
1613 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1614 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1615 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1616 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1617 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2); /* a2 = arg2 */
1618 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1619 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1620 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2"); /* a3 = src1 alpha */
1621 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
1622 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
1624 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1625 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1627 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1628 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1629 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1630 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1632 case WINED3DTOP_MODULATECOLOR_ADDALPHA:
1633 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1634 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1635 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1636 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1637 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1638 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1639 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1640 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1641 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1642 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1643 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
1644 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
1646 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1647 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1649 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1650 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
1651 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1652 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1653 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1654 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1655 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1656 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1658 case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
1659 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1660 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1661 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1662 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1663 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1664 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1665 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1666 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1667 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1668 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1669 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
1670 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1671 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
1672 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1673 glTexEnvi(GL_TEXTURE_ENV, src3_target, src1);
1674 checkGLcall("GL_TEXTURE_ENV, src3_target, src1");
1676 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1677 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1678 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1679 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1681 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr);
1682 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr");
1683 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1684 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1686 case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
1687 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1688 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1689 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1690 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1692 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
1693 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
1694 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1695 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
1697 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
1698 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
1699 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1700 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1701 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1702 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1703 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
1704 checkGLcall("GL_TEXTURE_ENV, src2_target, src1");
1706 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
1707 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
1709 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr);
1710 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr");
1711 glTexEnvi(GL_TEXTURE_ENV, src3_target, GL_ZERO);
1712 checkGLcall("GL_TEXTURE_ENV, src3_target, GL_ZERO");
1713 glTexEnvi(GL_TEXTURE_ENV, opr3_target, invopr);
1714 checkGLcall("GL_TEXTURE_ENV, opr3_target, invopr");
1715 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1716 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1718 case WINED3DTOP_MULTIPLYADD:
1719 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1720 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1721 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
1722 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1723 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
1724 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1725 glTexEnvi(GL_TEXTURE_ENV, src1_target, GL_ZERO);
1726 checkGLcall("GL_TEXTURE_ENV, src1_target, GL_ZERO");
1727 glTexEnvi(GL_TEXTURE_ENV, opr1_target, invopr);
1728 checkGLcall("GL_TEXTURE_ENV, opr1_target, invopr");
1729 glTexEnvi(GL_TEXTURE_ENV, src2_target, src1);
1730 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
1731 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr1);
1732 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
1733 glTexEnvi(GL_TEXTURE_ENV, src3_target, src2);
1734 checkGLcall("GL_TEXTURE_ENV, src3_target, src3");
1735 glTexEnvi(GL_TEXTURE_ENV, opr3_target, opr2);
1736 checkGLcall("GL_TEXTURE_ENV, opr3_target, opr3");
1737 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1738 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1741 case WINED3DTOP_BUMPENVMAP:
1745 case WINED3DTOP_BUMPENVMAPLUMINANCE:
1746 FIXME("Implement bump environment mapping in GL_NV_texture_env_combine4 path\n");
1752 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV);
1753 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE4_NV");
1757 } /* GL_NV_texture_env_combine4 */
1759 Handled = TRUE; /* Again, assume handled */
1761 case WINED3DTOP_DISABLE: /* Only for alpha */
1762 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
1763 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
1764 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT);
1765 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_PREVIOUS_EXT");
1766 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA);
1767 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_SRC_ALPHA");
1768 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1769 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1771 case WINED3DTOP_SELECTARG1:
1772 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
1773 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
1774 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1775 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1776 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1777 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1778 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1779 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1781 case WINED3DTOP_SELECTARG2:
1782 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_REPLACE);
1783 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_REPLACE");
1784 glTexEnvi(GL_TEXTURE_ENV, src0_target, src2);
1785 checkGLcall("GL_TEXTURE_ENV, src0_target, src2");
1786 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr2);
1787 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr2");
1788 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1789 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1791 case WINED3DTOP_MODULATE:
1792 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1793 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1794 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1795 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1796 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1797 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1798 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1799 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1800 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1801 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1802 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1803 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1805 case WINED3DTOP_MODULATE2X:
1806 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1807 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1808 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1809 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1810 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1811 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1812 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1813 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1814 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1815 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1816 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1817 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1819 case WINED3DTOP_MODULATE4X:
1820 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE);
1821 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE");
1822 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1823 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1824 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1825 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1826 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1827 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1828 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1829 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1830 glTexEnvi(GL_TEXTURE_ENV, scal_target, 4);
1831 checkGLcall("GL_TEXTURE_ENV, scal_target, 4");
1833 case WINED3DTOP_ADD:
1834 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_ADD);
1835 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_ADD");
1836 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1837 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1838 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1839 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1840 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1841 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1842 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1843 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1844 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1845 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1847 case WINED3DTOP_ADDSIGNED:
1848 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1849 checkGLcall("GL_TEXTURE_ENV, comb_target, useext((GL_ADD_SIGNED)");
1850 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1851 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1852 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1853 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1854 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1855 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1856 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1857 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1858 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1859 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1861 case WINED3DTOP_ADDSIGNED2X:
1862 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED));
1863 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_ADD_SIGNED)");
1864 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1865 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1866 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1867 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1868 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1869 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1870 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1871 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1872 glTexEnvi(GL_TEXTURE_ENV, scal_target, 2);
1873 checkGLcall("GL_TEXTURE_ENV, scal_target, 2");
1875 case WINED3DTOP_SUBTRACT:
1876 if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE)) {
1877 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_SUBTRACT);
1878 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_SUBTRACT)");
1879 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1880 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1881 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1882 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1883 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1884 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1885 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1886 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1887 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1888 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1890 FIXME("This version of opengl does not support GL_SUBTRACT\n");
1894 case WINED3DTOP_BLENDDIFFUSEALPHA:
1895 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1896 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1897 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1898 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1899 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1900 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1901 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1902 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1903 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1904 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1905 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PRIMARY_COLOR));
1906 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PRIMARY_COLOR");
1907 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1908 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1909 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1910 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1912 case WINED3DTOP_BLENDTEXTUREALPHA:
1913 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1914 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1915 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1916 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1917 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1918 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1919 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1920 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1921 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1922 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1923 glTexEnvi(GL_TEXTURE_ENV, src2_target, GL_TEXTURE);
1924 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_TEXTURE");
1925 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1926 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1927 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1928 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1930 case WINED3DTOP_BLENDFACTORALPHA:
1931 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1932 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1933 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1934 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1935 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1936 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1937 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1938 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1939 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1940 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1941 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_CONSTANT));
1942 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_CONSTANT");
1943 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1944 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1945 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1946 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1948 case WINED3DTOP_BLENDCURRENTALPHA:
1949 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1950 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1951 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1952 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1953 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1954 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1955 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1956 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1957 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1958 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1959 glTexEnvi(GL_TEXTURE_ENV, src2_target, useext(GL_PREVIOUS));
1960 checkGLcall("GL_TEXTURE_ENV, src2_target, GL_PREVIOUS");
1961 glTexEnvi(GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA);
1962 checkGLcall("GL_TEXTURE_ENV, opr2_target, GL_SRC_ALPHA");
1963 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1964 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1966 case WINED3DTOP_DOTPRODUCT3:
1967 if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) {
1968 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB);
1969 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_ARB");
1970 } else if (GL_SUPPORT(EXT_TEXTURE_ENV_DOT3)) {
1971 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT);
1972 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA_EXT");
1974 FIXME("This version of opengl does not support GL_DOT3\n");
1976 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1977 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1978 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1979 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1980 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1981 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1982 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1983 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1984 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
1985 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
1987 case WINED3DTOP_LERP:
1988 glTexEnvi(GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE));
1989 checkGLcall("GL_TEXTURE_ENV, comb_target, useext(GL_INTERPOLATE)");
1990 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
1991 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
1992 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
1993 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
1994 glTexEnvi(GL_TEXTURE_ENV, src1_target, src2);
1995 checkGLcall("GL_TEXTURE_ENV, src1_target, src2");
1996 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr2);
1997 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr2");
1998 glTexEnvi(GL_TEXTURE_ENV, src2_target, src3);
1999 checkGLcall("GL_TEXTURE_ENV, src2_target, src3");
2000 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr3);
2001 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr3");
2002 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2003 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2005 case WINED3DTOP_ADDSMOOTH:
2006 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2007 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2008 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2009 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
2010 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2012 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
2013 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
2014 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2015 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
2017 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
2018 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
2019 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2020 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2021 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
2022 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
2023 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2024 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2025 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2026 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2027 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2028 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2032 case WINED3DTOP_BLENDTEXTUREALPHAPM:
2033 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2034 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2035 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2036 glTexEnvi(GL_TEXTURE_ENV, src0_target, GL_TEXTURE);
2037 checkGLcall("GL_TEXTURE_ENV, src0_target, GL_TEXTURE");
2038 glTexEnvi(GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_ALPHA);
2039 checkGLcall("GL_TEXTURE_ENV, opr0_target, GL_ONE_MINUS_SRC_APHA");
2040 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2041 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2042 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
2043 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
2044 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2045 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2046 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2047 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2048 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2049 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2053 case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
2054 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2055 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2056 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2057 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
2058 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2060 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
2061 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2062 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
2063 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2065 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
2066 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
2067 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2068 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2069 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
2070 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
2071 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2072 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2073 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2074 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2075 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2076 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2080 case WINED3DTOP_MODULATECOLOR_ADDALPHA:
2081 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2082 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2083 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2084 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
2085 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2086 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr1);
2087 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr1");
2088 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2089 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2091 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
2092 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2093 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
2094 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2096 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
2097 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
2098 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2099 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2100 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2101 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2102 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2103 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2107 case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
2108 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2109 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2110 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2111 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
2112 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2114 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2115 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_ALPHA; break;
2116 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2117 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
2119 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
2120 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
2121 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2122 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2123 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
2124 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
2125 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2126 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2127 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2128 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2129 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2130 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2134 case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
2135 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2136 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2137 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2138 glTexEnvi(GL_TEXTURE_ENV, src0_target, src1);
2139 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2141 case GL_SRC_COLOR: opr = GL_ONE_MINUS_SRC_COLOR; break;
2142 case GL_ONE_MINUS_SRC_COLOR: opr = GL_SRC_COLOR; break;
2143 case GL_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2144 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
2146 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr);
2147 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr");
2148 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2149 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2151 case GL_SRC_COLOR: opr = GL_SRC_ALPHA; break;
2152 case GL_ONE_MINUS_SRC_COLOR: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2153 case GL_SRC_ALPHA: opr = GL_SRC_ALPHA; break;
2154 case GL_ONE_MINUS_SRC_ALPHA: opr = GL_ONE_MINUS_SRC_ALPHA; break;
2156 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr);
2157 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr");
2158 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2159 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2160 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2161 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2162 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2163 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2167 case WINED3DTOP_MULTIPLYADD:
2168 if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3)) {
2169 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI);
2170 checkGLcall("GL_TEXTURE_ENV, comb_target, GL_MODULATE_ADD_ATI");
2171 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
2172 checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
2173 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
2174 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
2175 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2176 checkGLcall("GL_TEXTURE_ENV, src1_target, src1");
2177 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
2178 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
2179 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2180 checkGLcall("GL_TEXTURE_ENV, src2_target, src2");
2181 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2182 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2183 glTexEnvi(GL_TEXTURE_ENV, scal_target, 1);
2184 checkGLcall("GL_TEXTURE_ENV, scal_target, 1");
2188 case WINED3DTOP_BUMPENVMAPLUMINANCE:
2189 if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
2190 /* Some apps use BUMPENVMAPLUMINANCE instead of D3DTOP_BUMPENVMAP, although
2191 * they check for the non-luminance cap flag. Well, give them what they asked
2194 WARN("Application uses WINED3DTOP_BUMPENVMAPLUMINANCE\n");
2200 case WINED3DTOP_BUMPENVMAP:
2201 if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) {
2202 TRACE("Using ati bumpmap on stage %d, target %d\n", Stage, Stage + 1);
2203 glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_BUMP_ENVMAP_ATI);
2204 checkGLcall("glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_BUMP_ENVMAP_ATI)");
2205 glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, GL_TEXTURE0_ARB + Stage + 1);
2206 checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_BUMP_TARGET_ATI, GL_TEXTURE0_ARB + Stage + 1)");
2207 glTexEnvi(GL_TEXTURE_ENV, src0_target, src3);
2208 checkGLcall("GL_TEXTURE_ENV, src0_target, src3");
2209 glTexEnvi(GL_TEXTURE_ENV, opr0_target, opr3);
2210 checkGLcall("GL_TEXTURE_ENV, opr0_target, opr3");
2211 glTexEnvi(GL_TEXTURE_ENV, src1_target, src1);
2212 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2213 glTexEnvi(GL_TEXTURE_ENV, opr1_target, opr1);
2214 checkGLcall("GL_TEXTURE_ENV, opr1_target, opr1");
2215 glTexEnvi(GL_TEXTURE_ENV, src2_target, src2);
2216 checkGLcall("GL_TEXTURE_ENV, src0_target, src1");
2217 glTexEnvi(GL_TEXTURE_ENV, opr2_target, opr2);
2218 checkGLcall("GL_TEXTURE_ENV, opr2_target, opr2");
2222 } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {
2223 /* Technically texture shader support without register combiners is possible, but not expected to occur
2224 * on real world cards, so for now a fixme should be enough
2226 FIXME("Implement bump mapping with GL_NV_texture_shader in non register combiner path\n");
2233 BOOL combineOK = TRUE;
2234 if (GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) {
2238 op2 = This->stateBlock->textureState[Stage][WINED3DTSS_COLOROP];
2240 op2 = This->stateBlock->textureState[Stage][WINED3DTSS_ALPHAOP];
2243 /* Note: If COMBINE4 in effect can't go back to combine! */
2245 case WINED3DTOP_ADDSMOOTH:
2246 case WINED3DTOP_BLENDTEXTUREALPHAPM:
2247 case WINED3DTOP_MODULATEALPHA_ADDCOLOR:
2248 case WINED3DTOP_MODULATECOLOR_ADDALPHA:
2249 case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR:
2250 case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA:
2251 case WINED3DTOP_MULTIPLYADD:
2252 /* Ignore those implemented in both cases */
2254 case WINED3DTOP_SELECTARG1:
2255 case WINED3DTOP_SELECTARG2:
2260 FIXME("Can't use COMBINE4 and COMBINE together, thisop=%s, otherop=%s, isAlpha(%d)\n", debug_d3dtop(op), debug_d3dtop(op2), isAlpha);
2267 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE));
2268 checkGLcall("GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, useext(GL_COMBINE)");
2274 /* After all the extensions, if still unhandled, report fixme */
2275 FIXME("Unhandled texture operation %s\n", debug_d3dtop(op));
2276 #undef GLINFO_LOCATION
2280 /* Setup this textures matrix according to the texture flags*/
2281 void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords)
2285 glMatrixMode(GL_TEXTURE);
2286 checkGLcall("glMatrixMode(GL_TEXTURE)");
2288 if (flags == WINED3DTTFF_DISABLE) {
2290 checkGLcall("glLoadIdentity()");
2294 if (flags == (WINED3DTTFF_COUNT1|WINED3DTTFF_PROJECTED)) {
2295 ERR("Invalid texture transform flags: WINED3DTTFF_COUNT1|WINED3DTTFF_PROJECTED\n");
2299 memcpy(mat, smat, 16 * sizeof(float));
2301 switch (flags & ~WINED3DTTFF_PROJECTED) {
2302 case WINED3DTTFF_COUNT1: mat[1] = mat[5] = mat[13] = 0;
2303 case WINED3DTTFF_COUNT2: mat[2] = mat[6] = mat[10] = mat[14] = 0;
2304 default: mat[3] = mat[7] = mat[11] = 0, mat[15] = 1;
2307 if (flags & WINED3DTTFF_PROJECTED) {
2308 switch (flags & ~WINED3DTTFF_PROJECTED) {
2309 case WINED3DTTFF_COUNT2:
2310 mat[3] = mat[1], mat[7] = mat[5], mat[11] = mat[9], mat[15] = mat[13];
2311 mat[1] = mat[5] = mat[9] = mat[13] = 0;
2313 case WINED3DTTFF_COUNT3:
2314 mat[3] = mat[2], mat[7] = mat[6], mat[11] = mat[10], mat[15] = mat[14];
2315 mat[2] = mat[6] = mat[10] = mat[14] = 0;
2318 } else if(!calculatedCoords) { /* under directx the R/Z coord can be used for translation, under opengl we use the Q coord instead */
2324 checkGLcall("glLoadMatrixf(mat)");
2327 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
2329 /* Convertes a D3D format into a OpenGL configuration format */
2330 int D3DFmtMakeGlCfg(WINED3DFORMAT BackBufferFormat, WINED3DFORMAT StencilBufferFormat, int *attribs, int* nAttribs, BOOL alternate){
2331 #define PUSH1(att) attribs[(*nAttribs)++] = (att);
2332 #define PUSH2(att,value) attribs[(*nAttribs)++] = (att); attribs[(*nAttribs)++] = (value);
2333 /*We need to do some Card specific stuff in here at some point,
2334 D3D now supports floating point format buffers, and there are a number of different OpelGl ways of managing these e.g.
2335 GLX_ATI_pixel_format_float
2337 switch (BackBufferFormat) {
2340 PUSH2(GLX_RENDER_TYPE, GLX_COLOR_INDEX_BIT);
2341 PUSH2(GLX_BUFFER_SIZE, 8);
2342 PUSH2(GLX_DOUBLEBUFFER, TRUE);
2345 case WINED3DFMT_R3G3B2:
2346 PUSH2(GLX_RENDER_TYPE, GLX_RGBA_BIT);
2347 PUSH2(GLX_RED_SIZE, 3);
2348 PUSH2(GLX_GREEN_SIZE, 3);
2349 PUSH2(GLX_BLUE_SIZE, 2);
2352 case WINED3DFMT_A1R5G5B5:
2353 PUSH2(GLX_ALPHA_SIZE, 1);
2354 case WINED3DFMT_X1R5G5B5:
2355 PUSH2(GLX_RED_SIZE, 5);
2356 PUSH2(GLX_GREEN_SIZE, 5);
2357 PUSH2(GLX_BLUE_SIZE, 5);
2360 case WINED3DFMT_R5G6B5:
2361 PUSH2(GLX_RED_SIZE, 5);
2362 PUSH2(GLX_GREEN_SIZE, 6);
2363 PUSH2(GLX_BLUE_SIZE, 5);
2366 case WINED3DFMT_A4R4G4B4:
2367 PUSH2(GLX_ALPHA_SIZE, 4);
2368 case WINED3DFMT_X4R4G4B4:
2369 PUSH2(GLX_RED_SIZE, 4);
2370 PUSH2(GLX_GREEN_SIZE, 4);
2371 PUSH2(GLX_BLUE_SIZE, 4);
2374 case WINED3DFMT_A8R8G8B8:
2375 PUSH2(GLX_ALPHA_SIZE, 8);
2376 case WINED3DFMT_R8G8B8:
2377 case WINED3DFMT_X8R8G8B8:
2378 PUSH2(GLX_RED_SIZE, 8);
2379 PUSH2(GLX_GREEN_SIZE, 8);
2380 PUSH2(GLX_BLUE_SIZE, 8);
2383 case WINED3DFMT_A2R10G10B10:
2384 PUSH2(GLX_ALPHA_SIZE, 2);
2385 PUSH2(GLX_RED_SIZE, 10);
2386 PUSH2(GLX_GREEN_SIZE, 10);
2387 PUSH2(GLX_BLUE_SIZE, 10);
2390 case WINED3DFMT_A16B16G16R16:
2391 PUSH2(GLX_ALPHA_SIZE, 16);
2392 PUSH2(GLX_RED_SIZE, 16);
2393 PUSH2(GLX_GREEN_SIZE, 16);
2394 PUSH2(GLX_BLUE_SIZE, 16);
2398 FIXME("Unsupported color format: %s\n", debug_d3dformat(BackBufferFormat));
2402 switch (StencilBufferFormat) {
2406 case WINED3DFMT_D16_LOCKABLE:
2407 case WINED3DFMT_D16:
2408 PUSH2(GLX_DEPTH_SIZE, 16);
2411 case WINED3DFMT_D15S1:
2412 PUSH2(GLX_DEPTH_SIZE, 15);
2413 PUSH2(GLX_STENCIL_SIZE, 1);
2414 /*Does openGl support a 1bit stencil?, I've seen it used elsewhere
2415 e.g. http://www.ks.uiuc.edu/Research/vmd/doxygen/OpenGLDisplayDevice_8C-source.html*/
2418 case WINED3DFMT_D24X8:
2419 PUSH2(GLX_DEPTH_SIZE, 24);
2422 case WINED3DFMT_D24X4S4:
2423 PUSH2(GLX_DEPTH_SIZE, 24);
2424 PUSH2(GLX_STENCIL_SIZE, 4);
2427 case WINED3DFMT_D24S8:
2428 PUSH2(GLX_DEPTH_SIZE, 24);
2429 PUSH2(GLX_STENCIL_SIZE, 8);
2432 case WINED3DFMT_D24FS8:
2433 PUSH2(GLX_DEPTH_SIZE, 24);
2434 PUSH2(GLX_STENCIL_SIZE, 8);
2437 case WINED3DFMT_D32:
2438 PUSH2(GLX_DEPTH_SIZE, 32);
2442 FIXME("Unsupported stencil format: %s\n", debug_d3dformat(StencilBufferFormat));
2446 } else { /* it the device doesn't support the 'exact' format, try to find something close */
2447 switch (StencilBufferFormat) {
2451 case WINED3DFMT_D16_LOCKABLE:
2452 case WINED3DFMT_D16:
2453 PUSH2(GLX_DEPTH_SIZE, 1);
2456 case WINED3DFMT_D15S1:
2457 PUSH2(GLX_DEPTH_SIZE, 1);
2458 PUSH2(GLX_STENCIL_SIZE, 1);
2459 /*Does openGl support a 1bit stencil?, I've seen it used elsewhere
2460 e.g. http://www.ks.uiuc.edu/Research/vmd/doxygen/OpenGLDisplayDevice_8C-source.html*/
2463 case WINED3DFMT_D24X8:
2464 PUSH2(GLX_DEPTH_SIZE, 1);
2467 case WINED3DFMT_D24X4S4:
2468 PUSH2(GLX_DEPTH_SIZE, 1);
2469 PUSH2(GLX_STENCIL_SIZE, 1);
2472 case WINED3DFMT_D24S8:
2473 PUSH2(GLX_DEPTH_SIZE, 1);
2474 PUSH2(GLX_STENCIL_SIZE, 1);
2477 case WINED3DFMT_D24FS8:
2478 PUSH2(GLX_DEPTH_SIZE, 1);
2479 PUSH2(GLX_STENCIL_SIZE, 1);
2482 case WINED3DFMT_D32:
2483 PUSH2(GLX_DEPTH_SIZE, 1);
2487 FIXME("Unsupported stencil format: %s\n", debug_d3dformat(StencilBufferFormat));
2495 #undef GLINFO_LOCATION
2497 /* DirectDraw stuff */
2498 WINED3DFORMAT pixelformat_for_depth(DWORD depth) {
2500 case 8: return WINED3DFMT_P8; break;
2501 case 15: return WINED3DFMT_X1R5G5B5; break;
2502 case 16: return WINED3DFMT_R5G6B5; break;
2503 case 24: return WINED3DFMT_R8G8B8; break;
2504 case 32: return WINED3DFMT_X8R8G8B8; break;
2505 default: return WINED3DFMT_UNKNOWN;
2509 void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED3DMATRIX *src2) {
2512 /* Now do the multiplication 'by hand'.
2513 I know that all this could be optimised, but this will be done later :-) */
2514 temp.u.s._11 = (src1->u.s._11 * src2->u.s._11) + (src1->u.s._21 * src2->u.s._12) + (src1->u.s._31 * src2->u.s._13) + (src1->u.s._41 * src2->u.s._14);
2515 temp.u.s._21 = (src1->u.s._11 * src2->u.s._21) + (src1->u.s._21 * src2->u.s._22) + (src1->u.s._31 * src2->u.s._23) + (src1->u.s._41 * src2->u.s._24);
2516 temp.u.s._31 = (src1->u.s._11 * src2->u.s._31) + (src1->u.s._21 * src2->u.s._32) + (src1->u.s._31 * src2->u.s._33) + (src1->u.s._41 * src2->u.s._34);
2517 temp.u.s._41 = (src1->u.s._11 * src2->u.s._41) + (src1->u.s._21 * src2->u.s._42) + (src1->u.s._31 * src2->u.s._43) + (src1->u.s._41 * src2->u.s._44);
2519 temp.u.s._12 = (src1->u.s._12 * src2->u.s._11) + (src1->u.s._22 * src2->u.s._12) + (src1->u.s._32 * src2->u.s._13) + (src1->u.s._42 * src2->u.s._14);
2520 temp.u.s._22 = (src1->u.s._12 * src2->u.s._21) + (src1->u.s._22 * src2->u.s._22) + (src1->u.s._32 * src2->u.s._23) + (src1->u.s._42 * src2->u.s._24);
2521 temp.u.s._32 = (src1->u.s._12 * src2->u.s._31) + (src1->u.s._22 * src2->u.s._32) + (src1->u.s._32 * src2->u.s._33) + (src1->u.s._42 * src2->u.s._34);
2522 temp.u.s._42 = (src1->u.s._12 * src2->u.s._41) + (src1->u.s._22 * src2->u.s._42) + (src1->u.s._32 * src2->u.s._43) + (src1->u.s._42 * src2->u.s._44);
2524 temp.u.s._13 = (src1->u.s._13 * src2->u.s._11) + (src1->u.s._23 * src2->u.s._12) + (src1->u.s._33 * src2->u.s._13) + (src1->u.s._43 * src2->u.s._14);
2525 temp.u.s._23 = (src1->u.s._13 * src2->u.s._21) + (src1->u.s._23 * src2->u.s._22) + (src1->u.s._33 * src2->u.s._23) + (src1->u.s._43 * src2->u.s._24);
2526 temp.u.s._33 = (src1->u.s._13 * src2->u.s._31) + (src1->u.s._23 * src2->u.s._32) + (src1->u.s._33 * src2->u.s._33) + (src1->u.s._43 * src2->u.s._34);
2527 temp.u.s._43 = (src1->u.s._13 * src2->u.s._41) + (src1->u.s._23 * src2->u.s._42) + (src1->u.s._33 * src2->u.s._43) + (src1->u.s._43 * src2->u.s._44);
2529 temp.u.s._14 = (src1->u.s._14 * src2->u.s._11) + (src1->u.s._24 * src2->u.s._12) + (src1->u.s._34 * src2->u.s._13) + (src1->u.s._44 * src2->u.s._14);
2530 temp.u.s._24 = (src1->u.s._14 * src2->u.s._21) + (src1->u.s._24 * src2->u.s._22) + (src1->u.s._34 * src2->u.s._23) + (src1->u.s._44 * src2->u.s._24);
2531 temp.u.s._34 = (src1->u.s._14 * src2->u.s._31) + (src1->u.s._24 * src2->u.s._32) + (src1->u.s._34 * src2->u.s._33) + (src1->u.s._44 * src2->u.s._34);
2532 temp.u.s._44 = (src1->u.s._14 * src2->u.s._41) + (src1->u.s._24 * src2->u.s._42) + (src1->u.s._34 * src2->u.s._43) + (src1->u.s._44 * src2->u.s._44);
2534 /* And copy the new matrix in the good storage.. */
2535 memcpy(dest, &temp, 16 * sizeof(float));
2538 DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
2541 int numTextures = (d3dvtVertexType & WINED3DFVF_TEXCOUNT_MASK) >> WINED3DFVF_TEXCOUNT_SHIFT;
2543 if (d3dvtVertexType & WINED3DFVF_NORMAL) size += 3 * sizeof(float);
2544 if (d3dvtVertexType & WINED3DFVF_DIFFUSE) size += sizeof(DWORD);
2545 if (d3dvtVertexType & WINED3DFVF_SPECULAR) size += sizeof(DWORD);
2546 if (d3dvtVertexType & WINED3DFVF_PSIZE) size += sizeof(DWORD);
2547 switch (d3dvtVertexType & WINED3DFVF_POSITION_MASK) {
2548 case WINED3DFVF_XYZ: size += 3 * sizeof(float); break;
2549 case WINED3DFVF_XYZRHW: size += 4 * sizeof(float); break;
2550 case WINED3DFVF_XYZB1: size += 4 * sizeof(float); break;
2551 case WINED3DFVF_XYZB2: size += 5 * sizeof(float); break;
2552 case WINED3DFVF_XYZB3: size += 6 * sizeof(float); break;
2553 case WINED3DFVF_XYZB4: size += 7 * sizeof(float); break;
2554 case WINED3DFVF_XYZB5: size += 8 * sizeof(float); break;
2555 default: ERR("Unexpected position mask\n");
2557 for (i = 0; i < numTextures; i++) {
2558 size += GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, i) * sizeof(float);
2564 /***********************************************************************
2567 * Calculates the dimensions of the opengl texture used for blits.
2568 * Handled oversized opengl textures and updates the source rectangle
2572 * This: Surface to operate on
2573 * Rect: Requested rectangle
2576 * TRUE if the texture part can be loaded,
2579 *********************************************************************/
2580 #define GLINFO_LOCATION ((IWineD3DImpl *)(This->resource.wineD3DDevice->wineD3D))->gl_info
2582 BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]) {
2583 int x1 = Rect->left, x2 = Rect->right;
2584 int y1 = Rect->top, y2 = Rect->bottom;
2585 GLint maxSize = GL_LIMITS(texture_size);
2587 TRACE("(%p)->(%d,%d)-(%d,%d)\n", This,
2588 Rect->left, Rect->top, Rect->right, Rect->bottom);
2590 /* The sizes might be reversed */
2591 if(Rect->left > Rect->right) {
2595 if(Rect->top > Rect->bottom) {
2600 /* No oversized texture? This is easy */
2601 if(!(This->Flags & SFLAG_OVERSIZE)) {
2602 /* Which rect from the texture do I need? */
2603 glTexCoord[0] = (float) Rect->left / (float) This->pow2Width;
2604 glTexCoord[2] = (float) Rect->top / (float) This->pow2Height;
2605 glTexCoord[1] = (float) Rect->right / (float) This->pow2Width;
2606 glTexCoord[3] = (float) Rect->bottom / (float) This->pow2Height;
2610 /* Check if we can succeed at all */
2611 if( (x2 - x1) > maxSize ||
2612 (y2 - y1) > maxSize ) {
2613 TRACE("Requested rectangle is too large for gl\n");
2617 /* A part of the texture has to be picked. First, check if
2618 * some texture part is loaded already, if yes try to re-use it.
2619 * If the texture is dirty, or the part can't be used,
2620 * re-position the part to load
2622 if(This->Flags & SFLAG_INTEXTURE) {
2623 if(This->glRect.left <= x1 && This->glRect.right >= x2 &&
2624 This->glRect.top <= y1 && This->glRect.bottom >= x2 ) {
2625 /* Ok, the rectangle is ok, re-use it */
2626 TRACE("Using existing gl Texture\n");
2628 /* Rectangle is not ok, dirtify the texture to reload it */
2629 TRACE("Dirtifying texture to force reload\n");
2630 This->Flags &= ~SFLAG_INTEXTURE;
2634 /* Now if we are dirty(no else if!) */
2635 if(!(This->Flags & SFLAG_INTEXTURE)) {
2636 /* Set the new rectangle. Use the following strategy:
2637 * 1) Use as big textures as possible.
2638 * 2) Place the texture part in the way that the requested
2639 * part is in the middle of the texture(well, almost)
2640 * 3) If the texture is moved over the edges of the
2641 * surface, replace it nicely
2642 * 4) If the coord is not limiting the texture size,
2643 * use the whole size
2645 if((This->pow2Width) > maxSize) {
2646 This->glRect.left = x1 - maxSize / 2;
2647 if(This->glRect.left < 0) {
2648 This->glRect.left = 0;
2650 This->glRect.right = This->glRect.left + maxSize;
2651 if(This->glRect.right > This->currentDesc.Width) {
2652 This->glRect.right = This->currentDesc.Width;
2653 This->glRect.left = This->glRect.right - maxSize;
2656 This->glRect.left = 0;
2657 This->glRect.right = This->pow2Width;
2660 if(This->pow2Height > maxSize) {
2661 This->glRect.top = x1 - GL_LIMITS(texture_size) / 2;
2662 if(This->glRect.top < 0) This->glRect.top = 0;
2663 This->glRect.bottom = This->glRect.left + maxSize;
2664 if(This->glRect.bottom > This->currentDesc.Height) {
2665 This->glRect.bottom = This->currentDesc.Height;
2666 This->glRect.top = This->glRect.bottom - maxSize;
2669 This->glRect.top = 0;
2670 This->glRect.bottom = This->pow2Height;
2672 TRACE("(%p): Using rect (%d,%d)-(%d,%d)\n", This,
2673 This->glRect.left, This->glRect.top, This->glRect.right, This->glRect.bottom);
2676 /* Re-calculate the rect to draw */
2677 Rect->left -= This->glRect.left;
2678 Rect->right -= This->glRect.left;
2679 Rect->top -= This->glRect.top;
2680 Rect->bottom -= This->glRect.top;
2682 /* Get the gl coordinates. The gl rectangle is a power of 2, eigher the max size,
2683 * or the pow2Width / pow2Height of the surface
2685 glTexCoord[0] = (float) Rect->left / (float) (This->glRect.right - This->glRect.left);
2686 glTexCoord[2] = (float) Rect->top / (float) (This->glRect.bottom - This->glRect.top);
2687 glTexCoord[1] = (float) Rect->right / (float) (This->glRect.right - This->glRect.left);
2688 glTexCoord[3] = (float) Rect->bottom / (float) (This->glRect.bottom - This->glRect.top);
2692 #undef GLINFO_LOCATION
2694 /* Hash table functions */
2696 hash_table_t *hash_table_create(hash_function_t *hash_function, compare_function_t *compare_function)
2698 hash_table_t *table;
2699 unsigned int initial_size = 8;
2701 table = HeapAlloc(GetProcessHeap(), 0, sizeof(hash_table_t) + (initial_size * sizeof(struct list)));
2704 ERR("Failed to allocate table, returning NULL.\n");
2708 table->hash_function = hash_function;
2709 table->compare_function = compare_function;
2711 table->grow_size = initial_size - (initial_size >> 2);
2712 table->shrink_size = 0;
2714 table->buckets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, initial_size * sizeof(struct list));
2715 if (!table->buckets)
2717 ERR("Failed to allocate table buckets, returning NULL.\n");
2718 HeapFree(GetProcessHeap(), 0, table);
2721 table->bucket_count = initial_size;
2723 table->entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, table->grow_size * sizeof(hash_table_entry_t));
2724 if (!table->entries)
2726 ERR("Failed to allocate table entries, returning NULL.\n");
2727 HeapFree(GetProcessHeap(), 0, table->buckets);
2728 HeapFree(GetProcessHeap(), 0, table);
2731 table->entry_count = 0;
2733 list_init(&table->free_entries);
2739 void hash_table_destroy(hash_table_t *table)
2743 for (i = 0; i < table->entry_count; ++i)
2745 HeapFree(GetProcessHeap(), 0, table->entries[i].key);
2748 HeapFree(GetProcessHeap(), 0, table->entries);
2749 HeapFree(GetProcessHeap(), 0, table->buckets);
2750 HeapFree(GetProcessHeap(), 0, table);
2753 static inline hash_table_entry_t *hash_table_get_by_idx(hash_table_t *table, void *key, unsigned int idx)
2755 hash_table_entry_t *entry;
2757 if (table->buckets[idx].next)
2758 LIST_FOR_EACH_ENTRY(entry, &(table->buckets[idx]), hash_table_entry_t, entry)
2759 if (table->compare_function(entry->key, key)) return entry;
2764 static BOOL hash_table_resize(hash_table_t *table, unsigned int new_bucket_count)
2766 unsigned int new_entry_count = 0;
2767 hash_table_entry_t *new_entries;
2768 struct list *new_buckets;
2769 unsigned int grow_size = new_bucket_count - (new_bucket_count >> 2);
2772 new_buckets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, new_bucket_count * sizeof(struct list));
2775 ERR("Failed to allocate new buckets, returning FALSE.\n");
2779 new_entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, grow_size * sizeof(hash_table_entry_t));
2782 ERR("Failed to allocate new entries, returning FALSE.\n");
2783 HeapFree(GetProcessHeap(), 0, new_buckets);
2787 for (i = 0; i < table->bucket_count; ++i)
2789 if (table->buckets[i].next)
2791 hash_table_entry_t *entry, *entry2;
2793 LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &table->buckets[i], hash_table_entry_t, entry)
2796 hash_table_entry_t *new_entry = new_entries + (new_entry_count++);
2797 *new_entry = *entry;
2799 j = new_entry->hash & (new_bucket_count - 1);
2801 if (!new_buckets[j].next) list_init(&new_buckets[j]);
2802 list_add_head(&new_buckets[j], &new_entry->entry);
2807 HeapFree(GetProcessHeap(), 0, table->buckets);
2808 table->buckets = new_buckets;
2810 HeapFree(GetProcessHeap(), 0, table->entries);
2811 table->entries = new_entries;
2813 table->entry_count = new_entry_count;
2814 list_init(&table->free_entries);
2816 table->bucket_count = new_bucket_count;
2817 table->grow_size = grow_size;
2818 table->shrink_size = new_bucket_count > 8 ? new_bucket_count >> 2 : 0;
2823 void hash_table_put(hash_table_t *table, void *key, void *value)
2827 hash_table_entry_t *entry;
2829 hash = table->hash_function(key);
2830 idx = hash & (table->bucket_count - 1);
2831 entry = hash_table_get_by_idx(table, key, idx);
2835 HeapFree(GetProcessHeap(), 0, key);
2836 entry->value = value;
2840 HeapFree(GetProcessHeap(), 0, entry->key);
2843 /* Remove the entry */
2844 list_remove(&entry->entry);
2845 list_add_head(&table->free_entries, &entry->entry);
2849 /* Shrink if necessary */
2850 if (table->count < table->shrink_size) {
2851 if (!hash_table_resize(table, table->bucket_count >> 1))
2853 ERR("Failed to shrink the table...\n");
2863 /* Grow if necessary */
2864 if (table->count >= table->grow_size)
2866 if (!hash_table_resize(table, table->bucket_count << 1))
2868 ERR("Failed to grow the table, returning.\n");
2872 idx = hash & (table->bucket_count - 1);
2875 /* Find an entry to insert */
2876 if (!list_empty(&table->free_entries))
2878 struct list *elem = list_head(&table->free_entries);
2881 entry = LIST_ENTRY(elem, hash_table_entry_t, entry);
2883 entry = table->entries + (table->entry_count++);
2886 /* Insert the entry */
2888 entry->value = value;
2890 if (!table->buckets[idx].next) list_init(&table->buckets[idx]);
2891 list_add_head(&table->buckets[idx], &entry->entry);
2896 void hash_table_remove(hash_table_t *table, void *key)
2898 hash_table_put(table, key, NULL);
2901 void *hash_table_get(hash_table_t *table, void *key)
2904 hash_table_entry_t *entry;
2906 idx = table->hash_function(key) & (table->bucket_count - 1);
2907 entry = hash_table_get_by_idx(table, key, idx);
2909 return entry ? entry->value : NULL;