wined3d: Fix np2 textures.
[wine/wine-gecko.git] / dlls / wined3d / state.c
blobaf899e5296e68b4e093a5542ac1a4bec344a0e17
1 /*
2 * Direct3D state management
4 * Copyright 2006 Stefan Dösinger for CodeWeavers
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "config.h"
22 #include <stdio.h>
23 #ifdef HAVE_FLOAT_H
24 # include <float.h>
25 #endif
26 #include "wined3d_private.h"
28 WINE_DEFAULT_DEBUG_CHANNEL(d3d);
29 WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
31 #define GLINFO_LOCATION ((IWineD3DImpl *)(stateblock->wineD3DDevice->wineD3D))->gl_info
33 static void state_nogl(DWORD state, IWineD3DStateBlockImpl *stateblock) {
34 /* Used for states which are not mapped to a gl state as-is, but used somehow different,
35 * e.g as a parameter for drawing, or which are unimplemented in windows d3d
37 if(STATE_IS_RENDER(state)) {
38 WINED3DRENDERSTATETYPE RenderState = state - STATE_RENDER(0);
39 TRACE("(%s,%d) no direct mapping to gl\n", debug_d3drenderstate(RenderState), stateblock->renderState[RenderState]);
40 } else {
41 /* Shouldn't have an unknown type here */
42 FIXME("%d no direct mapping to gl of state with unknown type\n", state);
46 static void state_undefined(DWORD state, IWineD3DStateBlockImpl *stateblock) {
47 /* Print a WARN, this allows the stateblock code to loop over all states to generate a display
48 * list without causing confusing terminal output. Deliberately no special debug name here
49 * because its undefined.
51 WARN("undefined state %d\n", state);
54 static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock) {
55 D3DFILLMODE Value = stateblock->renderState[WINED3DRS_FILLMODE];
57 switch(Value) {
58 case D3DFILL_POINT:
59 glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
60 checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_POINT)");
61 break;
62 case D3DFILL_WIREFRAME:
63 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
64 checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)");
65 break;
66 case D3DFILL_SOLID:
67 glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
68 checkGLcall("glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)");
69 break;
70 default:
71 FIXME("Unrecognized WINED3DRS_FILLMODE value %d\n", Value);
75 static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock) {
76 BOOL normals;
78 /* Lighting is only enabled if Vertex normals are passed by the application,
79 * but lighting does not affect the stream sources, so it is not grouped for performance reasons.
80 * This state reads the decoded vertex decl, so if it is dirty don't do anything. The
81 * vertex declaration appplying function calls this function for updating
84 if(isStateDirty(stateblock->wineD3DDevice, STATE_VDECL)) {
85 return;
88 normals = stateblock->wineD3DDevice->strided_streams.u.s.normal.lpData != NULL ||
89 stateblock->wineD3DDevice->strided_streams.u.s.normal.VBO != 0;
91 if (stateblock->renderState[WINED3DRS_LIGHTING] && normals) {
92 glEnable(GL_LIGHTING);
93 checkGLcall("glEnable GL_LIGHTING");
94 } else {
95 glDisable(GL_LIGHTING);
96 checkGLcall("glDisable GL_LIGHTING");
100 static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
101 switch ((WINED3DZBUFFERTYPE) stateblock->renderState[WINED3DRS_ZENABLE]) {
102 case WINED3DZB_FALSE:
103 glDisable(GL_DEPTH_TEST);
104 checkGLcall("glDisable GL_DEPTH_TEST");
105 break;
106 case WINED3DZB_TRUE:
107 glEnable(GL_DEPTH_TEST);
108 checkGLcall("glEnable GL_DEPTH_TEST");
109 break;
110 case WINED3DZB_USEW:
111 glEnable(GL_DEPTH_TEST);
112 checkGLcall("glEnable GL_DEPTH_TEST");
113 FIXME("W buffer is not well handled\n");
114 break;
115 default:
116 FIXME("Unrecognized D3DZBUFFERTYPE value %d\n", stateblock->renderState[WINED3DRS_ZENABLE]);
120 static void state_cullmode(DWORD state, IWineD3DStateBlockImpl *stateblock) {
121 /* TODO: Put this into the offscreen / onscreen rendering block due to device->render_offscreen */
123 /* If we are culling "back faces with clockwise vertices" then
124 set front faces to be counter clockwise and enable culling
125 of back faces */
126 switch ((WINED3DCULL) stateblock->renderState[WINED3DRS_CULLMODE]) {
127 case WINED3DCULL_NONE:
128 glDisable(GL_CULL_FACE);
129 checkGLcall("glDisable GL_CULL_FACE");
130 break;
131 case WINED3DCULL_CW:
132 glEnable(GL_CULL_FACE);
133 checkGLcall("glEnable GL_CULL_FACE");
134 if (stateblock->wineD3DDevice->render_offscreen) {
135 glFrontFace(GL_CW);
136 checkGLcall("glFrontFace GL_CW");
137 } else {
138 glFrontFace(GL_CCW);
139 checkGLcall("glFrontFace GL_CCW");
141 glCullFace(GL_BACK);
142 break;
143 case WINED3DCULL_CCW:
144 glEnable(GL_CULL_FACE);
145 checkGLcall("glEnable GL_CULL_FACE");
146 if (stateblock->wineD3DDevice->render_offscreen) {
147 glFrontFace(GL_CCW);
148 checkGLcall("glFrontFace GL_CCW");
149 } else {
150 glFrontFace(GL_CW);
151 checkGLcall("glFrontFace GL_CW");
153 glCullFace(GL_BACK);
154 break;
155 default:
156 FIXME("Unrecognized/Unhandled WINED3DCULL value %d\n", stateblock->renderState[WINED3DRS_CULLMODE]);
160 static void state_shademode(DWORD state, IWineD3DStateBlockImpl *stateblock) {
161 switch ((WINED3DSHADEMODE) stateblock->renderState[WINED3DRS_SHADEMODE]) {
162 case WINED3DSHADE_FLAT:
163 glShadeModel(GL_FLAT);
164 checkGLcall("glShadeModel(GL_FLAT)");
165 break;
166 case WINED3DSHADE_GOURAUD:
167 glShadeModel(GL_SMOOTH);
168 checkGLcall("glShadeModel(GL_SMOOTH)");
169 break;
170 case WINED3DSHADE_PHONG:
171 FIXME("WINED3DSHADE_PHONG isn't supported\n");
172 break;
173 default:
174 FIXME("Unrecognized/Unhandled WINED3DSHADEMODE value %d\n", stateblock->renderState[WINED3DRS_SHADEMODE]);
178 static void state_ditherenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
179 if (stateblock->renderState[WINED3DRS_DITHERENABLE]) {
180 glEnable(GL_DITHER);
181 checkGLcall("glEnable GL_DITHER");
182 } else {
183 glDisable(GL_DITHER);
184 checkGLcall("glDisable GL_DITHER");
188 static void state_zwritenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
189 /* TODO: Test if in d3d z writing is enabled even if ZENABLE is off. If yes,
190 * this has to be merged with ZENABLE and ZFUNC
192 if (stateblock->renderState[WINED3DRS_ZWRITEENABLE]) {
193 glDepthMask(1);
194 checkGLcall("glDepthMask(1)");
195 } else {
196 glDepthMask(0);
197 checkGLcall("glDepthMask(0)");
201 static void state_zfunc(DWORD state, IWineD3DStateBlockImpl *stateblock) {
202 int glParm = CompareFunc(stateblock->renderState[WINED3DRS_ZFUNC]);
204 if(glParm) {
205 glDepthFunc(glParm);
206 checkGLcall("glDepthFunc");
210 static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock) {
211 float col[4];
212 D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_AMBIENT], col);
214 TRACE("Setting ambient to (%f,%f,%f,%f)\n", col[0], col[1], col[2], col[3]);
215 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, col);
216 checkGLcall("glLightModel for MODEL_AMBIENT");
219 static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock) {
220 int srcBlend = GL_ZERO;
221 int dstBlend = GL_ZERO;
223 /* GL_LINE_SMOOTH needs GL_BLEND to work, according to the red book, and special blending params */
224 if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE] ||
225 stateblock->renderState[WINED3DRS_EDGEANTIALIAS] ||
226 stateblock->renderState[WINED3DRS_ANTIALIASEDLINEENABLE]) {
227 glEnable(GL_BLEND);
228 checkGLcall("glEnable GL_BLEND");
229 } else {
230 glDisable(GL_BLEND);
231 checkGLcall("glDisable GL_BLEND");
232 /* Nothing more to do - get out */
233 return;
236 switch (stateblock->renderState[WINED3DRS_SRCBLEND]) {
237 case WINED3DBLEND_ZERO : srcBlend = GL_ZERO; break;
238 case WINED3DBLEND_ONE : srcBlend = GL_ONE; break;
239 case WINED3DBLEND_SRCCOLOR : srcBlend = GL_SRC_COLOR; break;
240 case WINED3DBLEND_INVSRCCOLOR : srcBlend = GL_ONE_MINUS_SRC_COLOR; break;
241 case WINED3DBLEND_SRCALPHA : srcBlend = GL_SRC_ALPHA; break;
242 case WINED3DBLEND_INVSRCALPHA : srcBlend = GL_ONE_MINUS_SRC_ALPHA; break;
243 case WINED3DBLEND_DESTALPHA : srcBlend = GL_DST_ALPHA; break;
244 case WINED3DBLEND_INVDESTALPHA : srcBlend = GL_ONE_MINUS_DST_ALPHA; break;
245 case WINED3DBLEND_DESTCOLOR : srcBlend = GL_DST_COLOR; break;
246 case WINED3DBLEND_INVDESTCOLOR : srcBlend = GL_ONE_MINUS_DST_COLOR; break;
247 case WINED3DBLEND_SRCALPHASAT : srcBlend = GL_SRC_ALPHA_SATURATE; break;
249 case WINED3DBLEND_BOTHSRCALPHA : srcBlend = GL_SRC_ALPHA;
250 dstBlend = GL_SRC_ALPHA;
251 break;
253 case WINED3DBLEND_BOTHINVSRCALPHA : srcBlend = GL_ONE_MINUS_SRC_ALPHA;
254 dstBlend = GL_ONE_MINUS_SRC_ALPHA;
255 break;
257 case WINED3DBLEND_BLENDFACTOR : srcBlend = GL_CONSTANT_COLOR; break;
258 case WINED3DBLEND_INVBLENDFACTOR : srcBlend = GL_ONE_MINUS_CONSTANT_COLOR; break;
259 default:
260 FIXME("Unrecognized src blend value %d\n", stateblock->renderState[WINED3DRS_SRCBLEND]);
263 switch (stateblock->renderState[WINED3DRS_DESTBLEND]) {
264 case WINED3DBLEND_ZERO : dstBlend = GL_ZERO; break;
265 case WINED3DBLEND_ONE : dstBlend = GL_ONE; break;
266 case WINED3DBLEND_SRCCOLOR : dstBlend = GL_SRC_COLOR; break;
267 case WINED3DBLEND_INVSRCCOLOR : dstBlend = GL_ONE_MINUS_SRC_COLOR; break;
268 case WINED3DBLEND_SRCALPHA : dstBlend = GL_SRC_ALPHA; break;
269 case WINED3DBLEND_INVSRCALPHA : dstBlend = GL_ONE_MINUS_SRC_ALPHA; break;
270 case WINED3DBLEND_DESTALPHA : dstBlend = GL_DST_ALPHA; break;
271 case WINED3DBLEND_INVDESTALPHA : dstBlend = GL_ONE_MINUS_DST_ALPHA; break;
272 case WINED3DBLEND_DESTCOLOR : dstBlend = GL_DST_COLOR; break;
273 case WINED3DBLEND_INVDESTCOLOR : dstBlend = GL_ONE_MINUS_DST_COLOR; break;
274 case WINED3DBLEND_SRCALPHASAT : dstBlend = GL_SRC_ALPHA_SATURATE; break;
276 case WINED3DBLEND_BOTHSRCALPHA : dstBlend = GL_SRC_ALPHA;
277 srcBlend = GL_SRC_ALPHA;
278 break;
280 case WINED3DBLEND_BOTHINVSRCALPHA : dstBlend = GL_ONE_MINUS_SRC_ALPHA;
281 srcBlend = GL_ONE_MINUS_SRC_ALPHA;
282 break;
284 case D3DBLEND_BLENDFACTOR : dstBlend = GL_CONSTANT_COLOR; break;
285 case D3DBLEND_INVBLENDFACTOR : dstBlend = GL_ONE_MINUS_CONSTANT_COLOR; break;
286 default:
287 FIXME("Unrecognized dst blend value %d\n", stateblock->renderState[WINED3DRS_DESTBLEND]);
290 if(stateblock->renderState[WINED3DRS_EDGEANTIALIAS] ||
291 stateblock->renderState[WINED3DRS_ANTIALIASEDLINEENABLE]) {
292 glEnable(GL_LINE_SMOOTH);
293 checkGLcall("glEnable(GL_LINE_SMOOTH)");
294 if(srcBlend != GL_SRC_ALPHA) {
295 FIXME("WINED3DRS_EDGEANTIALIAS enabled, but incompatible src blending param - what to do?\n");
296 srcBlend = GL_SRC_ALPHA;
298 if(dstBlend != GL_ONE_MINUS_SRC_ALPHA) {
299 FIXME("WINED3DRS_EDGEANTIALIAS enabled, but incompatible dst blending param - what to do?\n");
300 dstBlend = GL_ONE_MINUS_SRC_ALPHA;
302 } else {
303 glDisable(GL_LINE_SMOOTH);
304 checkGLcall("glDisable(GL_LINE_SMOOTH)");
307 TRACE("glBlendFunc src=%x, dst=%x\n", srcBlend, dstBlend);
308 glBlendFunc(srcBlend, dstBlend);
309 checkGLcall("glBlendFunc");
312 static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock) {
313 float col[4];
315 TRACE("Setting BlendFactor to %d\n", stateblock->renderState[WINED3DRS_BLENDFACTOR]);
316 D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_BLENDFACTOR], col);
317 glBlendColor (col[0],col[1],col[2],col[3]);
318 checkGLcall("glBlendColor");
321 static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock) {
322 int glParm = 0;
323 float ref;
324 BOOL enable_ckey = FALSE;
326 IWineD3DSurfaceImpl *surf;
328 /* Find out if the texture on the first stage has a ckey set
329 * The alpha state func reads the texture settings, even though alpha and texture are not grouped
330 * together. This is to avoid making a huge alpha+texture+texture stage+ckey block due to the hardly
331 * used WINED3DRS_COLORKEYENABLE state(which is d3d <= 3 only). The texture function will call alpha
332 * in case it finds some texture+colorkeyenable combination which needs extra care.
334 if(stateblock->textures[0]) {
335 surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *)stateblock->textures[0])->surfaces[0];
336 if(surf->CKeyFlags & DDSD_CKSRCBLT) enable_ckey = TRUE;
339 if (stateblock->renderState[WINED3DRS_ALPHATESTENABLE] ||
340 (stateblock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey)) {
341 glEnable(GL_ALPHA_TEST);
342 checkGLcall("glEnable GL_ALPHA_TEST");
343 } else {
344 glDisable(GL_ALPHA_TEST);
345 checkGLcall("glDisable GL_ALPHA_TEST");
346 /* Alpha test is disabled, don't bother setting the params - it will happen on the next
347 * enable call
349 return;
352 if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && enable_ckey) {
353 glParm = GL_NOTEQUAL;
354 ref = 0.0;
355 } else {
356 ref = ((float) stateblock->renderState[WINED3DRS_ALPHAREF]) / 255.0f;
357 glParm = CompareFunc(stateblock->renderState[WINED3DRS_ALPHAFUNC]);
359 if(glParm) {
360 glAlphaFunc(glParm, ref);
361 checkGLcall("glAlphaFunc");
363 /* TODO: Some texture blending operations seem to affect the alpha test */
366 static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock) {
367 DWORD enable = 0xFFFFFFFF;
368 DWORD disable = 0x00000000;
370 /* TODO: Keep track of previously enabled clipplanes to avoid unneccessary resetting
371 * of already set values
374 /* If enabling / disabling all
375 * TODO: Is this correct? Doesn't D3DRS_CLIPPING disable clipping on the viewport frustrum?
377 if (stateblock->renderState[WINED3DRS_CLIPPING]) {
378 enable = stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
379 disable = ~stateblock->renderState[WINED3DRS_CLIPPLANEENABLE];
380 } else {
381 disable = 0xffffffff;
382 enable = 0x00;
385 if (enable & WINED3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); }
386 if (enable & WINED3DCLIPPLANE1) { glEnable(GL_CLIP_PLANE1); checkGLcall("glEnable(clip plane 1)"); }
387 if (enable & WINED3DCLIPPLANE2) { glEnable(GL_CLIP_PLANE2); checkGLcall("glEnable(clip plane 2)"); }
388 if (enable & WINED3DCLIPPLANE3) { glEnable(GL_CLIP_PLANE3); checkGLcall("glEnable(clip plane 3)"); }
389 if (enable & WINED3DCLIPPLANE4) { glEnable(GL_CLIP_PLANE4); checkGLcall("glEnable(clip plane 4)"); }
390 if (enable & WINED3DCLIPPLANE5) { glEnable(GL_CLIP_PLANE5); checkGLcall("glEnable(clip plane 5)"); }
392 if (disable & WINED3DCLIPPLANE0) { glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); }
393 if (disable & WINED3DCLIPPLANE1) { glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); }
394 if (disable & WINED3DCLIPPLANE2) { glDisable(GL_CLIP_PLANE2); checkGLcall("glDisable(clip plane 2)"); }
395 if (disable & WINED3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); }
396 if (disable & WINED3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); }
397 if (disable & WINED3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); }
399 /** update clipping status */
400 if (enable) {
401 stateblock->clip_status.ClipUnion = 0;
402 stateblock->clip_status.ClipIntersection = 0xFFFFFFFF;
403 } else {
404 stateblock->clip_status.ClipUnion = 0;
405 stateblock->clip_status.ClipIntersection = 0;
409 static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock) {
410 int glParm = GL_FUNC_ADD;
412 if(!GL_SUPPORT(EXT_BLEND_MINMAX)) {
413 WARN("Unsupported in local OpenGL implementation: glBlendEquation\n");
414 return;
417 switch ((WINED3DBLENDOP) stateblock->renderState[WINED3DRS_BLENDOP]) {
418 case WINED3DBLENDOP_ADD : glParm = GL_FUNC_ADD; break;
419 case WINED3DBLENDOP_SUBTRACT : glParm = GL_FUNC_SUBTRACT; break;
420 case WINED3DBLENDOP_REVSUBTRACT : glParm = GL_FUNC_REVERSE_SUBTRACT; break;
421 case WINED3DBLENDOP_MIN : glParm = GL_MIN; break;
422 case WINED3DBLENDOP_MAX : glParm = GL_MAX; break;
423 default:
424 FIXME("Unrecognized/Unhandled D3DBLENDOP value %d\n", stateblock->renderState[WINED3DRS_BLENDOP]);
427 TRACE("glBlendEquation(%x)\n", glParm);
428 GL_EXTCALL(glBlendEquation(glParm));
429 checkGLcall("glBlendEquation");
432 static void
433 state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
434 /* Originally this used glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR)
435 * and (GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR) to swap between enabled/disabled
436 * specular color. This is wrong:
437 * Separate specular color means the specular colour is maintained separately, whereas
438 * single color means it is merged in. However in both cases they are being used to
439 * some extent.
440 * To disable specular color, set it explicitly to black and turn off GL_COLOR_SUM_EXT
441 * NOTE: If not supported don't give FIXMEs the impact is really minimal and very few people are
442 * running 1.4 yet!
445 * If register combiners are enabled, enabling / disabling GL_COLOR_SUM has no effect.
446 * Instead, we need to setup the FinalCombiner properly.
448 * The default setup for the FinalCombiner is:
450 * <variable> <input> <mapping> <usage>
451 * GL_VARIABLE_A_NV GL_FOG, GL_UNSIGNED_IDENTITY_NV GL_ALPHA
452 * GL_VARIABLE_B_NV GL_SPARE0_PLUS_SECONDARY_COLOR_NV GL_UNSIGNED_IDENTITY_NV GL_RGB
453 * GL_VARIABLE_C_NV GL_FOG GL_UNSIGNED_IDENTITY_NV GL_RGB
454 * GL_VARIABLE_D_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB
455 * GL_VARIABLE_E_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB
456 * GL_VARIABLE_F_NV GL_ZERO GL_UNSIGNED_IDENTITY_NV GL_RGB
457 * GL_VARIABLE_G_NV GL_SPARE0_NV GL_UNSIGNED_IDENTITY_NV GL_ALPHA
459 * That's pretty much fine as it is, except for variable B, which needs to take
460 * either GL_SPARE0_PLUS_SECONDARY_COLOR_NV or GL_SPARE0_NV, depending on
461 * whether WINED3DRS_SPECULARENABLE is enabled or not.
464 TRACE("Setting specular enable state\n");
465 /* TODO: Add to the material setting functions */
466 if (stateblock->renderState[WINED3DRS_SPECULARENABLE]) {
467 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &stateblock->material.Specular);
468 checkGLcall("glMaterialfv");
469 if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
470 glEnable(GL_COLOR_SUM_EXT);
471 } else {
472 TRACE("Specular colors cannot be enabled in this version of opengl\n");
474 checkGLcall("glEnable(GL_COLOR_SUM)");
476 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
477 GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_PLUS_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB));
478 checkGLcall("glFinalCombinerInputNV()");
480 } else {
481 float black[4] = {0.0f, 0.0f, 0.0f, 0.0f};
483 /* for the case of enabled lighting: */
484 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &black[0]);
485 checkGLcall("glMaterialfv");
487 /* for the case of disabled lighting: */
488 if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
489 glDisable(GL_COLOR_SUM_EXT);
490 } else {
491 TRACE("Specular colors cannot be disabled in this version of opengl\n");
493 checkGLcall("glDisable(GL_COLOR_SUM)");
495 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
496 GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB));
497 checkGLcall("glFinalCombinerInputNV()");
502 static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock) {
503 unsigned int i;
505 /* Note the texture color applies to all textures whereas
506 * GL_TEXTURE_ENV_COLOR applies to active only
508 float col[4];
509 D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
511 if (!GL_SUPPORT(NV_REGISTER_COMBINERS)) {
512 /* And now the default texture color as well */
513 for (i = 0; i < GL_LIMITS(texture_stages); i++) {
514 /* Note the WINED3DRS value applies to all textures, but GL has one
515 * per texture, so apply it now ready to be used!
517 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
518 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));
519 checkGLcall("glActiveTextureARB");
520 } else if (i>0) {
521 FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
524 glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
525 checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
527 } else {
528 GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));
532 static void
533 renderstate_stencil_twosided(IWineD3DStateBlockImpl *stateblock, GLint face, GLint func, GLint ref, GLuint mask, GLint stencilFail, GLint depthFail, GLint stencilPass ) {
534 #if 0 /* Don't use OpenGL 2.0 calls for now */
535 if(GL_EXTCALL(glStencilFuncSeparate) && GL_EXTCALL(glStencilOpSeparate)) {
536 GL_EXTCALL(glStencilFuncSeparate(face, func, ref, mask));
537 checkGLcall("glStencilFuncSeparate(...)");
538 GL_EXTCALL(glStencilOpSeparate(face, stencilFail, depthFail, stencilPass));
539 checkGLcall("glStencilOpSeparate(...)");
541 else
542 #endif
543 if(GL_SUPPORT(EXT_STENCIL_TWO_SIDE)) {
544 glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
545 checkGLcall("glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)");
546 GL_EXTCALL(glActiveStencilFaceEXT(face));
547 checkGLcall("glActiveStencilFaceEXT(...)");
548 glStencilFunc(func, ref, mask);
549 checkGLcall("glStencilFunc(...)");
550 glStencilOp(stencilFail, depthFail, stencilPass);
551 checkGLcall("glStencilOp(...)");
552 } else if(GL_SUPPORT(ATI_SEPARATE_STENCIL)) {
553 GL_EXTCALL(glStencilFuncSeparateATI(face, func, ref, mask));
554 checkGLcall("glStencilFuncSeparateATI(...)");
555 GL_EXTCALL(glStencilOpSeparateATI(face, stencilFail, depthFail, stencilPass));
556 checkGLcall("glStencilOpSeparateATI(...)");
557 } else {
558 ERR("Separate (two sided) stencil not supported on this version of opengl. Caps weren't honored?\n");
562 static void
563 state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock) {
564 DWORD onesided_enable = FALSE;
565 DWORD twosided_enable = FALSE;
566 GLint func = GL_ALWAYS;
567 GLint func_ccw = GL_ALWAYS;
568 GLint ref = 0;
569 GLuint mask = 0;
570 GLint stencilFail = GL_KEEP;
571 GLint depthFail = GL_KEEP;
572 GLint stencilPass = GL_KEEP;
573 GLint stencilFail_ccw = GL_KEEP;
574 GLint depthFail_ccw = GL_KEEP;
575 GLint stencilPass_ccw = GL_KEEP;
577 if( stateblock->set.renderState[WINED3DRS_STENCILENABLE] )
578 onesided_enable = stateblock->renderState[WINED3DRS_STENCILENABLE];
579 if( stateblock->set.renderState[WINED3DRS_TWOSIDEDSTENCILMODE] )
580 twosided_enable = stateblock->renderState[WINED3DRS_TWOSIDEDSTENCILMODE];
581 if( stateblock->set.renderState[WINED3DRS_STENCILFUNC] )
582 if( !( func = CompareFunc(stateblock->renderState[WINED3DRS_STENCILFUNC]) ) )
583 func = GL_ALWAYS;
584 if( stateblock->set.renderState[WINED3DRS_CCW_STENCILFUNC] )
585 if( !( func_ccw = CompareFunc(stateblock->renderState[WINED3DRS_CCW_STENCILFUNC]) ) )
586 func = GL_ALWAYS;
587 if( stateblock->set.renderState[WINED3DRS_STENCILREF] )
588 ref = stateblock->renderState[WINED3DRS_STENCILREF];
589 if( stateblock->set.renderState[WINED3DRS_STENCILMASK] )
590 mask = stateblock->renderState[WINED3DRS_STENCILMASK];
591 if( stateblock->set.renderState[WINED3DRS_STENCILFAIL] )
592 stencilFail = StencilOp(stateblock->renderState[WINED3DRS_STENCILFAIL]);
593 if( stateblock->set.renderState[WINED3DRS_STENCILZFAIL] )
594 depthFail = StencilOp(stateblock->renderState[WINED3DRS_STENCILZFAIL]);
595 if( stateblock->set.renderState[WINED3DRS_STENCILPASS] )
596 stencilPass = StencilOp(stateblock->renderState[WINED3DRS_STENCILPASS]);
597 if( stateblock->set.renderState[WINED3DRS_CCW_STENCILFAIL] )
598 stencilFail_ccw = StencilOp(stateblock->renderState[WINED3DRS_CCW_STENCILFAIL]);
599 if( stateblock->set.renderState[WINED3DRS_CCW_STENCILZFAIL] )
600 depthFail_ccw = StencilOp(stateblock->renderState[WINED3DRS_CCW_STENCILZFAIL]);
601 if( stateblock->set.renderState[WINED3DRS_CCW_STENCILPASS] )
602 stencilPass_ccw = StencilOp(stateblock->renderState[WINED3DRS_CCW_STENCILPASS]);
604 TRACE("(onesided %d, twosided %d, ref %x, mask %x, \
605 GL_FRONT: func: %x, fail %x, zfail %x, zpass %x \
606 GL_BACK: func: %x, fail %x, zfail %x, zpass %x )\n",
607 onesided_enable, twosided_enable, ref, mask,
608 func, stencilFail, depthFail, stencilPass,
609 func_ccw, stencilFail_ccw, depthFail_ccw, stencilPass_ccw);
611 if (twosided_enable) {
612 renderstate_stencil_twosided(stateblock, GL_FRONT, func, ref, mask, stencilFail, depthFail, stencilPass);
613 renderstate_stencil_twosided(stateblock, GL_BACK, func_ccw, ref, mask, stencilFail_ccw, depthFail_ccw, stencilPass_ccw);
614 } else {
615 if (onesided_enable) {
616 glEnable(GL_STENCIL_TEST);
617 checkGLcall("glEnable GL_STENCIL_TEST");
618 glStencilFunc(func, ref, mask);
619 checkGLcall("glStencilFunc(...)");
620 glStencilOp(stencilFail, depthFail, stencilPass);
621 checkGLcall("glStencilOp(...)");
622 } else {
623 glDisable(GL_STENCIL_TEST);
624 checkGLcall("glDisable GL_STENCIL_TEST");
629 static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock) {
630 glStencilMask(stateblock->renderState[WINED3DRS_STENCILWRITEMASK]);
631 checkGLcall("glStencilMask");
634 static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock) {
635 /* TODO: Put this into the vertex type block once that is in the state table */
636 BOOL fogenable = stateblock->renderState[WINED3DRS_FOGENABLE];
637 float fogstart, fogend;
639 union {
640 DWORD d;
641 float f;
642 } tmpvalue;
644 if (!fogenable) {
645 /* No fog? Disable it, and we're done :-) */
646 glDisable(GL_FOG);
647 checkGLcall("glDisable GL_FOG");
650 tmpvalue.d = stateblock->renderState[WINED3DRS_FOGSTART];
651 fogstart = tmpvalue.f;
652 tmpvalue.d = stateblock->renderState[WINED3DRS_FOGEND];
653 fogend = tmpvalue.f;
655 /* Activate when vertex shaders are in the state table */
656 if(stateblock->vertexShader && ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function &&
657 ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->usesFog) {
658 glFogi(GL_FOG_MODE, GL_LINEAR);
659 checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)");
660 fogstart = 1.0;
661 fogend = 0.0;
662 stateblock->wineD3DDevice->last_was_foggy_shader = TRUE;
664 /* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes,
665 * the system will apply only pixel(=table) fog effects."
667 else if(stateblock->renderState[WINED3DRS_FOGTABLEMODE] == D3DFOG_NONE) {
668 glHint(GL_FOG_HINT, GL_FASTEST);
669 checkGLcall("glHint(GL_FOG_HINT, GL_FASTEST)");
670 stateblock->wineD3DDevice->last_was_foggy_shader = FALSE;
672 switch (stateblock->renderState[WINED3DRS_FOGVERTEXMODE]) {
673 /* Processed vertices have their fog factor stored in the specular value. Fall too the none case.
674 * If we are drawing untransformed vertices atm, d3ddevice_set_ortho will update the fog
676 case D3DFOG_EXP: {
677 if(!stateblock->wineD3DDevice->last_was_rhw) {
678 glFogi(GL_FOG_MODE, GL_EXP);
679 checkGLcall("glFogi(GL_FOG_MODE, GL_EXP");
680 if(GL_SUPPORT(EXT_FOG_COORD)) {
681 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
682 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
684 break;
687 case D3DFOG_EXP2: {
688 if(!stateblock->wineD3DDevice->last_was_rhw) {
689 glFogi(GL_FOG_MODE, GL_EXP2);
690 checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2");
691 if(GL_SUPPORT(EXT_FOG_COORD)) {
692 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
693 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
695 break;
698 case D3DFOG_LINEAR: {
699 if(!stateblock->wineD3DDevice->last_was_rhw) {
700 glFogi(GL_FOG_MODE, GL_LINEAR);
701 checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR");
702 if(GL_SUPPORT(EXT_FOG_COORD)) {
703 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
704 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
706 break;
709 case D3DFOG_NONE: {
710 /* Both are none? According to msdn the alpha channel of the specular
711 * color contains a fog factor. Set it in drawStridedSlow.
712 * Same happens with Vertexfog on transformed vertices
714 if(GL_SUPPORT(EXT_FOG_COORD)) {
715 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
716 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)\n");
717 glFogi(GL_FOG_MODE, GL_LINEAR);
718 checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)");
719 fogstart = 0xff;
720 fogend = 0x0;
721 } else {
722 /* Disable GL fog, handle this in software in drawStridedSlow */
723 fogenable = FALSE;
725 break;
727 default: FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %d\n", stateblock->renderState[WINED3DRS_FOGVERTEXMODE]);
729 } else {
730 glHint(GL_FOG_HINT, GL_NICEST);
731 checkGLcall("glHint(GL_FOG_HINT, GL_NICEST)");
732 stateblock->wineD3DDevice->last_was_foggy_shader = FALSE;
734 switch (stateblock->renderState[WINED3DRS_FOGTABLEMODE]) {
735 case D3DFOG_EXP:
736 glFogi(GL_FOG_MODE, GL_EXP);
737 checkGLcall("glFogi(GL_FOG_MODE, GL_EXP");
738 if(GL_SUPPORT(EXT_FOG_COORD)) {
739 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
740 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
742 break;
744 case D3DFOG_EXP2:
745 glFogi(GL_FOG_MODE, GL_EXP2);
746 checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2");
747 if(GL_SUPPORT(EXT_FOG_COORD)) {
748 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
749 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
751 break;
753 case D3DFOG_LINEAR:
754 glFogi(GL_FOG_MODE, GL_LINEAR);
755 checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR");
756 if(GL_SUPPORT(EXT_FOG_COORD)) {
757 glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
758 checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
760 break;
762 case D3DFOG_NONE: /* Won't happen */
763 default:
764 FIXME("Unexpected WINED3DRS_FOGTABLEMODE %d\n", stateblock->renderState[WINED3DRS_FOGTABLEMODE]);
768 if(fogenable) {
769 glEnable(GL_FOG);
770 checkGLcall("glEnable GL_FOG");
772 glFogfv(GL_FOG_START, &fogstart);
773 checkGLcall("glFogf(GL_FOG_START, fogstart");
774 TRACE("Fog Start == %f\n", fogstart);
776 glFogfv(GL_FOG_END, &fogend);
777 checkGLcall("glFogf(GL_FOG_END, fogend");
778 TRACE("Fog End == %f\n", fogend);
779 } else {
780 glDisable(GL_FOG);
781 checkGLcall("glDisable GL_FOG");
784 if (GL_SUPPORT(NV_FOG_DISTANCE)) {
785 glFogi(GL_FOG_DISTANCE_MODE_NV, GL_EYE_PLANE_ABSOLUTE_NV);
789 static void state_fogcolor(DWORD state, IWineD3DStateBlockImpl *stateblock) {
790 float col[4];
791 D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_FOGCOLOR], col);
792 /* Set the default alpha blend color */
793 glFogfv(GL_FOG_COLOR, &col[0]);
794 checkGLcall("glFog GL_FOG_COLOR");
797 static void state_fogdensity(DWORD state, IWineD3DStateBlockImpl *stateblock) {
798 union {
799 DWORD d;
800 float f;
801 } tmpvalue;
802 tmpvalue.d = stateblock->renderState[WINED3DRS_FOGDENSITY];
803 glFogfv(GL_FOG_DENSITY, &tmpvalue.f);
804 checkGLcall("glFogf(GL_FOG_DENSITY, (float) Value)");
807 /* TODO: Merge with primitive type + init_materials()!! */
808 static void state_colormat(DWORD state, IWineD3DStateBlockImpl *stateblock) {
809 GLenum Parm = GL_AMBIENT_AND_DIFFUSE;
811 if (stateblock->renderState[WINED3DRS_COLORVERTEX]) {
812 TRACE("diff %d, amb %d, emis %d, spec %d\n",
813 stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE],
814 stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE],
815 stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE],
816 stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE]);
818 if (stateblock->renderState[WINED3DRS_DIFFUSEMATERIALSOURCE] == D3DMCS_COLOR1) {
819 if (stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE] == D3DMCS_COLOR1) {
820 Parm = GL_AMBIENT_AND_DIFFUSE;
821 } else {
822 Parm = GL_DIFFUSE;
824 } else if (stateblock->renderState[WINED3DRS_AMBIENTMATERIALSOURCE] == D3DMCS_COLOR1) {
825 Parm = GL_AMBIENT;
826 } else if (stateblock->renderState[WINED3DRS_EMISSIVEMATERIALSOURCE] == D3DMCS_COLOR1) {
827 Parm = GL_EMISSION;
828 } else if (stateblock->renderState[WINED3DRS_SPECULARMATERIALSOURCE] == D3DMCS_COLOR1) {
829 Parm = GL_SPECULAR;
830 } else {
831 Parm = -1;
834 if (Parm == -1) {
835 if (stateblock->wineD3DDevice->tracking_color != DISABLED_TRACKING) stateblock->wineD3DDevice->tracking_color = NEEDS_DISABLE;
836 } else {
837 stateblock->wineD3DDevice->tracking_color = NEEDS_TRACKING;
838 stateblock->wineD3DDevice->tracking_parm = Parm;
841 } else {
842 if (stateblock->wineD3DDevice->tracking_color != DISABLED_TRACKING) stateblock->wineD3DDevice->tracking_color = NEEDS_DISABLE;
846 static void state_linepattern(DWORD state, IWineD3DStateBlockImpl *stateblock) {
847 union {
848 DWORD d;
849 WINED3DLINEPATTERN lp;
850 } tmppattern;
851 tmppattern.d = stateblock->renderState[WINED3DRS_LINEPATTERN];
853 TRACE("Line pattern: repeat %d bits %x\n", tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern);
855 if (tmppattern.lp.wRepeatFactor) {
856 glLineStipple(tmppattern.lp.wRepeatFactor, tmppattern.lp.wLinePattern);
857 checkGLcall("glLineStipple(repeat, linepattern)");
858 glEnable(GL_LINE_STIPPLE);
859 checkGLcall("glEnable(GL_LINE_STIPPLE);");
860 } else {
861 glDisable(GL_LINE_STIPPLE);
862 checkGLcall("glDisable(GL_LINE_STIPPLE);");
866 static void state_zbias(DWORD state, IWineD3DStateBlockImpl *stateblock) {
867 union {
868 DWORD d;
869 float f;
870 } tmpvalue;
872 if (stateblock->renderState[WINED3DRS_ZBIAS]) {
873 tmpvalue.d = stateblock->renderState[WINED3DRS_ZBIAS];
874 TRACE("ZBias value %f\n", tmpvalue.f);
875 glPolygonOffset(0, -tmpvalue.f);
876 checkGLcall("glPolygonOffset(0, -Value)");
877 glEnable(GL_POLYGON_OFFSET_FILL);
878 checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL);");
879 glEnable(GL_POLYGON_OFFSET_LINE);
880 checkGLcall("glEnable(GL_POLYGON_OFFSET_LINE);");
881 glEnable(GL_POLYGON_OFFSET_POINT);
882 checkGLcall("glEnable(GL_POLYGON_OFFSET_POINT);");
883 } else {
884 glDisable(GL_POLYGON_OFFSET_FILL);
885 checkGLcall("glDisable(GL_POLYGON_OFFSET_FILL);");
886 glDisable(GL_POLYGON_OFFSET_LINE);
887 checkGLcall("glDisable(GL_POLYGON_OFFSET_LINE);");
888 glDisable(GL_POLYGON_OFFSET_POINT);
889 checkGLcall("glDisable(GL_POLYGON_OFFSET_POINT);");
894 static void state_normalize(DWORD state, IWineD3DStateBlockImpl *stateblock) {
895 if (stateblock->renderState[WINED3DRS_NORMALIZENORMALS]) {
896 glEnable(GL_NORMALIZE);
897 checkGLcall("glEnable(GL_NORMALIZE);");
898 } else {
899 glDisable(GL_NORMALIZE);
900 checkGLcall("glDisable(GL_NORMALIZE);");
904 static void state_psize(DWORD state, IWineD3DStateBlockImpl *stateblock) {
905 union {
906 DWORD d;
907 float f;
908 } tmpvalue;
910 /* FIXME: check that pointSize isn't outside glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize ); or -ve */
911 tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE];
912 TRACE("Set point size to %f\n", tmpvalue.f);
913 glPointSize(tmpvalue.f);
914 checkGLcall("glPointSize(...);");
917 static void state_psizemin(DWORD state, IWineD3DStateBlockImpl *stateblock) {
918 union {
919 DWORD d;
920 float f;
921 } tmpvalue;
923 if(GL_SUPPORT(ARB_POINT_PARAMETERS)) {
924 tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MIN];
925 GL_EXTCALL(glPointParameterfARB)(GL_POINT_SIZE_MIN_ARB, tmpvalue.f);
926 checkGLcall("glPointParameterfARB(...");
928 else if(GL_SUPPORT(EXT_POINT_PARAMETERS)) {
929 tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MIN];
930 GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MIN_EXT, tmpvalue.f);
931 checkGLcall("glPointParameterfEXT(...);");
932 } else {
933 FIXME("WINED3DRS_POINTSIZE_MIN not supported on this opengl\n");
937 static void state_psizemax(DWORD state, IWineD3DStateBlockImpl *stateblock) {
938 union {
939 DWORD d;
940 float f;
941 } tmpvalue;
943 if(GL_SUPPORT(ARB_POINT_PARAMETERS)) {
944 tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MAX];
945 GL_EXTCALL(glPointParameterfARB)(GL_POINT_SIZE_MAX_ARB, tmpvalue.f);
946 checkGLcall("glPointParameterfARB(...");
948 else if(GL_SUPPORT(EXT_POINT_PARAMETERS)) {
949 tmpvalue.d = stateblock->renderState[WINED3DRS_POINTSIZE_MAX];
950 GL_EXTCALL(glPointParameterfEXT)(GL_POINT_SIZE_MAX_EXT, tmpvalue.f);
951 checkGLcall("glPointParameterfEXT(...);");
952 } else {
953 FIXME("WINED3DRS_POINTSIZE_MAX not supported on this opengl\n");
957 static void state_pscale(DWORD state, IWineD3DStateBlockImpl *stateblock) {
958 /* TODO: Group this with the viewport */
960 * POINTSCALEENABLE controls how point size value is treated. If set to
961 * true, the point size is scaled with respect to height of viewport.
962 * When set to false point size is in pixels.
964 * http://msdn.microsoft.com/library/en-us/directx9_c/point_sprites.asp
967 /* Default values */
968 GLfloat att[3] = {1.0f, 0.0f, 0.0f};
971 * Minimum valid point size for OpenGL is 1.0f. For Direct3D it is 0.0f.
972 * This means that OpenGL will clamp really small point sizes to 1.0f.
973 * To correct for this we need to multiply by the scale factor when sizes
974 * are less than 1.0f. scale_factor = 1.0f / point_size.
976 GLfloat pointSize = *((float*)&stateblock->renderState[WINED3DRS_POINTSIZE]);
977 if(pointSize > 0.0f) {
978 GLfloat scaleFactor;
980 if(pointSize < 1.0f) {
981 scaleFactor = pointSize * pointSize;
982 } else {
983 scaleFactor = 1.0f;
986 if(stateblock->renderState[WINED3DRS_POINTSCALEENABLE]) {
987 att[0] = *((float*)&stateblock->renderState[WINED3DRS_POINTSCALE_A]) /
988 (stateblock->viewport.Height * stateblock->viewport.Height * scaleFactor);
989 att[1] = *((float*)&stateblock->renderState[WINED3DRS_POINTSCALE_B]) /
990 (stateblock->viewport.Height * stateblock->viewport.Height * scaleFactor);
991 att[2] = *((float*)&stateblock->renderState[WINED3DRS_POINTSCALE_C]) /
992 (stateblock->viewport.Height * stateblock->viewport.Height * scaleFactor);
996 if(GL_SUPPORT(ARB_POINT_PARAMETERS)) {
997 GL_EXTCALL(glPointParameterfvARB)(GL_POINT_DISTANCE_ATTENUATION_ARB, att);
998 checkGLcall("glPointParameterfvARB(GL_DISTANCE_ATTENUATION_ARB, ...");
1000 else if(GL_SUPPORT(EXT_POINT_PARAMETERS)) {
1001 GL_EXTCALL(glPointParameterfvEXT)(GL_DISTANCE_ATTENUATION_EXT, att);
1002 checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...");
1003 } else {
1004 TRACE("POINT_PARAMETERS not supported in this version of opengl\n");
1008 static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1009 DWORD Value = stateblock->renderState[WINED3DRS_COLORWRITEENABLE];
1011 TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n",
1012 Value & D3DCOLORWRITEENABLE_RED ? 1 : 0,
1013 Value & D3DCOLORWRITEENABLE_GREEN ? 1 : 0,
1014 Value & D3DCOLORWRITEENABLE_BLUE ? 1 : 0,
1015 Value & D3DCOLORWRITEENABLE_ALPHA ? 1 : 0);
1016 glColorMask(Value & D3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
1017 Value & D3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
1018 Value & D3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
1019 Value & D3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
1020 checkGLcall("glColorMask(...)");
1022 /* depends on WINED3DRS_COLORWRITEENABLE. */
1023 if(stateblock->renderState[WINED3DRS_COLORWRITEENABLE1] != 0x0000000F ||
1024 stateblock->renderState[WINED3DRS_COLORWRITEENABLE2] != 0x0000000F ||
1025 stateblock->renderState[WINED3DRS_COLORWRITEENABLE3] != 0x0000000F ) {
1026 ERR("(WINED3DRS_COLORWRITEENABLE1/2/3,%d,%d,%d) not yet implemented. Missing of cap D3DPMISCCAPS_INDEPENDENTWRITEMASKS wasn't honored?\n",
1027 stateblock->renderState[WINED3DRS_COLORWRITEENABLE1],
1028 stateblock->renderState[WINED3DRS_COLORWRITEENABLE2],
1029 stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]);
1033 static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1034 if(stateblock->renderState[WINED3DRS_LOCALVIEWER]) {
1035 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
1036 checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1)");
1037 } else {
1038 glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
1039 checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0)");
1043 static void state_lastpixel(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1044 if(stateblock->renderState[WINED3DRS_LASTPIXEL]) {
1045 TRACE("Last Pixel Drawing Enabled\n");
1046 } else {
1047 FIXME("Last Pixel Drawing Disabled, not handled yet\n");
1051 static void state_pointsprite(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1052 unsigned int i;
1053 int val;
1055 /* TODO: NV_POINT_SPRITE */
1056 if (!GL_SUPPORT(ARB_POINT_SPRITE)) {
1057 TRACE("Point sprites not supported\n");
1058 return;
1061 if (stateblock->renderState[WINED3DRS_POINTSPRITEENABLE]) {
1062 val = GL_TRUE;
1063 } else {
1064 val = GL_FALSE;
1067 for (i = 0; i < GL_LIMITS(texture_stages); i++) {
1068 /* Note the WINED3DRS value applies to all textures, but GL has one
1069 * per texture, so apply it now ready to be used!
1071 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
1072 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));
1073 checkGLcall("glActiveTextureARB");
1074 } else if (i==1) {
1075 FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
1076 break;
1079 glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, val);
1080 checkGLcall((val?"glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE)":
1081 "glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_FALSE)"));
1085 static void state_wrap(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1087 http://www.cosc.brocku.ca/Offerings/3P98/course/lectures/texture/
1088 http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/programmingguide/FixedFunction/Textures/texturewrapping.asp
1089 http://www.gamedev.net/reference/programming/features/rendererdll3/page2.asp
1090 Descussion that ways to turn on WRAPing to solve an opengl conversion problem.
1091 http://www.flipcode.org/cgi-bin/fcmsg.cgi?thread_show=10248
1093 so far as I can tell, wrapping and texture-coordinate generate go hand in hand,
1095 TRACE("Stub\n");
1096 if(stateblock->renderState[WINED3DRS_WRAP0] ||
1097 stateblock->renderState[WINED3DRS_WRAP1] ||
1098 stateblock->renderState[WINED3DRS_WRAP2] ||
1099 stateblock->renderState[WINED3DRS_WRAP3] ||
1100 stateblock->renderState[WINED3DRS_WRAP4] ||
1101 stateblock->renderState[WINED3DRS_WRAP5] ||
1102 stateblock->renderState[WINED3DRS_WRAP6] ||
1103 stateblock->renderState[WINED3DRS_WRAP7] ||
1104 stateblock->renderState[WINED3DRS_WRAP8] ||
1105 stateblock->renderState[WINED3DRS_WRAP9] ||
1106 stateblock->renderState[WINED3DRS_WRAP10] ||
1107 stateblock->renderState[WINED3DRS_WRAP11] ||
1108 stateblock->renderState[WINED3DRS_WRAP12] ||
1109 stateblock->renderState[WINED3DRS_WRAP13] ||
1110 stateblock->renderState[WINED3DRS_WRAP14] ||
1111 stateblock->renderState[WINED3DRS_WRAP15] ) {
1112 ERR("(WINED3DRS_WRAP0) Texture wraping not yet supported\n");
1116 static void state_multisampleaa(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1117 if( GL_SUPPORT(ARB_MULTISAMPLE) ) {
1118 if(stateblock->renderState[WINED3DRS_MULTISAMPLEANTIALIAS]) {
1119 glEnable(GL_MULTISAMPLE_ARB);
1120 checkGLcall("glEnable(GL_MULTISAMPLE_ARB)");
1121 } else {
1122 glDisable(GL_MULTISAMPLE_ARB);
1123 checkGLcall("glDisable(GL_MULTISAMPLE_ARB)");
1125 } else {
1126 if(stateblock->renderState[WINED3DRS_MULTISAMPLEANTIALIAS]) {
1127 ERR("Multisample antialiasing not supported by gl\n");
1132 static void state_scissor(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1133 if(stateblock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
1134 glEnable(GL_SCISSOR_TEST);
1135 checkGLcall("glEnable(GL_SCISSOR_TEST)");
1136 } else {
1137 glDisable(GL_SCISSOR_TEST);
1138 checkGLcall("glDisable(GL_SCISSOR_TEST)");
1142 static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1143 union {
1144 DWORD d;
1145 float f;
1146 } tmpvalue;
1148 if(stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS] ||
1149 stateblock->renderState[WINED3DRS_DEPTHBIAS]) {
1150 tmpvalue.d = stateblock->renderState[WINED3DRS_SLOPESCALEDEPTHBIAS];
1151 glEnable(GL_POLYGON_OFFSET_FILL);
1152 checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL)");
1153 glPolygonOffset(tmpvalue.f, *((float*)&stateblock->renderState[WINED3DRS_DEPTHBIAS]));
1154 checkGLcall("glPolygonOffset(...)");
1155 } else {
1156 glDisable(GL_POLYGON_OFFSET_FILL);
1157 checkGLcall("glDisable(GL_POLYGON_OFFSET_FILL)");
1161 static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1162 if (stateblock->renderState[WINED3DRS_TEXTUREPERSPECTIVE]) {
1163 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
1164 checkGLcall("glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)");
1165 } else {
1166 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
1167 checkGLcall("glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST)");
1171 static void state_stippledalpha(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1172 TRACE("Stub\n");
1173 if (stateblock->renderState[WINED3DRS_STIPPLEDALPHA])
1174 ERR(" Stippled Alpha not supported yet.\n");
1177 static void state_antialias(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1178 TRACE("Stub\n");
1179 if (stateblock->renderState[WINED3DRS_ANTIALIAS])
1180 ERR(" Antialias not supported yet.\n");
1183 static void state_multisampmask(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1184 TRACE("Stub\n");
1185 if (stateblock->renderState[WINED3DRS_MULTISAMPLEMASK] != 0xFFFFFFFF)
1186 ERR("(WINED3DRS_MULTISAMPLEMASK,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_MULTISAMPLEMASK]);
1189 static void state_patchedgestyle(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1190 TRACE("Stub\n");
1191 if (stateblock->renderState[WINED3DRS_PATCHEDGESTYLE] != D3DPATCHEDGE_DISCRETE)
1192 ERR("(WINED3DRS_PATCHEDGESTYLE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_PATCHEDGESTYLE]);
1195 static void state_patchsegments(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1196 union {
1197 DWORD d;
1198 float f;
1199 } tmpvalue;
1200 tmpvalue.f = 1.0f;
1202 TRACE("Stub\n");
1203 if (stateblock->renderState[WINED3DRS_PATCHSEGMENTS] != tmpvalue.d)
1204 ERR("(WINED3DRS_PATCHSEGMENTS,%d) not yet implemented\n", tmpvalue.d);
1207 static void state_positiondegree(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1208 TRACE("Stub\n");
1209 if (stateblock->renderState[WINED3DRS_POSITIONDEGREE] != D3DDEGREE_CUBIC)
1210 ERR("(WINED3DRS_POSITIONDEGREE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_POSITIONDEGREE]);
1213 static void state_normaldegree(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1214 TRACE("Stub\n");
1215 if (stateblock->renderState[WINED3DRS_NORMALDEGREE] != D3DDEGREE_LINEAR)
1216 ERR("(WINED3DRS_NORMALDEGREE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_NORMALDEGREE]);
1219 static void state_tessellation(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1220 TRACE("Stub\n");
1221 if(stateblock->renderState[WINED3DRS_ENABLEADAPTIVETESSELLATION])
1222 FIXME("(WINED3DRS_ENABLEADAPTIVETESSELLATION,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_ENABLEADAPTIVETESSELLATION]);
1226 static void state_srgbwrite(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1227 if(stateblock->renderState[WINED3DRS_SRGBWRITEENABLE])
1228 ERR("Render state WINED3DRS_SRGBWRITEENABLE not yet implemented\n");
1231 static void state_seperateblend(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1232 TRACE("Stub\n");
1233 if(stateblock->renderState[WINED3DRS_SEPARATEALPHABLENDENABLE])
1234 FIXME("(WINED3DRS_SEPARATEALPHABLENDENABLE,%d) not yet implemented\n", stateblock->renderState[WINED3DRS_SEPARATEALPHABLENDENABLE]);
1237 static void state_wrapu(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1238 if(stateblock->renderState[WINED3DRS_WRAPU]) {
1239 FIXME("Render state WINED3DRS_WRAPU not implemented yet\n");
1243 static void state_wrapv(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1244 if(stateblock->renderState[WINED3DRS_WRAPV]) {
1245 FIXME("Render state WINED3DRS_WRAPV not implemented yet\n");
1249 static void state_monoenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1250 if(stateblock->renderState[WINED3DRS_MONOENABLE]) {
1251 FIXME("Render state WINED3DRS_MONOENABLE not implemented yet\n");
1255 static void state_rop2(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1256 if(stateblock->renderState[WINED3DRS_ROP2]) {
1257 FIXME("Render state WINED3DRS_ROP2 not implemented yet\n");
1261 static void state_planemask(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1262 if(stateblock->renderState[WINED3DRS_PLANEMASK]) {
1263 FIXME("Render state WINED3DRS_PLANEMASK not implemented yet\n");
1267 static void state_subpixel(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1268 if(stateblock->renderState[WINED3DRS_SUBPIXEL]) {
1269 FIXME("Render state WINED3DRS_SUBPIXEL not implemented yet\n");
1273 static void state_subpixelx(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1274 if(stateblock->renderState[WINED3DRS_SUBPIXELX]) {
1275 FIXME("Render state WINED3DRS_SUBPIXELX not implemented yet\n");
1279 static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1280 if(stateblock->renderState[WINED3DRS_STIPPLEENABLE]) {
1281 FIXME("Render state WINED3DRS_STIPPLEENABLE not implemented yet\n");
1285 static void state_bordercolor(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1286 if(stateblock->renderState[WINED3DRS_BORDERCOLOR]) {
1287 FIXME("Render state WINED3DRS_BORDERCOLOR not implemented yet\n");
1291 static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1292 if(stateblock->renderState[WINED3DRS_MIPMAPLODBIAS]) {
1293 FIXME("Render state WINED3DRS_MIPMAPLODBIAS not implemented yet\n");
1297 static void state_anisotropy(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1298 if(stateblock->renderState[WINED3DRS_ANISOTROPY]) {
1299 FIXME("Render state WINED3DRS_ANISOTROPY not implemented yet\n");
1303 static void state_flushbatch(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1304 if(stateblock->renderState[WINED3DRS_FLUSHBATCH]) {
1305 FIXME("Render state WINED3DRS_FLUSHBATCH not implemented yet\n");
1309 static void state_translucentsi(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1310 if(stateblock->renderState[WINED3DRS_TRANSLUCENTSORTINDEPENDENT]) {
1311 FIXME("Render state WINED3DRS_TRANSLUCENTSORTINDEPENDENT not implemented yet\n");
1315 static void state_extents(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1316 if(stateblock->renderState[WINED3DRS_EXTENTS]) {
1317 FIXME("Render state WINED3DRS_EXTENTS not implemented yet\n");
1321 static void state_ckeyblend(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1322 if(stateblock->renderState[WINED3DRS_COLORKEYBLENDENABLE]) {
1323 FIXME("Render state WINED3DRS_COLORKEYBLENDENABLE not implemented yet\n");
1327 /* Activates the texture dimension according to the bound D3D texture.
1328 * Does not care for the colorop or correct gl texture unit(when using nvrc)
1329 * Requires the caller to activate the correct unit before
1331 static void activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock) {
1332 if(stateblock->textures[stage]) {
1333 glDisable(GL_TEXTURE_1D);
1334 checkGLcall("glDisable(GL_TEXTURE_1D)");
1335 switch(stateblock->textureDimensions[stage]) {
1336 case GL_TEXTURE_2D:
1337 glDisable(GL_TEXTURE_3D);
1338 checkGLcall("glDisable(GL_TEXTURE_3D)");
1339 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
1340 checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
1341 glEnable(GL_TEXTURE_2D);
1342 checkGLcall("glEnable(GL_TEXTURE_2D)");
1343 break;
1344 case GL_TEXTURE_3D:
1345 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
1346 checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
1347 glDisable(GL_TEXTURE_2D);
1348 checkGLcall("glDisable(GL_TEXTURE_2D)");
1349 glEnable(GL_TEXTURE_3D);
1350 checkGLcall("glEnable(GL_TEXTURE_3D)");
1351 break;
1352 case GL_TEXTURE_CUBE_MAP_ARB:
1353 glDisable(GL_TEXTURE_2D);
1354 checkGLcall("glDisable(GL_TEXTURE_2D)");
1355 glDisable(GL_TEXTURE_3D);
1356 checkGLcall("glDisable(GL_TEXTURE_3D)");
1357 glEnable(GL_TEXTURE_CUBE_MAP_ARB);
1358 checkGLcall("glEnable(GL_TEXTURE_CUBE_MAP_ARB)");
1359 break;
1361 } else {
1362 glDisable(GL_TEXTURE_2D);
1363 checkGLcall("glDisable(GL_TEXTURE_2D)");
1364 glDisable(GL_TEXTURE_3D);
1365 checkGLcall("glDisable(GL_TEXTURE_3D)");
1366 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
1367 checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
1368 glEnable(GL_TEXTURE_1D);
1369 checkGLcall("glEnable(GL_TEXTURE_1D)");
1370 /* Binding textures is done by samplers. A dummy texture will be bound */
1374 static void tex_colorop(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1375 DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
1376 DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
1378 TRACE("Setting color op for stage %d\n", stage);
1380 if (stateblock->pixelShader && stateblock->wineD3DDevice->ps_selected_mode != SHADER_NONE &&
1381 ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function) {
1382 /* Using a pixel shader? Don't care for anything here, the shader applying does it */
1383 return;
1386 if (stage != mapped_stage) WARN("Using non 1:1 mapping: %d -> %d!\n", stage, mapped_stage);
1388 if (mapped_stage != -1) {
1389 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
1390 if (mapped_stage >= GL_LIMITS(sampler_stages)) {
1391 if (stateblock->textureState[stage][WINED3DTSS_COLOROP] != WINED3DTOP_DISABLE &&
1392 stateblock->textureState[stage][WINED3DTSS_COLOROP] != 0) {
1393 FIXME("Attempt to enable unsupported stage!\n");
1395 return;
1397 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
1398 checkGLcall("glActiveTextureARB");
1399 } else if (stage > 0) {
1400 WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
1401 return;
1405 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
1406 if(stateblock->lowest_disabled_stage > 0) {
1407 glEnable(GL_REGISTER_COMBINERS_NV);
1408 GL_EXTCALL(glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, stateblock->lowest_disabled_stage));
1409 } else {
1410 glDisable(GL_REGISTER_COMBINERS_NV);
1413 if(stage >= stateblock->lowest_disabled_stage) {
1414 TRACE("Stage disabled\n");
1415 if (mapped_stage != -1) {
1416 /* Disable everything here */
1417 glDisable(GL_TEXTURE_1D);
1418 checkGLcall("glDisable(GL_TEXTURE_1D)");
1419 glDisable(GL_TEXTURE_2D);
1420 checkGLcall("glDisable(GL_TEXTURE_2D)");
1421 glDisable(GL_TEXTURE_3D);
1422 checkGLcall("glDisable(GL_TEXTURE_3D)");
1423 glDisable(GL_TEXTURE_CUBE_MAP_ARB);
1424 checkGLcall("glDisable(GL_TEXTURE_CUBE_MAP_ARB)");
1426 /* All done */
1427 return;
1430 if (mapped_stage != -1) activate_dimensions(stage, stateblock);
1432 /* Set the texture combiners */
1433 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
1434 set_tex_op_nvrc((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, stage,
1435 stateblock->textureState[stage][WINED3DTSS_COLOROP],
1436 stateblock->textureState[stage][WINED3DTSS_COLORARG1],
1437 stateblock->textureState[stage][WINED3DTSS_COLORARG2],
1438 stateblock->textureState[stage][WINED3DTSS_COLORARG0],
1439 mapped_stage);
1440 } else {
1441 set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, FALSE, stage,
1442 stateblock->textureState[stage][WINED3DTSS_COLOROP],
1443 stateblock->textureState[stage][WINED3DTSS_COLORARG1],
1444 stateblock->textureState[stage][WINED3DTSS_COLORARG2],
1445 stateblock->textureState[stage][WINED3DTSS_COLORARG0]);
1449 static void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1450 DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
1451 DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
1453 TRACE("Setting alpha op for stage %d\n", stage);
1454 /* Do not care for enabled / disabled stages, just assign the settigns. colorop disables / enables required stuff */
1455 if (mapped_stage != -1) {
1456 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
1457 if (stage >= GL_LIMITS(sampler_stages)) {
1458 if (stateblock->textureState[stage][WINED3DTSS_COLOROP] != WINED3DTOP_DISABLE &&
1459 stateblock->textureState[stage][WINED3DTSS_COLOROP] != 0) {
1460 FIXME("Attempt to enable unsupported stage!\n");
1462 return;
1464 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
1465 checkGLcall("glActiveTextureARB");
1466 } else if (stage > 0) {
1467 /* We can't do anything here */
1468 WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
1469 return;
1473 TRACE("Setting alpha op for stage %d\n", stage);
1474 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
1475 set_tex_op_nvrc((IWineD3DDevice *)stateblock->wineD3DDevice, TRUE, stage,
1476 stateblock->textureState[stage][WINED3DTSS_ALPHAOP],
1477 stateblock->textureState[stage][WINED3DTSS_ALPHAARG1],
1478 stateblock->textureState[stage][WINED3DTSS_ALPHAARG2],
1479 stateblock->textureState[stage][WINED3DTSS_ALPHAARG0],
1480 mapped_stage);
1481 } else {
1482 set_tex_op((IWineD3DDevice *)stateblock->wineD3DDevice, TRUE, stage, stateblock->textureState[stage][WINED3DTSS_ALPHAOP],
1483 stateblock->textureState[stage][WINED3DTSS_ALPHAARG1],
1484 stateblock->textureState[stage][WINED3DTSS_ALPHAARG2],
1485 stateblock->textureState[stage][WINED3DTSS_ALPHAARG0]);
1489 static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1490 DWORD texUnit = state - STATE_TRANSFORM(WINED3DTS_TEXTURE0);
1492 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
1493 if(texUnit >= GL_LIMITS(sampler_stages)) {
1494 return;
1496 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + stateblock->wineD3DDevice->texUnitMap[texUnit]));
1497 checkGLcall("glActiveTextureARB");
1498 } else if (texUnit > 0) {
1499 /* We can't do anything here */
1500 WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
1501 return;
1504 set_texture_matrix((float *)&stateblock->transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0],
1505 stateblock->textureState[texUnit][WINED3DTSS_TEXTURETRANSFORMFLAGS],
1506 (stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX] & 0xFFFF0000) != WINED3DTSS_TCI_PASSTHRU);
1510 static void loadVertexData(IWineD3DStateBlockImpl *stateblock, WineDirect3DVertexStridedData *sd);
1512 static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1513 DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
1514 DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[stage];
1516 if (mapped_stage == -1) {
1517 TRACE("No texture unit mapped to stage %d. Skipping texture coordinates.\n", stage);
1518 return;
1521 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
1522 if(stage >= GL_LIMITS(sampler_stages)) {
1523 return;
1525 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
1526 checkGLcall("glActiveTextureARB");
1527 } else if (stage > 0) {
1528 /* We can't do anything here */
1529 WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
1530 return;
1533 /* Values 0-7 are indexes into the FVF tex coords - See comments in DrawPrimitive
1535 * FIXME: From MSDN: The WINED3DTSS_TCI_* flags are mutually exclusive. If you include
1536 * one flag, you can still specify an index value, which the system uses to
1537 * determine the texture wrapping mode.
1538 * eg. SetTextureStageState( 0, WINED3DTSS_TEXCOORDINDEX, WINED3DTSS_TCI_CAMERASPACEPOSITION | 1 );
1539 * means use the vertex position (camera-space) as the input texture coordinates
1540 * for this texture stage, and the wrap mode set in the WINED3DRS_WRAP1 render
1541 * state. We do not (yet) support the WINED3DRENDERSTATE_WRAPx values, nor tie them up
1542 * to the TEXCOORDINDEX value
1546 * Be careful the value of the mask 0xF0000 come from d3d8types.h infos
1548 switch (stateblock->textureState[stage][WINED3DTSS_TEXCOORDINDEX] & 0xFFFF0000) {
1549 case WINED3DTSS_TCI_PASSTHRU:
1550 /*Use the specified texture coordinates contained within the vertex format. This value resolves to zero.*/
1551 glDisable(GL_TEXTURE_GEN_S);
1552 glDisable(GL_TEXTURE_GEN_T);
1553 glDisable(GL_TEXTURE_GEN_R);
1554 glDisable(GL_TEXTURE_GEN_Q);
1555 checkGLcall("glDisable(GL_TEXTURE_GEN_S,T,R,Q)");
1556 break;
1558 case WINED3DTSS_TCI_CAMERASPACEPOSITION:
1559 /* CameraSpacePosition means use the vertex position, transformed to camera space,
1560 * as the input texture coordinates for this stage's texture transformation. This
1561 * equates roughly to EYE_LINEAR
1564 float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
1565 float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
1566 float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
1567 float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
1568 TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set eye plane\n");
1570 glMatrixMode(GL_MODELVIEW);
1571 glPushMatrix();
1572 glLoadIdentity();
1573 glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
1574 glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
1575 glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
1576 glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
1577 glPopMatrix();
1579 TRACE("WINED3DTSS_TCI_CAMERASPACEPOSITION - Set GL_TEXTURE_GEN_x and GL_x, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR\n");
1580 glEnable(GL_TEXTURE_GEN_S);
1581 checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
1582 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
1583 checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
1584 glEnable(GL_TEXTURE_GEN_T);
1585 checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
1586 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
1587 checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
1588 glEnable(GL_TEXTURE_GEN_R);
1589 checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
1590 glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
1591 checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR)");
1593 break;
1595 case WINED3DTSS_TCI_CAMERASPACENORMAL:
1597 if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) {
1598 float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
1599 float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
1600 float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
1601 float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
1602 TRACE("WINED3DTSS_TCI_CAMERASPACENORMAL - Set eye plane\n");
1604 glMatrixMode(GL_MODELVIEW);
1605 glPushMatrix();
1606 glLoadIdentity();
1607 glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
1608 glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
1609 glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
1610 glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
1611 glPopMatrix();
1613 glEnable(GL_TEXTURE_GEN_S);
1614 checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
1615 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV);
1616 checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)");
1617 glEnable(GL_TEXTURE_GEN_T);
1618 checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
1619 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV);
1620 checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)");
1621 glEnable(GL_TEXTURE_GEN_R);
1622 checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
1623 glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV);
1624 checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_NV)");
1627 break;
1629 case WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR:
1631 if (GL_SUPPORT(NV_TEXGEN_REFLECTION)) {
1632 float s_plane[] = { 1.0, 0.0, 0.0, 0.0 };
1633 float t_plane[] = { 0.0, 1.0, 0.0, 0.0 };
1634 float r_plane[] = { 0.0, 0.0, 1.0, 0.0 };
1635 float q_plane[] = { 0.0, 0.0, 0.0, 1.0 };
1636 TRACE("WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR - Set eye plane\n");
1638 glMatrixMode(GL_MODELVIEW);
1639 glPushMatrix();
1640 glLoadIdentity();
1641 glTexGenfv(GL_S, GL_EYE_PLANE, s_plane);
1642 glTexGenfv(GL_T, GL_EYE_PLANE, t_plane);
1643 glTexGenfv(GL_R, GL_EYE_PLANE, r_plane);
1644 glTexGenfv(GL_Q, GL_EYE_PLANE, q_plane);
1645 glPopMatrix();
1647 glEnable(GL_TEXTURE_GEN_S);
1648 checkGLcall("glEnable(GL_TEXTURE_GEN_S);");
1649 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV);
1650 checkGLcall("glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)");
1651 glEnable(GL_TEXTURE_GEN_T);
1652 checkGLcall("glEnable(GL_TEXTURE_GEN_T);");
1653 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV);
1654 checkGLcall("glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)");
1655 glEnable(GL_TEXTURE_GEN_R);
1656 checkGLcall("glEnable(GL_TEXTURE_GEN_R);");
1657 glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV);
1658 checkGLcall("glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_NV)");
1661 break;
1663 /* Unhandled types: */
1664 default:
1665 /* Todo: */
1666 /* ? disable GL_TEXTURE_GEN_n ? */
1667 glDisable(GL_TEXTURE_GEN_S);
1668 glDisable(GL_TEXTURE_GEN_T);
1669 glDisable(GL_TEXTURE_GEN_R);
1670 glDisable(GL_TEXTURE_GEN_Q);
1671 FIXME("Unhandled WINED3DTSS_TEXCOORDINDEX %x\n", stateblock->textureState[stage][WINED3DTSS_TEXCOORDINDEX]);
1672 break;
1675 /* Update the texture matrix */
1676 if(!isStateDirty(stateblock->wineD3DDevice, STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stage))) {
1677 transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stage), stateblock);
1680 if(!isStateDirty(stateblock->wineD3DDevice, STATE_VDECL) && stateblock->wineD3DDevice->namedArraysLoaded) {
1681 /* Reload the arrays if we are using fixed function arrays to reflect the selected coord input
1682 * source. Call loadVertexData directly because there is no need to reparse the vertex declaration
1683 * and do all the things linked to it
1684 * TODO: Tidy that up to reload only the arrays of the changed unit
1686 loadVertexData(stateblock, &stateblock->wineD3DDevice->strided_streams);
1690 static void tex_bumpenvlscale(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1691 DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
1692 union {
1693 DWORD d;
1694 float f;
1695 } tmpvalue;
1697 tmpvalue.d = stateblock->textureState[stage][WINED3DTSS_BUMPENVLSCALE];
1698 if(tmpvalue.f != 0.0) {
1699 ERR("WINED3DTSS_BUMPENVLSCALE not supported yet\n");
1703 static void tex_bumpenvloffset(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1704 DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
1705 union {
1706 DWORD d;
1707 float f;
1708 } tmpvalue;
1710 tmpvalue.d = stateblock->textureState[stage][WINED3DTSS_BUMPENVLOFFSET];
1711 if(tmpvalue.f != 0.0) {
1712 ERR("WINED3DTSS_BUMPENVLOFFSET not supported yet\n");
1716 static void tex_resultarg(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1717 DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE;
1719 if(stateblock->textureState[stage][WINED3DTSS_RESULTARG] != D3DTA_CURRENT) {
1720 ERR("WINED3DTSS_RESULTARG not supported yet\n");
1724 static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1725 DWORD sampler = state - STATE_SAMPLER(0);
1726 DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[sampler];
1727 union {
1728 float f;
1729 DWORD d;
1730 } tmpvalue;
1732 TRACE("Sampler: %d\n", sampler);
1733 /* Enabling and disabling texture dimensions is done by texture stage state / pixel shader setup, this function
1734 * only has to bind textures and set the per texture states
1737 if (mapped_stage == -1) {
1738 TRACE("No sampler mapped to stage %d. Returning.\n", sampler);
1739 return;
1742 if (GL_SUPPORT(ARB_MULTITEXTURE)) {
1743 if(sampler >= GL_LIMITS(sampler_stages)) {
1744 return;
1746 GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
1747 checkGLcall("glActiveTextureARB");
1748 } else if (sampler > 0) {
1749 /* We can't do anything here */
1750 WARN("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
1751 return;
1754 if(stateblock->textures[sampler]) {
1755 BOOL texIsPow2 = FALSE;
1757 /* The fixed function np2 texture emulation uses the texture matrix to fix up the coordinates
1758 * IWineD3DBaseTexture::ApplyStateChanges multiplies the set matrix with a fixup matrix. Before the
1759 * scaling is reapplied or removed, the texture matrix has to be reapplied
1761 if(wined3d_settings.nonpower2_mode != NP2_NATIVE && sampler < MAX_TEXTURES) {
1762 if(stateblock->textureDimensions[sampler] == GL_TEXTURE_2D) {
1763 if(((IWineD3DTextureImpl *) stateblock->textures[sampler])->pow2scalingFactorX != 1.0 ||
1764 ((IWineD3DTextureImpl *) stateblock->textures[sampler])->pow2scalingFactorY != 1.0 ) {
1765 texIsPow2 = TRUE;
1767 } else if(stateblock->textureDimensions[sampler] == GL_TEXTURE_CUBE_MAP_ARB) {
1768 if(((IWineD3DCubeTextureImpl *) stateblock->textures[sampler])->pow2scalingFactor != 1.0) {
1769 texIsPow2 = TRUE;
1773 if(texIsPow2 || stateblock->wineD3DDevice->lastWasPow2Texture[sampler]) {
1774 transform_texture(STATE_TRANSFORM(WINED3DTS_TEXTURE0 + stateblock->wineD3DDevice->texUnitMap[sampler]), stateblock);
1775 stateblock->wineD3DDevice->lastWasPow2Texture[sampler] = texIsPow2;
1779 IWineD3DBaseTexture_PreLoad((IWineD3DBaseTexture *) stateblock->textures[sampler]);
1780 IWineD3DBaseTexture_ApplyStateChanges(stateblock->textures[sampler], stateblock->textureState[sampler], stateblock->samplerState[sampler]);
1782 if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) {
1783 tmpvalue.d = stateblock->samplerState[sampler][WINED3DSAMP_MIPMAPLODBIAS];
1784 glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
1785 GL_TEXTURE_LOD_BIAS_EXT,
1786 tmpvalue.f);
1787 checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ...");
1790 if (stateblock->wineD3DDevice->ps_selected_mode != SHADER_NONE && stateblock->pixelShader &&
1791 ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function) {
1792 /* Using a pixel shader? Verify the sampler types */
1794 /* Make sure that the texture dimensions are enabled. I don't have to disable the other
1795 * dimensions because the shader knows from which texture type to sample from. For the sake of
1796 * debugging all dimensions could be enabled and a texture with some ugly pink bound to the unused
1797 * dimensions. This should make wrong sampling sources visible :-)
1799 glEnable(stateblock->textureDimensions[sampler]);
1800 checkGLcall("glEnable(stateblock->textureDimensions[sampler])");
1801 } else if(sampler < stateblock->lowest_disabled_stage) {
1802 activate_dimensions(sampler, stateblock);
1804 if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && sampler == 0) {
1805 /* If color keying is enabled update the alpha test, it depends on the existence
1806 * of a color key in stage 0
1808 state_alpha(WINED3DRS_COLORKEYENABLE, stateblock);
1811 } else if(sampler < GL_LIMITS(texture_stages)) {
1812 if(sampler < stateblock->lowest_disabled_stage) {
1813 /* TODO: Check if the colorop is dirty to do that job
1814 * TODO: What should I do with pixel shaders here ???
1816 activate_dimensions(sampler, stateblock);
1817 } /* Otherwise tex_colorop disables the stage */
1818 glBindTexture(GL_TEXTURE_1D, stateblock->wineD3DDevice->dummyTextureName[sampler]);
1819 checkGLcall("glBindTexture(GL_TEXTURE_1D, stateblock->wineD3DDevice->dummyTextureName[sampler])");
1823 static void shaderconstant(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1824 IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
1826 /* Vertex and pixel shader states will call a shader upload, don't do anything as long one of them
1827 * has an update pending
1829 if(isStateDirty(device, STATE_VDECL) ||
1830 isStateDirty(device, STATE_PIXELSHADER)) {
1831 return;
1834 device->shader_backend->shader_load_constants((IWineD3DDevice *) device,
1835 stateblock->pixelShader && ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function,
1836 stateblock->vertexShader && ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function);
1839 static void pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1840 int i;
1842 if(stateblock->pixelShader && ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.function != NULL) {
1843 if(!stateblock->wineD3DDevice->last_was_pshader) {
1844 /* Former draw without a pixel shader, some samplers
1845 * may be disabled because of WINED3DTSS_COLOROP = WINED3DTOP_DISABLE
1846 * make sure to enable them
1848 for(i=0; i < MAX_SAMPLERS; i++) {
1849 if(!isStateDirty(stateblock->wineD3DDevice, STATE_SAMPLER(i))) {
1850 sampler(STATE_SAMPLER(i), stateblock);
1853 } else {
1854 /* Otherwise all samplers were activated by the code above in earlier draws, or by sampler()
1855 * if a different texture was bound. I don't have to do anything.
1859 /* Compile and bind the shader */
1860 IWineD3DPixelShader_CompileShader(stateblock->pixelShader);
1862 if(!isStateDirty(stateblock->wineD3DDevice, StateTable[STATE_VSHADER].representative)) {
1863 stateblock->wineD3DDevice->shader_backend->shader_select(
1864 (IWineD3DDevice *) stateblock->wineD3DDevice,
1865 TRUE,
1866 !stateblock->vertexShader ? FALSE : ((IWineD3DVertexShaderImpl *) stateblock->vertexShader)->baseShader.function != NULL);
1868 if(!isStateDirty(stateblock->wineD3DDevice, STATE_VERTEXSHADERCONSTANT)) {
1869 shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock);
1872 stateblock->wineD3DDevice->last_was_pshader = TRUE;
1873 } else {
1874 /* Disabled the pixel shader - color ops weren't applied
1875 * while it was enabled, so re-apply them.
1877 for(i=0; i < MAX_TEXTURES; i++) {
1878 if(!isStateDirty(stateblock->wineD3DDevice, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) {
1879 tex_colorop(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock);
1882 stateblock->wineD3DDevice->last_was_pshader = FALSE;
1884 if(!isStateDirty(stateblock->wineD3DDevice, StateTable[STATE_VSHADER].representative)) {
1885 stateblock->wineD3DDevice->shader_backend->shader_select(
1886 (IWineD3DDevice *) stateblock->wineD3DDevice,
1887 FALSE,
1888 !stateblock->vertexShader ? FALSE : ((IWineD3DVertexShaderImpl *) stateblock->vertexShader)->baseShader.function != NULL);
1890 if(!isStateDirty(stateblock->wineD3DDevice, STATE_VERTEXSHADERCONSTANT)) {
1891 shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock);
1897 static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1898 /* This function is called by transform_view below if the view matrix was changed too
1900 * Deliberately no check if the vertex declaration is dirty because the vdecl state
1901 * does not always update the world matrix, only on a switch between transformed
1902 * and untrannsformed draws. It *may* happen that the world matrix is set 2 times during one
1903 * draw, but that should be rather rare and cheaper in total.
1905 glMatrixMode(GL_MODELVIEW);
1906 checkGLcall("glMatrixMode");
1908 if(stateblock->wineD3DDevice->last_was_rhw) {
1909 glLoadIdentity();
1910 checkGLcall("glLoadIdentity()");
1911 } else {
1912 /* In the general case, the view matrix is the identity matrix */
1913 if (stateblock->wineD3DDevice->view_ident) {
1914 glLoadMatrixf((float *) &stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
1915 checkGLcall("glLoadMatrixf");
1916 } else {
1917 glLoadMatrixf((float *) &stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
1918 checkGLcall("glLoadMatrixf");
1919 glMultMatrixf((float *) &stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
1920 checkGLcall("glMultMatrixf");
1925 static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1926 unsigned int k;
1928 /* If we are changing the View matrix, reset the light and clipping planes to the new view
1929 * NOTE: We have to reset the positions even if the light/plane is not currently
1930 * enabled, since the call to enable it will not reset the position.
1931 * NOTE2: Apparently texture transforms do NOT need reapplying
1934 PLIGHTINFOEL *lightChain = NULL;
1936 glMatrixMode(GL_MODELVIEW);
1937 checkGLcall("glMatrixMode(GL_MODELVIEW)");
1938 glLoadMatrixf((float *)(float *) &stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
1939 checkGLcall("glLoadMatrixf(...)");
1941 /* Reset lights. TODO: Call light apply func */
1942 lightChain = stateblock->lights;
1943 while (lightChain && lightChain->glIndex != -1) {
1944 glLightfv(GL_LIGHT0 + lightChain->glIndex, GL_POSITION, lightChain->lightPosn);
1945 checkGLcall("glLightfv posn");
1946 glLightfv(GL_LIGHT0 + lightChain->glIndex, GL_SPOT_DIRECTION, lightChain->lightDirn);
1947 checkGLcall("glLightfv dirn");
1948 lightChain = lightChain->next;
1951 /* Reset Clipping Planes if clipping is enabled. TODO: Call clipplane apply func */
1952 for (k = 0; k < GL_LIMITS(clipplanes); k++) {
1953 glClipPlane(GL_CLIP_PLANE0 + k, stateblock->clipplane[k]);
1954 checkGLcall("glClipPlane");
1957 if(stateblock->wineD3DDevice->last_was_rhw) {
1958 glLoadIdentity();
1959 checkGLcall("glLoadIdentity()");
1960 /* No need to update the world matrix, the identity is fine */
1961 return;
1964 /* Call the world matrix state, this will apply the combined WORLD + VIEW matrix
1965 * No need to do it here if the state is scheduled for update.
1967 if(!isStateDirty(stateblock->wineD3DDevice, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)))) {
1968 transform_world(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), stateblock);
1972 static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateBlock) {
1973 WARN("World matrix 1 - 255 not supported yet\n");
1976 static const GLfloat invymat[16] = {
1977 1.0f, 0.0f, 0.0f, 0.0f,
1978 0.0f, -1.0f, 0.0f, 0.0f,
1979 0.0f, 0.0f, 1.0f, 0.0f,
1980 0.0f, 0.0f, 0.0f, 1.0f};
1982 static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock) {
1983 glMatrixMode(GL_PROJECTION);
1984 checkGLcall("glMatrixMode(GL_PROJECTION)");
1985 glLoadIdentity();
1986 checkGLcall("glLoadIdentity");
1988 if(stateblock->wineD3DDevice->last_was_rhw) {
1989 double X, Y, height, width, minZ, maxZ;
1991 X = stateblock->viewport.X;
1992 Y = stateblock->viewport.Y;
1993 height = stateblock->viewport.Height;
1994 width = stateblock->viewport.Width;
1995 minZ = stateblock->viewport.MinZ;
1996 maxZ = stateblock->viewport.MaxZ;
1998 if(!stateblock->wineD3DDevice->untransformed) {
1999 /* Transformed vertices are supposed to bypass the whole transform pipeline including
2000 * frustum clipping. This can't be done in opengl, so this code adjusts the Z range to
2001 * suppress depth clipping. This can be done because it is an orthogonal projection and
2002 * the Z coordinate does not affect the size of the primitives
2004 TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
2005 glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
2006 } else {
2007 /* If the app mixes transformed and untransformed primitives we can't use the coordinate system
2008 * trick above because this would mess up transformed and untransformed Z order. Pass the z position
2009 * unmodified to opengl.
2011 * If the app depends on mixed types and disabled clipping we're out of luck without a pipeline
2012 * replacement shader.
2014 TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, 1.0, -1.0);
2015 glOrtho(X, X + width, Y + height, Y, 1.0, -1.0);
2017 checkGLcall("glOrtho");
2019 /* Window Coord 0 is the middle of the first pixel, so translate by 3/8 pixels */
2020 glTranslatef(0.375, 0.375, 0);
2021 checkGLcall("glTranslatef(0.375, 0.375, 0)");
2022 /* D3D texture coordinates are flipped compared to OpenGL ones, so
2023 * render everything upside down when rendering offscreen. */
2024 if (stateblock->wineD3DDevice->render_offscreen) {
2025 glMultMatrixf(invymat);
2026 checkGLcall("glMultMatrixf(invymat)");
2028 } else {
2029 /* The rule is that the window coordinate 0 does not correspond to the
2030 beginning of the first pixel, but the center of the first pixel.
2031 As a consequence if you want to correctly draw one line exactly from
2032 the left to the right end of the viewport (with all matrices set to
2033 be identity), the x coords of both ends of the line would be not
2034 -1 and 1 respectively but (-1-1/viewport_widh) and (1-1/viewport_width)
2035 instead. */
2036 glTranslatef(0.9 / stateblock->viewport.Width, -0.9 / stateblock->viewport.Height, 0);
2037 checkGLcall("glTranslatef (0.9 / width, -0.9 / height, 0)");
2039 /* D3D texture coordinates are flipped compared to OpenGL ones, so
2040 * render everything upside down when rendering offscreen. */
2041 if (stateblock->wineD3DDevice->render_offscreen) {
2042 glMultMatrixf(invymat);
2043 checkGLcall("glMultMatrixf(invymat)");
2045 glMultMatrixf((float *) &stateblock->transforms[WINED3DTS_PROJECTION].u.m[0][0]);
2046 checkGLcall("glLoadMatrixf");
2050 /* This should match any arrays loaded in loadVertexData.
2051 * stateblock impl is required for GL_SUPPORT
2052 * TODO: Only load / unload arrays if we have to.
2054 static inline void unloadVertexData(IWineD3DStateBlockImpl *stateblock) {
2055 int texture_idx;
2057 glDisableClientState(GL_VERTEX_ARRAY);
2058 glDisableClientState(GL_NORMAL_ARRAY);
2059 glDisableClientState(GL_COLOR_ARRAY);
2060 if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
2061 glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
2063 for (texture_idx = 0; texture_idx < GL_LIMITS(textures); ++texture_idx) {
2064 GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + texture_idx));
2065 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2069 /* This should match any arrays loaded in loadNumberedArrays
2070 * TODO: Only load / unload arrays if we have to.
2072 static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock) {
2073 /* disable any attribs (this is the same for both GLSL and ARB modes) */
2074 GLint maxAttribs;
2075 int i;
2077 /* Leave all the attribs disabled */
2078 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &maxAttribs);
2079 /* MESA does not support it right not */
2080 if (glGetError() != GL_NO_ERROR)
2081 maxAttribs = 16;
2082 for (i = 0; i < maxAttribs; ++i) {
2083 GL_EXTCALL(glDisableVertexAttribArrayARB(i));
2084 checkGLcall("glDisableVertexAttribArrayARB(reg);");
2088 static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, WineDirect3DVertexStridedData *strided) {
2089 GLint curVBO = GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT) ? -1 : 0;
2090 int i;
2092 for (i = 0; i < MAX_ATTRIBS; i++) {
2094 if (!strided->u.input[i].lpData && !strided->u.input[i].VBO)
2095 continue;
2097 TRACE_(d3d_shader)("Loading array %u [VBO=%u]\n", i, strided->u.input[i].VBO);
2099 if(curVBO != strided->u.input[i].VBO) {
2100 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, strided->u.input[i].VBO));
2101 checkGLcall("glBindBufferARB");
2102 curVBO = strided->u.input[i].VBO;
2104 GL_EXTCALL(glVertexAttribPointerARB(i,
2105 WINED3D_ATR_SIZE(strided->u.input[i].dwType),
2106 WINED3D_ATR_GLTYPE(strided->u.input[i].dwType),
2107 WINED3D_ATR_NORMALIZED(strided->u.input[i].dwType),
2108 strided->u.input[i].dwStride,
2109 strided->u.input[i].lpData + stateblock->loadBaseVertexIndex * strided->u.input[i].dwStride));
2110 GL_EXTCALL(glEnableVertexAttribArrayARB(i));
2114 /* Used from 2 different functions, and too big to justify making it inlined */
2115 static void loadVertexData(IWineD3DStateBlockImpl *stateblock, WineDirect3DVertexStridedData *sd) {
2116 unsigned int textureNo = 0;
2117 unsigned int texture_idx = 0;
2118 GLint curVBO = GL_SUPPORT(ARB_VERTEX_BUFFER_OBJECT) ? -1 : 0;
2120 TRACE("Using fast vertex array code\n");
2121 /* Blend Data ---------------------------------------------- */
2122 if( (sd->u.s.blendWeights.lpData) || (sd->u.s.blendWeights.VBO) ||
2123 (sd->u.s.blendMatrixIndices.lpData) || (sd->u.s.blendMatrixIndices.VBO) ) {
2126 if (GL_SUPPORT(ARB_VERTEX_BLEND)) {
2128 #if 1
2129 glEnableClientState(GL_WEIGHT_ARRAY_ARB);
2130 checkGLcall("glEnableClientState(GL_WEIGHT_ARRAY_ARB)");
2131 #endif
2133 TRACE("Blend %d %p %d\n", WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType),
2134 sd->u.s.blendWeights.lpData + stateblock->loadBaseVertexIndex * sd->u.s.blendWeights.dwStride, sd->u.s.blendWeights.dwStride);
2135 /* FIXME("TODO\n");*/
2136 /* Note dwType == float3 or float4 == 2 or 3 */
2138 #if 0
2139 /* with this on, the normals appear to be being modified,
2140 but the vertices aren't being translated as they should be
2141 Maybe the world matrix aren't being setup properly? */
2142 glVertexBlendARB(WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType) + 1);
2143 #endif
2146 VTRACE(("glWeightPointerARB(%d, GL_FLOAT, %d, %p)\n",
2147 WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType) ,
2148 sd->u.s.blendWeights.dwStride,
2149 sd->u.s.blendWeights.lpData + stateblock->loadBaseVertexIndex * sd->u.s.blendWeights.dwStride));
2151 if(curVBO != sd->u.s.blendWeights.VBO) {
2152 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.blendWeights.VBO));
2153 checkGLcall("glBindBufferARB");
2154 curVBO = sd->u.s.blendWeights.VBO;
2157 GL_EXTCALL(glWeightPointerARB)(
2158 WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType),
2159 WINED3D_ATR_GLTYPE(sd->u.s.blendWeights.dwType),
2160 sd->u.s.blendWeights.dwStride,
2161 sd->u.s.blendWeights.lpData + stateblock->loadBaseVertexIndex * sd->u.s.blendWeights.dwStride);
2163 checkGLcall("glWeightPointerARB");
2165 if((sd->u.s.blendMatrixIndices.lpData) || (sd->u.s.blendMatrixIndices.VBO)){
2166 static BOOL showfixme = TRUE;
2167 if(showfixme){
2168 FIXME("blendMatrixIndices support\n");
2169 showfixme = FALSE;
2173 } else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) {
2174 /* FIXME("TODO\n");*/
2175 #if 0
2177 GL_EXTCALL(glVertexWeightPointerEXT)(
2178 WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType),
2179 WINED3D_ATR_GLTYPE(sd->u.s.blendWeights.dwType),
2180 sd->u.s.blendWeights.dwStride,
2181 sd->u.s.blendWeights.lpData + stateblock->loadBaseVertexIndex * sd->u.s.blendWeights.dwStride);
2182 checkGLcall("glVertexWeightPointerEXT(numBlends, ...)");
2183 glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT);
2184 checkGLcall("glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)");
2185 #endif
2187 } else {
2188 /* TODO: support blends in fixupVertices */
2189 FIXME("unsupported blending in openGl\n");
2191 } else {
2192 if (GL_SUPPORT(ARB_VERTEX_BLEND)) {
2193 #if 0 /* TODO: Vertex blending */
2194 glDisable(GL_VERTEX_BLEND_ARB);
2195 #endif
2196 TRACE("ARB_VERTEX_BLEND\n");
2197 } else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) {
2198 TRACE(" EXT_VERTEX_WEIGHTING\n");
2199 glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT);
2200 checkGLcall("glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)");
2205 #if 0 /* FOG ----------------------------------------------*/
2206 if (sd->u.s.fog.lpData || sd->u.s.fog.VBO) {
2207 /* TODO: fog*/
2208 if (GL_SUPPORT(EXT_FOG_COORD) {
2209 glEnableClientState(GL_FOG_COORDINATE_EXT);
2210 (GL_EXTCALL)(FogCoordPointerEXT)(
2211 WINED3D_ATR_GLTYPE(sd->u.s.fog.dwType),
2212 sd->u.s.fog.dwStride,
2213 sd->u.s.fog.lpData + stateblock->loadBaseVertexIndex * sd->u.s.fog.dwStride);
2214 } else {
2215 /* don't bother falling back to 'slow' as we don't support software FOG yet. */
2216 /* FIXME: fixme once */
2217 TRACE("Hardware support for FOG is not avaiable, FOG disabled.\n");
2219 } else {
2220 if (GL_SUPPRT(EXT_FOR_COORD) {
2221 /* make sure fog is disabled */
2222 glDisableClientState(GL_FOG_COORDINATE_EXT);
2225 #endif
2227 #if 0 /* tangents ----------------------------------------------*/
2228 if (sd->u.s.tangent.lpData || sd->u.s.tangent.VBO ||
2229 sd->u.s.binormal.lpData || sd->u.s.binormal.VBO) {
2230 /* TODO: tangents*/
2231 if (GL_SUPPORT(EXT_COORDINATE_FRAME) {
2232 if (sd->u.s.tangent.lpData || sd->u.s.tangent.VBO) {
2233 glEnable(GL_TANGENT_ARRAY_EXT);
2234 (GL_EXTCALL)(TangentPointerEXT)(
2235 WINED3D_ATR_GLTYPE(sd->u.s.tangent.dwType),
2236 sd->u.s.tangent.dwStride,
2237 sd->u.s.tangent.lpData + stateblock->loadBaseVertexIndex * sd->u.s.tangent.dwStride);
2238 } else {
2239 glDisable(GL_TANGENT_ARRAY_EXT);
2241 if (sd->u.s.binormal.lpData || sd->u.s.binormal.VBO) {
2242 glEnable(GL_BINORMAL_ARRAY_EXT);
2243 (GL_EXTCALL)(BinormalPointerEXT)(
2244 WINED3D_ATR_GLTYPE(sd->u.s.binormal.dwType),
2245 sd->u.s.binormal.dwStride,
2246 sd->u.s.binormal.lpData + stateblock->loadBaseVertexIndex * sd->u.s.binormal.dwStride);
2247 } else{
2248 glDisable(GL_BINORMAL_ARRAY_EXT);
2251 } else {
2252 /* don't bother falling back to 'slow' as we don't support software tangents and binormals yet . */
2253 /* FIXME: fixme once */
2254 TRACE("Hardware support for tangents and binormals is not avaiable, tangents and binormals disabled.\n");
2256 } else {
2257 if (GL_SUPPORT(EXT_COORDINATE_FRAME) {
2258 /* make sure fog is disabled */
2259 glDisable(GL_TANGENT_ARRAY_EXT);
2260 glDisable(GL_BINORMAL_ARRAY_EXT);
2263 #endif
2265 /* Point Size ----------------------------------------------*/
2266 if (sd->u.s.pSize.lpData || sd->u.s.pSize.VBO) {
2268 /* no such functionality in the fixed function GL pipeline */
2269 TRACE("Cannot change ptSize here in openGl\n");
2270 /* TODO: Implement this function in using shaders if they are available */
2274 /* Vertex Pointers -----------------------------------------*/
2275 if (sd->u.s.position.lpData != NULL || sd->u.s.position.VBO != 0) {
2276 /* Note dwType == float3 or float4 == 2 or 3 */
2277 VTRACE(("glVertexPointer(%d, GL_FLOAT, %d, %p)\n",
2278 sd->u.s.position.dwStride,
2279 sd->u.s.position.dwType + 1,
2280 sd->u.s.position.lpData));
2282 if(curVBO != sd->u.s.position.VBO) {
2283 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.position.VBO));
2284 checkGLcall("glBindBufferARB");
2285 curVBO = sd->u.s.position.VBO;
2288 /* min(WINED3D_ATR_SIZE(position),3) to Disable RHW mode as 'w' coord
2289 handling for rhw mode should not impact screen position whereas in GL it does.
2290 This may result in very slightly distored textures in rhw mode, but
2291 a very minimal different. There's always the other option of
2292 fixing the view matrix to prevent w from having any effect
2294 This only applies to user pointer sources, in VBOs the vertices are fixed up
2296 if(sd->u.s.position.VBO == 0) {
2297 glVertexPointer(3 /* min(WINED3D_ATR_SIZE(sd->u.s.position.dwType),3) */,
2298 WINED3D_ATR_GLTYPE(sd->u.s.position.dwType),
2299 sd->u.s.position.dwStride, sd->u.s.position.lpData + stateblock->loadBaseVertexIndex * sd->u.s.position.dwStride);
2300 } else {
2301 glVertexPointer(
2302 WINED3D_ATR_SIZE(sd->u.s.position.dwType),
2303 WINED3D_ATR_GLTYPE(sd->u.s.position.dwType),
2304 sd->u.s.position.dwStride, sd->u.s.position.lpData + stateblock->loadBaseVertexIndex * sd->u.s.position.dwStride);
2306 checkGLcall("glVertexPointer(...)");
2307 glEnableClientState(GL_VERTEX_ARRAY);
2308 checkGLcall("glEnableClientState(GL_VERTEX_ARRAY)");
2310 } else {
2311 glDisableClientState(GL_VERTEX_ARRAY);
2312 checkGLcall("glDisableClientState(GL_VERTEX_ARRAY)");
2315 /* Normals -------------------------------------------------*/
2316 if (sd->u.s.normal.lpData || sd->u.s.normal.VBO) {
2317 /* Note dwType == float3 or float4 == 2 or 3 */
2318 VTRACE(("glNormalPointer(GL_FLOAT, %d, %p)\n",
2319 sd->u.s.normal.dwStride,
2320 sd->u.s.normal.lpData));
2321 if(curVBO != sd->u.s.normal.VBO) {
2322 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.normal.VBO));
2323 checkGLcall("glBindBufferARB");
2324 curVBO = sd->u.s.normal.VBO;
2326 glNormalPointer(
2327 WINED3D_ATR_GLTYPE(sd->u.s.normal.dwType),
2328 sd->u.s.normal.dwStride,
2329 sd->u.s.normal.lpData + stateblock->loadBaseVertexIndex * sd->u.s.normal.dwStride);
2330 checkGLcall("glNormalPointer(...)");
2331 glEnableClientState(GL_NORMAL_ARRAY);
2332 checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)");
2334 } else {
2335 glDisableClientState(GL_NORMAL_ARRAY);
2336 checkGLcall("glDisableClientState(GL_NORMAL_ARRAY)");
2337 glNormal3f(0, 0, 1);
2338 checkGLcall("glNormal3f(0, 0, 1)");
2341 /* Diffuse Colour --------------------------------------------*/
2342 /* WARNING: Data here MUST be in RGBA format, so cannot */
2343 /* go directly into fast mode from app pgm, because */
2344 /* directx requires data in BGRA format. */
2345 /* currently fixupVertices swizels the format, but this isn't */
2346 /* very practical when using VBOS */
2347 /* NOTE: Unless we write a vertex shader to swizel the colour */
2348 /* , or the user doesn't care and wants the speed advantage */
2350 if (sd->u.s.diffuse.lpData || sd->u.s.diffuse.VBO) {
2351 /* Note dwType == float3 or float4 == 2 or 3 */
2352 VTRACE(("glColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n",
2353 sd->u.s.diffuse.dwStride,
2354 sd->u.s.diffuse.lpData));
2356 if(curVBO != sd->u.s.diffuse.VBO) {
2357 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.diffuse.VBO));
2358 checkGLcall("glBindBufferARB");
2359 curVBO = sd->u.s.diffuse.VBO;
2361 glColorPointer(4, GL_UNSIGNED_BYTE,
2362 sd->u.s.diffuse.dwStride,
2363 sd->u.s.diffuse.lpData + stateblock->loadBaseVertexIndex * sd->u.s.diffuse.dwStride);
2364 checkGLcall("glColorPointer(4, GL_UNSIGNED_BYTE, ...)");
2365 glEnableClientState(GL_COLOR_ARRAY);
2366 checkGLcall("glEnableClientState(GL_COLOR_ARRAY)");
2368 } else {
2369 glDisableClientState(GL_COLOR_ARRAY);
2370 checkGLcall("glDisableClientState(GL_COLOR_ARRAY)");
2371 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
2372 checkGLcall("glColor4f(1, 1, 1, 1)");
2375 /* Specular Colour ------------------------------------------*/
2376 if (sd->u.s.specular.lpData || sd->u.s.specular.VBO) {
2377 TRACE("setting specular colour\n");
2378 /* Note dwType == float3 or float4 == 2 or 3 */
2379 VTRACE(("glSecondaryColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n",
2380 sd->u.s.specular.dwStride,
2381 sd->u.s.specular.lpData));
2382 if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
2383 if(curVBO != sd->u.s.specular.VBO) {
2384 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.specular.VBO));
2385 checkGLcall("glBindBufferARB");
2386 curVBO = sd->u.s.specular.VBO;
2388 GL_EXTCALL(glSecondaryColorPointerEXT)(4, GL_UNSIGNED_BYTE,
2389 sd->u.s.specular.dwStride,
2390 sd->u.s.specular.lpData + stateblock->loadBaseVertexIndex * sd->u.s.specular.dwStride);
2391 vcheckGLcall("glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, ...)");
2392 glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
2393 vcheckGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
2394 } else {
2396 /* Missing specular color is not critical, no warnings */
2397 VTRACE(("Specular colour is not supported in this GL implementation\n"));
2400 } else {
2401 if (GL_SUPPORT(EXT_SECONDARY_COLOR)) {
2403 glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
2404 checkGLcall("glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
2405 GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
2406 checkGLcall("glSecondaryColor3fEXT(0, 0, 0)");
2407 } else {
2409 /* Missing specular color is not critical, no warnings */
2410 VTRACE(("Specular colour is not supported in this GL implementation\n"));
2414 /* Texture coords -------------------------------------------*/
2416 for (textureNo = 0, texture_idx = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
2417 /* The code below uses glClientActiveTexture and glMultiTexCoord* which are all part of the GL_ARB_multitexture extension. */
2418 /* Abort if we don't support the extension. */
2419 if (!GL_SUPPORT(ARB_MULTITEXTURE)) {
2420 FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
2421 continue;
2424 if (/*!GL_SUPPORT(NV_REGISTER_COMBINERS) || stateblock->textures[textureNo]*/ TRUE) {
2425 /* Select the correct texture stage */
2426 GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + texture_idx));
2429 if (stateblock->textures[textureNo] != NULL) {
2430 int coordIdx = stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];
2432 if (coordIdx >= MAX_TEXTURES) {
2433 VTRACE(("tex: %d - Skip tex coords, as being system generated\n", textureNo));
2434 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2435 GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + texture_idx, 0, 0, 0, 1));
2437 } else if (sd->u.s.texCoords[coordIdx].lpData == NULL && sd->u.s.texCoords[coordIdx].VBO == 0) {
2438 VTRACE(("Bound texture but no texture coordinates supplied, so skipping\n"));
2439 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2440 GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + texture_idx, 0, 0, 0, 1));
2442 } else {
2443 TRACE("Setting up texture %u, idx %d, cordindx %u, data %p\n",
2444 textureNo, texture_idx, coordIdx, sd->u.s.texCoords[coordIdx].lpData);
2445 if(curVBO != sd->u.s.texCoords[coordIdx].VBO) {
2446 GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.texCoords[coordIdx].VBO));
2447 checkGLcall("glBindBufferARB");
2448 curVBO = sd->u.s.texCoords[coordIdx].VBO;
2450 /* The coords to supply depend completely on the fvf / vertex shader */
2451 glTexCoordPointer(
2452 WINED3D_ATR_SIZE(sd->u.s.texCoords[coordIdx].dwType),
2453 WINED3D_ATR_GLTYPE(sd->u.s.texCoords[coordIdx].dwType),
2454 sd->u.s.texCoords[coordIdx].dwStride,
2455 sd->u.s.texCoords[coordIdx].lpData + stateblock->loadBaseVertexIndex * sd->u.s.texCoords[coordIdx].dwStride);
2456 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
2458 } else if (!GL_SUPPORT(NV_REGISTER_COMBINERS)) {
2459 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2460 GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0, 0, 0, 1));
2462 if (/*!GL_SUPPORT(NV_REGISTER_COMBINERS) || stateblock->textures[textureNo]*/ TRUE) ++texture_idx;
2464 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
2465 for (textureNo = texture_idx; textureNo < GL_LIMITS(textures); ++textureNo) {
2466 GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + textureNo));
2467 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
2468 GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0, 0, 0, 1));
2473 inline void drawPrimitiveTraceDataLocations(
2474 WineDirect3DVertexStridedData *dataLocations) {
2476 /* Dump out what parts we have supplied */
2477 TRACE("Strided Data:\n");
2478 TRACE_STRIDED((dataLocations), position);
2479 TRACE_STRIDED((dataLocations), blendWeights);
2480 TRACE_STRIDED((dataLocations), blendMatrixIndices);
2481 TRACE_STRIDED((dataLocations), normal);
2482 TRACE_STRIDED((dataLocations), pSize);
2483 TRACE_STRIDED((dataLocations), diffuse);
2484 TRACE_STRIDED((dataLocations), specular);
2485 TRACE_STRIDED((dataLocations), texCoords[0]);
2486 TRACE_STRIDED((dataLocations), texCoords[1]);
2487 TRACE_STRIDED((dataLocations), texCoords[2]);
2488 TRACE_STRIDED((dataLocations), texCoords[3]);
2489 TRACE_STRIDED((dataLocations), texCoords[4]);
2490 TRACE_STRIDED((dataLocations), texCoords[5]);
2491 TRACE_STRIDED((dataLocations), texCoords[6]);
2492 TRACE_STRIDED((dataLocations), texCoords[7]);
2493 TRACE_STRIDED((dataLocations), position2);
2494 TRACE_STRIDED((dataLocations), normal2);
2495 TRACE_STRIDED((dataLocations), tangent);
2496 TRACE_STRIDED((dataLocations), binormal);
2497 TRACE_STRIDED((dataLocations), tessFactor);
2498 TRACE_STRIDED((dataLocations), fog);
2499 TRACE_STRIDED((dataLocations), depth);
2500 TRACE_STRIDED((dataLocations), sample);
2502 return;
2505 /* Helper for vertexdeclaration() */
2506 static inline void handleStreams(IWineD3DStateBlockImpl *stateblock, BOOL useVertexShaderFunction) {
2507 IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
2508 BOOL fixup = FALSE;
2509 WineDirect3DVertexStridedData *dataLocations = &device->strided_streams;
2511 if(device->up_strided) {
2512 /* Note: this is a ddraw fixed-function code path */
2513 TRACE("================ Strided Input ===================\n");
2514 memcpy(dataLocations, device->up_strided, sizeof(*dataLocations));
2516 if(TRACE_ON(d3d)) {
2517 drawPrimitiveTraceDataLocations(dataLocations);
2519 } else if (stateblock->vertexDecl || stateblock->vertexShader) {
2520 /* Note: This is a fixed function or shader codepath.
2521 * This means it must handle both types of strided data.
2522 * Shaders must go through here to zero the strided data, even if they
2523 * don't set any declaration at all
2525 TRACE("================ Vertex Declaration ===================\n");
2526 memset(dataLocations, 0, sizeof(*dataLocations));
2528 if (stateblock->vertexDecl != NULL ||
2529 ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->vertexDeclaration != NULL) {
2531 primitiveDeclarationConvertToStridedData((IWineD3DDevice *) device, useVertexShaderFunction,
2532 dataLocations, &fixup);
2534 } else {
2535 /* Note: This codepath is not reachable from d3d9 (see fvf->decl9 conversion)
2536 * It is reachable through d3d8, but only for fixed-function.
2537 * It will not work properly for shaders.
2539 TRACE("================ FVF ===================\n");
2540 memset(dataLocations, 0, sizeof(*dataLocations));
2541 primitiveConvertToStridedData((IWineD3DDevice *) device, dataLocations,
2542 &fixup);
2543 if(TRACE_ON(d3d)) {
2544 drawPrimitiveTraceDataLocations(dataLocations);
2548 /* Unload the old arrays before loading the new ones to get old junk out */
2549 if(device->numberedArraysLoaded) {
2550 unloadNumberedArrays(stateblock);
2551 device->numberedArraysLoaded = FALSE;
2553 if(device->namedArraysLoaded) {
2554 unloadVertexData(stateblock);
2555 device->namedArraysLoaded = FALSE;
2558 if(useVertexShaderFunction) {
2559 TRACE("Loading numbered arrays\n");
2560 loadNumberedArrays(stateblock, dataLocations);
2561 device->useDrawStridedSlow = FALSE;
2562 device->numberedArraysLoaded = TRUE;
2563 } else if (fixup ||
2564 (dataLocations->u.s.pSize.lpData == NULL &&
2565 dataLocations->u.s.diffuse.lpData == NULL &&
2566 dataLocations->u.s.specular.lpData == NULL)) {
2567 /* Load the vertex data using named arrays */
2568 TRACE("Loading vertex data\n");
2569 loadVertexData(stateblock, dataLocations);
2570 device->useDrawStridedSlow = FALSE;
2571 device->namedArraysLoaded = TRUE;
2572 } else {
2573 TRACE("Not loading vertex data\n");
2574 device->useDrawStridedSlow = TRUE;
2577 /* Generate some fixme's if unsupported functionality is being used */
2578 #define BUFFER_OR_DATA(_attribute) dataLocations->u.s._attribute.lpData
2579 /* TODO: Either support missing functionality in fixupVertices or by creating a shader to replace the pipeline. */
2580 if (!useVertexShaderFunction && (BUFFER_OR_DATA(blendMatrixIndices) || BUFFER_OR_DATA(blendWeights))) {
2581 FIXME("Blending data is only valid with vertex shaders %p %p\n",dataLocations->u.s.blendWeights.lpData,dataLocations->u.s.blendWeights.lpData);
2583 if (!useVertexShaderFunction && (BUFFER_OR_DATA(position2) || BUFFER_OR_DATA(normal2))) {
2584 FIXME("Tweening is only valid with vertex shaders\n");
2586 if (!useVertexShaderFunction && (BUFFER_OR_DATA(tangent) || BUFFER_OR_DATA(binormal))) {
2587 FIXME("Tangent and binormal bump mapping is only valid with vertex shaders\n");
2589 if (!useVertexShaderFunction && (BUFFER_OR_DATA(tessFactor) || BUFFER_OR_DATA(fog) || BUFFER_OR_DATA(depth) || BUFFER_OR_DATA(sample))) {
2590 FIXME("Extended attributes are only valid with vertex shaders\n");
2592 #undef BUFFER_OR_DATA
2595 static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock) {
2596 BOOL useVertexShaderFunction = FALSE, updateFog = FALSE;
2597 BOOL transformed;
2598 /* Some stuff is in the device until we have per context tracking */
2599 IWineD3DDeviceImpl *device = stateblock->wineD3DDevice;
2600 BOOL wasrhw = device->last_was_rhw;
2602 /* Shaders can be implemented using ARB_PROGRAM, GLSL, or software -
2603 * here simply check whether a shader was set, or the user disabled shaders
2605 if (device->vs_selected_mode != SHADER_NONE && stateblock->vertexShader &&
2606 ((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->baseShader.function != NULL) {
2607 useVertexShaderFunction = TRUE;
2609 if(((IWineD3DVertexShaderImpl *)stateblock->vertexShader)->usesFog != device->last_was_foggy_shader) {
2610 updateFog = TRUE;
2612 } else if(device->last_was_foggy_shader) {
2613 updateFog = TRUE;
2616 handleStreams(stateblock, useVertexShaderFunction);
2618 /* Do I have to use ? TRUE : FALSE ? Or can I rely on 15==15 beeing equal to TRUE(=1)? */
2619 transformed = ((device->strided_streams.u.s.position.lpData != NULL ||
2620 device->strided_streams.u.s.position.VBO != 0) &&
2621 device->strided_streams.u.s.position_transformed) ? TRUE : FALSE;
2623 if(transformed != device->last_was_rhw && !useVertexShaderFunction) {
2624 updateFog = TRUE;
2627 /* Reapply lighting if it is not sheduled for reapplication already */
2628 if(!isStateDirty(device, STATE_RENDER(WINED3DRS_LIGHTING))) {
2629 state_lighting(STATE_RENDER(WINED3DRS_LIGHTING), stateblock);
2632 if (!useVertexShaderFunction && transformed) {
2633 stateblock->wineD3DDevice->last_was_rhw = TRUE;
2634 } else {
2636 /* Untransformed, so relies on the view and projection matrices */
2637 device->last_was_rhw = FALSE;
2638 /* This turns off the Z scale trick to 'disable' viewport frustum clipping in rhw mode*/
2639 device->untransformed = TRUE;
2641 /* Todo for sw shaders: Vertex Shader output is already transformed, so set up identity matrices
2642 * Not needed as long as only hw shaders are supported
2645 /* This sets the shader output position correction constants.
2646 * TODO: Move to the viewport state
2648 if (useVertexShaderFunction) {
2649 device->posFixup[1] = device->render_offscreen ? -1.0 : 1.0;
2653 /* Don't have to apply the matrices when vertex shaders are used. When vshaders are turned
2654 * off this function will be called again anyway to make sure they're properly set
2656 if(!useVertexShaderFunction) {
2657 /* TODO: Move this mainly to the viewport state and only apply when the vp has changed
2658 * or transformed / untransformed was switched
2660 if(wasrhw != device->last_was_rhw &&
2661 !isStateDirty(stateblock->wineD3DDevice, STATE_TRANSFORM(WINED3DTS_PROJECTION)) &&
2662 !isStateDirty(stateblock->wineD3DDevice, STATE_VIEWPORT)) {
2663 transform_projection(STATE_TRANSFORM(WINED3DTS_PROJECTION), stateblock);
2665 /* World matrix needs reapplication here only if we're switching between rhw and non-rhw
2666 * mode.
2668 * If a vertex shader is used, the world matrix changed and then vertex shader unbound
2669 * this check will fail and the matrix not applied again. This is OK because a simple
2670 * world matrix change reapplies the matrix - These checks here are only to satisfy the
2671 * needs of the vertex declaration.
2673 * World and view matrix go into the same gl matrix, so only apply them when neither is
2674 * dirty
2676 if(transformed != wasrhw &&
2677 !isStateDirty(stateblock->wineD3DDevice, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0))) &&
2678 !isStateDirty(stateblock->wineD3DDevice, STATE_TRANSFORM(WINED3DTS_VIEW))) {
2679 transform_world(STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), stateblock);
2681 } else {
2682 /* We compile the shader here because we need the vertex declaration
2683 * in order to determine if we need to do any swizzling for D3DCOLOR
2684 * registers. If the shader is already compiled this call will do nothing. */
2685 IWineD3DVertexShader_CompileShader(stateblock->vertexShader);
2688 if(useVertexShaderFunction || device->last_was_vshader) {
2689 BOOL usePixelShaderFunction = device->ps_selected_mode != SHADER_NONE &&
2690 stateblock->pixelShader &&
2691 ((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.function;
2693 /* Vertex and pixel shaders are applied together for now, so let the last dirty state do the
2694 * application
2696 if(!isStateDirty(device, STATE_PIXELSHADER)) {
2697 device->shader_backend->shader_select((IWineD3DDevice *) device, usePixelShaderFunction, useVertexShaderFunction);
2699 if(!isStateDirty(stateblock->wineD3DDevice, STATE_VERTEXSHADERCONSTANT) && (useVertexShaderFunction || usePixelShaderFunction)) {
2700 shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock);
2703 device->last_was_vshader = useVertexShaderFunction;
2706 if(updateFog) {
2707 state_fog(STATE_RENDER(WINED3DRS_FOGENABLE), stateblock);
2711 static void viewport(DWORD state, IWineD3DStateBlockImpl *stateblock) {
2712 glDepthRange(stateblock->viewport.MinZ, stateblock->viewport.MaxZ);
2713 checkGLcall("glDepthRange");
2714 /* Note: GL requires lower left, DirectX supplies upper left */
2715 /* TODO: replace usage of renderTarget with context management */
2716 glViewport(stateblock->viewport.X,
2717 (((IWineD3DSurfaceImpl *)stateblock->wineD3DDevice->render_targets[0])->currentDesc.Height - (stateblock->viewport.Y + stateblock->viewport.Height)),
2718 stateblock->viewport.Width, stateblock->viewport.Height);
2720 checkGLcall("glViewport");
2722 stateblock->wineD3DDevice->posFixup[2] = 0.9 / stateblock->viewport.Width;
2723 stateblock->wineD3DDevice->posFixup[3] = -0.9 / stateblock->viewport.Height;
2724 if(!isStateDirty(stateblock->wineD3DDevice, STATE_TRANSFORM(D3DTS_PROJECTION))) {
2725 transform_projection(STATE_TRANSFORM(D3DTS_PROJECTION), stateblock);
2730 const struct StateEntry StateTable[] =
2732 /* State name representative, apply function */
2733 { /* 0, Undefined */ 0, state_undefined },
2734 { /* 1, WINED3DRS_TEXTUREHANDLE */ 0 /* Handled in ddraw */, state_undefined },
2735 { /* 2, WINED3DRS_ANTIALIAS */ STATE_RENDER(WINED3DRS_ANTIALIAS), state_antialias },
2736 { /* 3, WINED3DRS_TEXTUREADDRESS */ 0 /* Handled in ddraw */, state_undefined },
2737 { /* 4, WINED3DRS_TEXTUREPERSPECTIVE */ STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), state_perspective },
2738 { /* 5, WINED3DRS_WRAPU */ STATE_RENDER(WINED3DRS_WRAPU), state_wrapu },
2739 { /* 6, WINED3DRS_WRAPV */ STATE_RENDER(WINED3DRS_WRAPV), state_wrapv },
2740 { /* 7, WINED3DRS_ZENABLE */ STATE_RENDER(WINED3DRS_ZENABLE), state_zenable },
2741 { /* 8, WINED3DRS_FILLMODE */ STATE_RENDER(WINED3DRS_FILLMODE), state_fillmode },
2742 { /* 9, WINED3DRS_SHADEMODE */ STATE_RENDER(WINED3DRS_SHADEMODE), state_shademode },
2743 { /* 10, WINED3DRS_LINEPATTERN */ STATE_RENDER(WINED3DRS_LINEPATTERN), state_linepattern },
2744 { /* 11, WINED3DRS_MONOENABLE */ STATE_RENDER(WINED3DRS_MONOENABLE), state_monoenable },
2745 { /* 12, WINED3DRS_ROP2 */ STATE_RENDER(WINED3DRS_ROP2), state_rop2 },
2746 { /* 13, WINED3DRS_PLANEMASK */ STATE_RENDER(WINED3DRS_PLANEMASK), state_planemask },
2747 { /* 14, WINED3DRS_ZWRITEENABLE */ STATE_RENDER(WINED3DRS_ZWRITEENABLE), state_zwritenable },
2748 { /* 15, WINED3DRS_ALPHATESTENABLE */ STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha },
2749 { /* 16, WINED3DRS_LASTPIXEL */ STATE_RENDER(WINED3DRS_LASTPIXEL), state_lastpixel },
2750 { /* 17, WINED3DRS_TEXTUREMAG */ 0 /* Handled in ddraw */, state_undefined },
2751 { /* 18, WINED3DRS_TEXTUREMIN */ 0 /* Handled in ddraw */, state_undefined },
2752 { /* 19, WINED3DRS_SRCBLEND */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
2753 { /* 20, WINED3DRS_DESTBLEND */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
2754 { /* 21, WINED3DRS_TEXTUREMAPBLEND */ 0 /* Handled in ddraw */, state_undefined },
2755 { /* 22, WINED3DRS_CULLMODE */ STATE_RENDER(WINED3DRS_CULLMODE), state_cullmode },
2756 { /* 23, WINED3DRS_ZFUNC */ STATE_RENDER(WINED3DRS_ZFUNC), state_zfunc },
2757 { /* 24, WINED3DRS_ALPHAREF */ STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha },
2758 { /* 25, WINED3DRS_ALPHAFUNC */ STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha },
2759 { /* 26, WINED3DRS_DITHERENABLE */ STATE_RENDER(WINED3DRS_DITHERENABLE), state_ditherenable },
2760 { /* 27, WINED3DRS_ALPHABLENDENABLE */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
2761 { /* 28, WINED3DRS_FOGENABLE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
2762 { /* 29, WINED3DRS_SPECULARENABLE */ STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable},
2763 { /* 30, WINED3DRS_ZVISIBLE */ 0 /* Not supported according to the msdn */, state_nogl },
2764 { /* 31, WINED3DRS_SUBPIXEL */ STATE_RENDER(WINED3DRS_SUBPIXEL), state_subpixel },
2765 { /* 32, WINED3DRS_SUBPIXELX */ STATE_RENDER(WINED3DRS_SUBPIXELX), state_subpixelx },
2766 { /* 33, WINED3DRS_STIPPLEDALPHA */ STATE_RENDER(WINED3DRS_STIPPLEDALPHA), state_stippledalpha },
2767 { /* 34, WINED3DRS_FOGCOLOR */ STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor },
2768 { /* 35, WINED3DRS_FOGTABLEMODE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
2769 { /* 36, WINED3DRS_FOGSTART */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
2770 { /* 37, WINED3DRS_FOGEND */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
2771 { /* 38, WINED3DRS_FOGDENSITY */ STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity },
2772 { /* 39, WINED3DRS_STIPPLEENABLE */ STATE_RENDER(WINED3DRS_STIPPLEENABLE), state_stippleenable },
2773 { /* 40, WINED3DRS_EDGEANTIALIAS */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
2774 { /* 41, WINED3DRS_COLORKEYENABLE */ STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha },
2775 { /* 42, undefined */ 0, state_undefined },
2776 { /* 43, WINED3DRS_BORDERCOLOR */ STATE_RENDER(WINED3DRS_BORDERCOLOR), state_bordercolor },
2777 { /* 44, WINED3DRS_TEXTUREADDRESSU */ 0, /* Handled in ddraw */ state_undefined },
2778 { /* 45, WINED3DRS_TEXTUREADDRESSV */ 0, /* Handled in ddraw */ state_undefined },
2779 { /* 46, WINED3DRS_MIPMAPLODBIAS */ STATE_RENDER(WINED3DRS_MIPMAPLODBIAS), state_mipmaplodbias },
2780 { /* 47, WINED3DRS_ZBIAS */ STATE_RENDER(WINED3DRS_ZBIAS), state_zbias },
2781 { /* 48, WINED3DRS_RANGEFOGENABLE */ 0, state_nogl },
2782 { /* 49, WINED3DRS_ANISOTROPY */ STATE_RENDER(WINED3DRS_ANISOTROPY), state_anisotropy },
2783 { /* 50, WINED3DRS_FLUSHBATCH */ STATE_RENDER(WINED3DRS_FLUSHBATCH), state_flushbatch },
2784 { /* 51, WINED3DRS_TRANSLUCENTSORTINDEPENDENT */ STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), state_translucentsi },
2785 { /* 52, WINED3DRS_STENCILENABLE */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2786 { /* 53, WINED3DRS_STENCILFAIL */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2787 { /* 54, WINED3DRS_STENCILZFAIL */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2788 { /* 55, WINED3DRS_STENCILPASS */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2789 { /* 56, WINED3DRS_STENCILFUNC */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2790 { /* 57, WINED3DRS_STENCILREF */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2791 { /* 58, WINED3DRS_STENCILMASK */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2792 { /* 59, WINED3DRS_STENCILWRITEMASK */ STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite },
2793 { /* 60, WINED3DRS_TEXTUREFACTOR */ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor },
2794 { /* 61, Undefined */ 0, state_undefined },
2795 { /* 62, Undefined */ 0, state_undefined },
2796 { /* 63, Undefined */ 0, state_undefined },
2797 { /* 64, WINED3DRS_STIPPLEPATTERN00 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2798 { /* 65, WINED3DRS_STIPPLEPATTERN01 */ 0 /* Obsolete, should he handled by ddraw */, state_undefined },
2799 { /* 66, WINED3DRS_STIPPLEPATTERN02 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2800 { /* 67, WINED3DRS_STIPPLEPATTERN03 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2801 { /* 68, WINED3DRS_STIPPLEPATTERN04 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2802 { /* 69, WINED3DRS_STIPPLEPATTERN05 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2803 { /* 70, WINED3DRS_STIPPLEPATTERN06 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2804 { /* 71, WINED3DRS_STIPPLEPATTERN07 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2805 { /* 72, WINED3DRS_STIPPLEPATTERN08 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2806 { /* 73, WINED3DRS_STIPPLEPATTERN09 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2807 { /* 74, WINED3DRS_STIPPLEPATTERN10 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2808 { /* 75, WINED3DRS_STIPPLEPATTERN11 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2809 { /* 76, WINED3DRS_STIPPLEPATTERN12 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2810 { /* 77, WINED3DRS_STIPPLEPATTERN13 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2811 { /* 78, WINED3DRS_STIPPLEPATTERN14 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2812 { /* 79, WINED3DRS_STIPPLEPATTERN15 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2813 { /* 80, WINED3DRS_STIPPLEPATTERN16 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2814 { /* 81, WINED3DRS_STIPPLEPATTERN17 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2815 { /* 82, WINED3DRS_STIPPLEPATTERN18 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2816 { /* 83, WINED3DRS_STIPPLEPATTERN19 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2817 { /* 84, WINED3DRS_STIPPLEPATTERN20 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2818 { /* 85, WINED3DRS_STIPPLEPATTERN21 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2819 { /* 86, WINED3DRS_STIPPLEPATTERN22 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2820 { /* 87, WINED3DRS_STIPPLEPATTERN23 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2821 { /* 88, WINED3DRS_STIPPLEPATTERN24 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2822 { /* 89, WINED3DRS_STIPPLEPATTERN25 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2823 { /* 90, WINED3DRS_STIPPLEPATTERN26 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2824 { /* 91, WINED3DRS_STIPPLEPATTERN27 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2825 { /* 92, WINED3DRS_STIPPLEPATTERN28 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2826 { /* 93, WINED3DRS_STIPPLEPATTERN29 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2827 { /* 94, WINED3DRS_STIPPLEPATTERN30 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2828 { /* 95, WINED3DRS_STIPPLEPATTERN31 */ 0 /* Obsolete, should be handled by ddraw */, state_undefined },
2829 { /* 96, Undefined */ 0, state_undefined },
2830 { /* 97, Undefined */ 0, state_undefined },
2831 { /* 98, Undefined */ 0, state_undefined },
2832 { /* 99, Undefined */ 0, state_undefined },
2833 { /*100, Undefined */ 0, state_undefined },
2834 { /*101, Undefined */ 0, state_undefined },
2835 { /*102, Undefined */ 0, state_undefined },
2836 { /*103, Undefined */ 0, state_undefined },
2837 { /*104, Undefined */ 0, state_undefined },
2838 { /*105, Undefined */ 0, state_undefined },
2839 { /*106, Undefined */ 0, state_undefined },
2840 { /*107, Undefined */ 0, state_undefined },
2841 { /*108, Undefined */ 0, state_undefined },
2842 { /*109, Undefined */ 0, state_undefined },
2843 { /*110, Undefined */ 0, state_undefined },
2844 { /*111, Undefined */ 0, state_undefined },
2845 { /*112, Undefined */ 0, state_undefined },
2846 { /*113, Undefined */ 0, state_undefined },
2847 { /*114, Undefined */ 0, state_undefined },
2848 { /*115, Undefined */ 0, state_undefined },
2849 { /*116, Undefined */ 0, state_undefined },
2850 { /*117, Undefined */ 0, state_undefined },
2851 { /*118, Undefined */ 0, state_undefined },
2852 { /*119, Undefined */ 0, state_undefined },
2853 { /*120, Undefined */ 0, state_undefined },
2854 { /*121, Undefined */ 0, state_undefined },
2855 { /*122, Undefined */ 0, state_undefined },
2856 { /*123, Undefined */ 0, state_undefined },
2857 { /*124, Undefined */ 0, state_undefined },
2858 { /*125, Undefined */ 0, state_undefined },
2859 { /*126, Undefined */ 0, state_undefined },
2860 { /*127, Undefined */ 0, state_undefined },
2861 /* Big hole ends */
2862 { /*128, WINED3DRS_WRAP0 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2863 { /*129, WINED3DRS_WRAP1 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2864 { /*130, WINED3DRS_WRAP2 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2865 { /*131, WINED3DRS_WRAP3 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2866 { /*132, WINED3DRS_WRAP4 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2867 { /*133, WINED3DRS_WRAP5 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2868 { /*134, WINED3DRS_WRAP6 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2869 { /*135, WINED3DRS_WRAP7 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2870 { /*136, WINED3DRS_CLIPPING */ STATE_RENDER(WINED3DRS_CLIPPING), state_clipping },
2871 { /*137, WINED3DRS_LIGHTING */ STATE_RENDER(WINED3DRS_LIGHTING), state_lighting },
2872 { /*138, WINED3DRS_EXTENTS */ STATE_RENDER(WINED3DRS_EXTENTS), state_extents },
2873 { /*139, WINED3DRS_AMBIENT */ STATE_RENDER(WINED3DRS_AMBIENT), state_ambient },
2874 { /*140, WINED3DRS_FOGVERTEXMODE */ STATE_RENDER(WINED3DRS_FOGENABLE), state_fog },
2875 { /*141, WINED3DRS_COLORVERTEX */ STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat },
2876 { /*142, WINED3DRS_LOCALVIEWER */ STATE_RENDER(WINED3DRS_LOCALVIEWER), state_localviewer },
2877 { /*143, WINED3DRS_NORMALIZENORMALS */ STATE_RENDER(WINED3DRS_NORMALIZENORMALS), state_normalize },
2878 { /*144, WINED3DRS_COLORKEYBLENDENABLE */ STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), state_ckeyblend },
2879 { /*145, WINED3DRS_DIFFUSEMATERIALSOURCE */ STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat },
2880 { /*146, WINED3DRS_SPECULARMATERIALSOURCE */ STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat },
2881 { /*147, WINED3DRS_AMBIENTMATERIALSOURCE */ STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat },
2882 { /*148, WINED3DRS_EMISSIVEMATERIALSOURCE */ STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat },
2883 { /*149, Undefined */ 0, state_undefined },
2884 { /*150, Undefined */ 0, state_undefined },
2885 { /*151, WINED3DRS_VERTEXBLEND */ 0, state_nogl },
2886 { /*152, WINED3DRS_CLIPPLANEENABLE */ STATE_RENDER(WINED3DRS_CLIPPING), state_clipping },
2887 { /*153, WINED3DRS_SOFTWAREVERTEXPROCESSING */ 0, state_nogl },
2888 { /*154, WINED3DRS_POINTSIZE */ STATE_RENDER(WINED3DRS_POINTSIZE), state_psize },
2889 { /*155, WINED3DRS_POINTSIZE_MIN */ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin },
2890 { /*156, WINED3DRS_POINTSPRITEENABLE */ STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite },
2891 { /*157, WINED3DRS_POINTSCALEENABLE */ STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale },
2892 { /*158, WINED3DRS_POINTSCALE_A */ STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale },
2893 { /*159, WINED3DRS_POINTSCALE_B */ STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale },
2894 { /*160, WINED3DRS_POINTSCALE_C */ STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale },
2895 { /*161, WINED3DRS_MULTISAMPLEANTIALIAS */ STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_multisampleaa },
2896 { /*162, WINED3DRS_MULTISAMPLEMASK */ STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), state_multisampmask },
2897 { /*163, WINED3DRS_PATCHEDGESTYLE */ STATE_RENDER(WINED3DRS_PATCHEDGESTYLE), state_patchedgestyle},
2898 { /*164, WINED3DRS_PATCHSEGMENTS */ STATE_RENDER(WINED3DRS_PATCHSEGMENTS), state_patchsegments },
2899 { /*165, WINED3DRS_DEBUGMONITORTOKEN */ STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), state_nogl },
2900 { /*166, WINED3DRS_POINTSIZE_MAX */ STATE_RENDER(WINED3DRS_POINTSIZE_MAX), state_psizemax },
2901 { /*167, WINED3DRS_INDEXEDVERTEXBLENDENABLE */ 0, state_nogl },
2902 { /*168, WINED3DRS_COLORWRITEENABLE */ STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite },
2903 { /*169, Undefined */ 0, state_undefined },
2904 { /*170, WINED3DRS_TWEENFACTOR */ 0, state_nogl },
2905 { /*171, WINED3DRS_BLENDOP */ STATE_RENDER(WINED3DRS_BLENDOP), state_blendop },
2906 { /*172, WINED3DRS_POSITIONDEGREE */ STATE_RENDER(WINED3DRS_POSITIONDEGREE), state_positiondegree},
2907 { /*173, WINED3DRS_NORMALDEGREE */ STATE_RENDER(WINED3DRS_NORMALDEGREE), state_normaldegree },
2908 /*172, WINED3DRS_POSITIONORDER */ /* Value assigned to 2 state names */
2909 /*173, WINED3DRS_NORMALORDER */ /* Value assigned to 2 state names */
2910 { /*174, WINED3DRS_SCISSORTESTENABLE */ STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_scissor },
2911 { /*175, WINED3DRS_SLOPESCALEDEPTHBIAS */ STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias },
2912 { /*176, WINED3DRS_ANTIALIASEDLINEENABLE */ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend },
2913 { /*177, undefined */ 0, state_undefined },
2914 { /*178, WINED3DRS_MINTESSELLATIONLEVEL */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2915 { /*179, WINED3DRS_MAXTESSELLATIONLEVEL */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2916 { /*180, WINED3DRS_ADAPTIVETESS_X */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2917 { /*181, WINED3DRS_ADAPTIVETESS_Y */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2918 { /*182, WINED3DRS_ADAPTIVETESS_Z */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2919 { /*183, WINED3DRS_ADAPTIVETESS_W */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2920 { /*184, WINED3DRS_ENABLEADAPTIVETESSELLATION */ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation },
2921 { /*185, WINED3DRS_TWOSIDEDSTENCILMODE */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2922 { /*186, WINED3DRS_CCW_STENCILFAIL */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2923 { /*187, WINED3DRS_CCW_STENCILZFAIL */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2924 { /*188, WINED3DRS_CCW_STENCILPASS */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2925 { /*189, WINED3DRS_CCW_STENCILFUNC */ STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil },
2926 { /*190, WINED3DRS_COLORWRITEENABLE1 */ STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite },
2927 { /*191, WINED3DRS_COLORWRITEENABLE2 */ STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite },
2928 { /*192, WINED3DRS_COLORWRITEENABLE3 */ STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite },
2929 { /*193, WINED3DRS_BLENDFACTOR */ STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor },
2930 { /*194, WINED3DRS_SRGBWRITEENABLE */ STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), state_srgbwrite },
2931 { /*195, WINED3DRS_DEPTHBIAS */ STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias },
2932 { /*196, undefined */ 0, state_undefined },
2933 { /*197, undefined */ 0, state_undefined },
2934 { /*198, WINED3DRS_WRAP8 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2935 { /*199, WINED3DRS_WRAP9 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2936 { /*200, WINED3DRS_WRAP10 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2937 { /*201, WINED3DRS_WRAP11 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2938 { /*202, WINED3DRS_WRAP12 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2939 { /*203, WINED3DRS_WRAP13 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2940 { /*204, WINED3DRS_WRAP14 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2941 { /*205, WINED3DRS_WRAP15 */ STATE_RENDER(WINED3DRS_WRAP0), state_wrap },
2942 { /*206, WINED3DRS_SEPARATEALPHABLENDENABLE */ STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), state_seperateblend },
2943 { /*207, WINED3DRS_SRCBLENDALPHA */ STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), state_seperateblend },
2944 { /*208, WINED3DRS_DESTBLENDALPHA */ STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), state_seperateblend },
2945 { /*209, WINED3DRS_BLENDOPALPHA */ STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), state_seperateblend },
2946 /* Texture stage states */
2947 { /*0, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2948 { /*0, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2949 { /*0, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2950 { /*0, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop },
2951 { /*0, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop },
2952 { /*0, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop },
2953 { /*0, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2954 { /*0, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2955 { /*0, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2956 { /*0, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2957 { /*0, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(0, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
2958 { /*0, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2959 { /*0, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2960 { /*0, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2961 { /*0, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2962 { /*0, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2963 { /*0, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2964 { /*0, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2965 { /*0, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2966 { /*0, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2967 { /*0, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2968 { /*0, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
2969 { /*0, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
2970 { /*0, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE0), transform_texture },
2971 { /*0, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2972 { /*0, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop },
2973 { /*0, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop },
2974 { /*0, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), tex_resultarg },
2975 { /*0, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2976 { /*0, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2977 { /*0, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2978 { /*0, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
2980 { /*1, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2981 { /*1, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2982 { /*1, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2983 { /*1, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop },
2984 { /*1, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop },
2985 { /*1, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop },
2986 { /*1, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2987 { /*1, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2988 { /*1, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2989 { /*1, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
2990 { /*1, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(1, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
2991 { /*1, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2992 { /*1, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2993 { /*1, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2994 { /*1, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2995 { /*1, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2996 { /*1, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2997 { /*1, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2998 { /*1, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
2999 { /*1, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3000 { /*1, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3001 { /*1, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3002 { /*1, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3003 { /*1, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE1), transform_texture },
3004 { /*1, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3005 { /*1, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop },
3006 { /*1, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop },
3007 { /*1, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), tex_resultarg },
3008 { /*1, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3009 { /*1, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3010 { /*1, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3011 { /*1, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3013 { /*2, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3014 { /*2, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3015 { /*2, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3016 { /*2, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop },
3017 { /*2, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop },
3018 { /*2, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop },
3019 { /*2, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3020 { /*2, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3021 { /*2, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3022 { /*2, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3023 { /*2, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(2, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
3024 { /*2, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3025 { /*2, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3026 { /*2, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3027 { /*2, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3028 { /*2, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3029 { /*2, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3030 { /*2, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3031 { /*2, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3032 { /*2, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3033 { /*2, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3034 { /*2, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3035 { /*2, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3036 { /*2, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE2), transform_texture },
3037 { /*2, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3038 { /*2, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop },
3039 { /*2, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop },
3040 { /*2, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), tex_resultarg },
3041 { /*2, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3042 { /*2, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3043 { /*2, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3044 { /*2, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3046 { /*3, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3047 { /*3, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3048 { /*3, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3049 { /*3, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop },
3050 { /*3, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop },
3051 { /*3, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop },
3052 { /*3, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3053 { /*3, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3054 { /*3, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3055 { /*3, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3056 { /*3, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(3, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
3057 { /*3, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3058 { /*3, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3059 { /*3, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3060 { /*3, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3061 { /*3, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3062 { /*3, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3063 { /*3, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3064 { /*3, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3065 { /*3, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3066 { /*3, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3067 { /*3, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3068 { /*3, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3069 { /*3, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE3), transform_texture },
3070 { /*3, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3071 { /*3, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop },
3072 { /*3, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop },
3073 { /*3, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), tex_resultarg },
3074 { /*3, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3075 { /*3, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3076 { /*3, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3077 { /*3, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3079 { /*4, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop },
3080 { /*4, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop },
3081 { /*4, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop },
3082 { /*4, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop },
3083 { /*4, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop },
3084 { /*4, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop },
3085 { /*4, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), state_undefined },
3086 { /*4, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), state_undefined },
3087 { /*4, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), state_undefined },
3088 { /*4, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), state_undefined },
3089 { /*4, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(4, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
3090 { /*4, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3091 { /*4, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3092 { /*4, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3093 { /*4, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3094 { /*4, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3095 { /*4, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3096 { /*4, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3097 { /*4, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3098 { /*4, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3099 { /*4, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3100 { /*4, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3101 { /*4, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3102 { /*4, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE4), transform_texture },
3103 { /*4, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3104 { /*4, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop },
3105 { /*4, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop },
3106 { /*4, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), tex_resultarg },
3107 { /*4, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3108 { /*4, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3109 { /*4, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3110 { /*4, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3112 { /*5, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3113 { /*5, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3114 { /*5, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3115 { /*5, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop },
3116 { /*5, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop },
3117 { /*5, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop },
3118 { /*5, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3119 { /*5, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3120 { /*5, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3121 { /*5, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3122 { /*5, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(5, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
3123 { /*5, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3124 { /*5, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3125 { /*5, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3126 { /*5, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3127 { /*5, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3128 { /*5, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3129 { /*5, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3130 { /*5, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3131 { /*5, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3132 { /*5, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3133 { /*5, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3134 { /*5, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3135 { /*5, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE5), transform_texture },
3136 { /*5, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3137 { /*5, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop },
3138 { /*5, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop },
3139 { /*5, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), tex_resultarg },
3140 { /*5, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3141 { /*5, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3142 { /*5, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3143 { /*5, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3145 { /*6, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3146 { /*6, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3147 { /*6, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3148 { /*6, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop },
3149 { /*6, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop },
3150 { /*6, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop },
3151 { /*6, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3152 { /*6, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3153 { /*6, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3154 { /*6, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3155 { /*6, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(6, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
3156 { /*6, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3157 { /*6, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3158 { /*6, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3159 { /*6, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3160 { /*6, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3161 { /*6, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3162 { /*6, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3163 { /*6, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3164 { /*6, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3165 { /*6, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3166 { /*6, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3167 { /*6, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3168 { /*6, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE6), transform_texture },
3169 { /*6, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3170 { /*6, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop },
3171 { /*6, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop },
3172 { /*6, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), tex_resultarg },
3173 { /*6, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3174 { /*6, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3175 { /*6, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3176 { /*6, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3178 { /*7, 01, WINED3DTSS_COLOROP */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3179 { /*7, 02, WINED3DTSS_COLORARG1 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3180 { /*7, 03, WINED3DTSS_COLORARG2 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3181 { /*7, 04, WINED3DTSS_ALPHAOP */ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop },
3182 { /*7, 05, WINED3DTSS_ALPHAARG1 */ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop },
3183 { /*7, 06, WINED3DTSS_ALPHAARG2 */ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop },
3184 { /*7, 07, WINED3DTSS_BUMPENVMAT00 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3185 { /*7, 08, WINED3DTSS_BUMPENVMAT01 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3186 { /*7, 09, WINED3DTSS_BUMPENVMAT10 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3187 { /*7, 10, WINED3DTSS_BUMPENVMAT11 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3188 { /*7, 11, WINED3DTSS_TEXCOORDINDEX */ STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), tex_coordindex },
3189 { /*7, 12, WINED3DTSS_ADDRESS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3190 { /*7, 13, WINED3DTSS_ADDRESSU */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3191 { /*7, 14, WINED3DTSS_ADDRESSV */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3192 { /*7, 15, WINED3DTSS_BORDERCOLOR */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3193 { /*7, 16, WINED3DTSS_MAGFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3194 { /*7, 17, WINED3DTSS_MINFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3195 { /*7, 18, WINED3DTSS_MIPFILTER */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3196 { /*7, 19, WINED3DTSS_MIPMAPLODBIAS */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3197 { /*7, 20, WINED3DTSS_MAXMIPLEVEL */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3198 { /*7, 21, WINED3DTSS_MAXANISOTROPY */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3199 { /*7, 22, WINED3DTSS_BUMPENVLSCALE */ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale },
3200 { /*7, 23, WINED3DTSS_BUMPENVLOFFSET */ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), tex_bumpenvloffset },
3201 { /*7, 24, WINED3DTSS_TEXTURETRANSFORMFLAGS */ STATE_TRANSFORM(WINED3DTS_TEXTURE7), transform_texture },
3202 { /*7, 25, WINED3DTSS_ADDRESSW */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3203 { /*7, 26, WINED3DTSS_COLORARG0 */ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop },
3204 { /*7, 27, WINED3DTSS_ALPHAARG0 */ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop },
3205 { /*7, 28, WINED3DTSS_RESULTARG */ STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), tex_resultarg },
3206 { /*7, 29, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3207 { /*7, 30, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3208 { /*7, 31, undefined */ 0 /* -> sampler state in ddraw / d3d8 */, state_undefined },
3209 { /*7, 32, WINED3DTSS_CONSTANT */ 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl },
3210 /* Sampler states */
3211 { /* 0, Sampler 0 */ STATE_SAMPLER(0), sampler },
3212 { /* 1, Sampler 1 */ STATE_SAMPLER(1), sampler },
3213 { /* 2, Sampler 2 */ STATE_SAMPLER(2), sampler },
3214 { /* 3, Sampler 3 */ STATE_SAMPLER(3), sampler },
3215 { /* 4, Sampler 3 */ STATE_SAMPLER(4), sampler },
3216 { /* 5, Sampler 5 */ STATE_SAMPLER(5), sampler },
3217 { /* 6, Sampler 6 */ STATE_SAMPLER(6), sampler },
3218 { /* 7, Sampler 7 */ STATE_SAMPLER(7), sampler },
3219 { /* 8, Sampler 8 */ STATE_SAMPLER(8), sampler },
3220 { /* 9, Sampler 9 */ STATE_SAMPLER(9), sampler },
3221 { /*10, Sampler 10 */ STATE_SAMPLER(10), sampler },
3222 { /*11, Sampler 11 */ STATE_SAMPLER(11), sampler },
3223 { /*12, Sampler 12 */ STATE_SAMPLER(12), sampler },
3224 { /*13, Sampler 13 */ STATE_SAMPLER(13), sampler },
3225 { /*14, Sampler 14 */ STATE_SAMPLER(14), sampler },
3226 { /*15, Sampler 15 */ STATE_SAMPLER(15), sampler },
3227 /* Pixel shader */
3228 { /* , Pixel Shader */ STATE_PIXELSHADER, pixelshader },
3229 /* Transform states follow */
3230 { /* 1, undefined */ 0, state_undefined },
3231 { /* 2, WINED3DTS_VIEW */ STATE_TRANSFORM(WINED3DTS_VIEW), transform_view },
3232 { /* 3, WINED3DTS_PROJECTION */ STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection},
3233 { /* 4, undefined */ 0, state_undefined },
3234 { /* 5, undefined */ 0, state_undefined },
3235 { /* 6, undefined */ 0, state_undefined },
3236 { /* 7, undefined */ 0, state_undefined },
3237 { /* 8, undefined */ 0, state_undefined },
3238 { /* 9, undefined */ 0, state_undefined },
3239 { /* 10, undefined */ 0, state_undefined },
3240 { /* 11, undefined */ 0, state_undefined },
3241 { /* 12, undefined */ 0, state_undefined },
3242 { /* 13, undefined */ 0, state_undefined },
3243 { /* 14, undefined */ 0, state_undefined },
3244 { /* 15, undefined */ 0, state_undefined },
3245 { /* 16, WINED3DTS_TEXTURE0 */ STATE_TRANSFORM(WINED3DTS_TEXTURE0), transform_texture },
3246 { /* 17, WINED3DTS_TEXTURE1 */ STATE_TRANSFORM(WINED3DTS_TEXTURE1), transform_texture },
3247 { /* 18, WINED3DTS_TEXTURE2 */ STATE_TRANSFORM(WINED3DTS_TEXTURE2), transform_texture },
3248 { /* 19, WINED3DTS_TEXTURE3 */ STATE_TRANSFORM(WINED3DTS_TEXTURE3), transform_texture },
3249 { /* 20, WINED3DTS_TEXTURE4 */ STATE_TRANSFORM(WINED3DTS_TEXTURE4), transform_texture },
3250 { /* 21, WINED3DTS_TEXTURE5 */ STATE_TRANSFORM(WINED3DTS_TEXTURE5), transform_texture },
3251 { /* 22, WINED3DTS_TEXTURE6 */ STATE_TRANSFORM(WINED3DTS_TEXTURE6), transform_texture },
3252 { /* 23, WINED3DTS_TEXTURE7 */ STATE_TRANSFORM(WINED3DTS_TEXTURE7), transform_texture },
3253 /* A huge gap between TEXTURE7 and WORLDMATRIX(0) :-( But entries are needed to catch then if a broken app sets them */
3254 { /* 24, undefined */ 0, state_undefined },
3255 { /* 25, undefined */ 0, state_undefined },
3256 { /* 26, undefined */ 0, state_undefined },
3257 { /* 27, undefined */ 0, state_undefined },
3258 { /* 28, undefined */ 0, state_undefined },
3259 { /* 29, undefined */ 0, state_undefined },
3260 { /* 30, undefined */ 0, state_undefined },
3261 { /* 31, undefined */ 0, state_undefined },
3262 { /* 32, undefined */ 0, state_undefined },
3263 { /* 33, undefined */ 0, state_undefined },
3264 { /* 34, undefined */ 0, state_undefined },
3265 { /* 35, undefined */ 0, state_undefined },
3266 { /* 36, undefined */ 0, state_undefined },
3267 { /* 37, undefined */ 0, state_undefined },
3268 { /* 38, undefined */ 0, state_undefined },
3269 { /* 39, undefined */ 0, state_undefined },
3270 { /* 40, undefined */ 0, state_undefined },
3271 { /* 41, undefined */ 0, state_undefined },
3272 { /* 42, undefined */ 0, state_undefined },
3273 { /* 43, undefined */ 0, state_undefined },
3274 { /* 44, undefined */ 0, state_undefined },
3275 { /* 45, undefined */ 0, state_undefined },
3276 { /* 46, undefined */ 0, state_undefined },
3277 { /* 47, undefined */ 0, state_undefined },
3278 { /* 48, undefined */ 0, state_undefined },
3279 { /* 49, undefined */ 0, state_undefined },
3280 { /* 50, undefined */ 0, state_undefined },
3281 { /* 51, undefined */ 0, state_undefined },
3282 { /* 52, undefined */ 0, state_undefined },
3283 { /* 53, undefined */ 0, state_undefined },
3284 { /* 54, undefined */ 0, state_undefined },
3285 { /* 55, undefined */ 0, state_undefined },
3286 { /* 56, undefined */ 0, state_undefined },
3287 { /* 57, undefined */ 0, state_undefined },
3288 { /* 58, undefined */ 0, state_undefined },
3289 { /* 59, undefined */ 0, state_undefined },
3290 { /* 60, undefined */ 0, state_undefined },
3291 { /* 61, undefined */ 0, state_undefined },
3292 { /* 62, undefined */ 0, state_undefined },
3293 { /* 63, undefined */ 0, state_undefined },
3294 { /* 64, undefined */ 0, state_undefined },
3295 { /* 65, undefined */ 0, state_undefined },
3296 { /* 66, undefined */ 0, state_undefined },
3297 { /* 67, undefined */ 0, state_undefined },
3298 { /* 68, undefined */ 0, state_undefined },
3299 { /* 69, undefined */ 0, state_undefined },
3300 { /* 70, undefined */ 0, state_undefined },
3301 { /* 71, undefined */ 0, state_undefined },
3302 { /* 72, undefined */ 0, state_undefined },
3303 { /* 73, undefined */ 0, state_undefined },
3304 { /* 74, undefined */ 0, state_undefined },
3305 { /* 75, undefined */ 0, state_undefined },
3306 { /* 76, undefined */ 0, state_undefined },
3307 { /* 77, undefined */ 0, state_undefined },
3308 { /* 78, undefined */ 0, state_undefined },
3309 { /* 79, undefined */ 0, state_undefined },
3310 { /* 80, undefined */ 0, state_undefined },
3311 { /* 81, undefined */ 0, state_undefined },
3312 { /* 82, undefined */ 0, state_undefined },
3313 { /* 83, undefined */ 0, state_undefined },
3314 { /* 84, undefined */ 0, state_undefined },
3315 { /* 85, undefined */ 0, state_undefined },
3316 { /* 86, undefined */ 0, state_undefined },
3317 { /* 87, undefined */ 0, state_undefined },
3318 { /* 88, undefined */ 0, state_undefined },
3319 { /* 89, undefined */ 0, state_undefined },
3320 { /* 90, undefined */ 0, state_undefined },
3321 { /* 91, undefined */ 0, state_undefined },
3322 { /* 92, undefined */ 0, state_undefined },
3323 { /* 93, undefined */ 0, state_undefined },
3324 { /* 94, undefined */ 0, state_undefined },
3325 { /* 95, undefined */ 0, state_undefined },
3326 { /* 96, undefined */ 0, state_undefined },
3327 { /* 97, undefined */ 0, state_undefined },
3328 { /* 98, undefined */ 0, state_undefined },
3329 { /* 99, undefined */ 0, state_undefined },
3330 { /*100, undefined */ 0, state_undefined },
3331 { /*101, undefined */ 0, state_undefined },
3332 { /*102, undefined */ 0, state_undefined },
3333 { /*103, undefined */ 0, state_undefined },
3334 { /*104, undefined */ 0, state_undefined },
3335 { /*105, undefined */ 0, state_undefined },
3336 { /*106, undefined */ 0, state_undefined },
3337 { /*107, undefined */ 0, state_undefined },
3338 { /*108, undefined */ 0, state_undefined },
3339 { /*109, undefined */ 0, state_undefined },
3340 { /*110, undefined */ 0, state_undefined },
3341 { /*111, undefined */ 0, state_undefined },
3342 { /*112, undefined */ 0, state_undefined },
3343 { /*113, undefined */ 0, state_undefined },
3344 { /*114, undefined */ 0, state_undefined },
3345 { /*115, undefined */ 0, state_undefined },
3346 { /*116, undefined */ 0, state_undefined },
3347 { /*117, undefined */ 0, state_undefined },
3348 { /*118, undefined */ 0, state_undefined },
3349 { /*119, undefined */ 0, state_undefined },
3350 { /*120, undefined */ 0, state_undefined },
3351 { /*121, undefined */ 0, state_undefined },
3352 { /*122, undefined */ 0, state_undefined },
3353 { /*123, undefined */ 0, state_undefined },
3354 { /*124, undefined */ 0, state_undefined },
3355 { /*125, undefined */ 0, state_undefined },
3356 { /*126, undefined */ 0, state_undefined },
3357 { /*127, undefined */ 0, state_undefined },
3358 { /*128, undefined */ 0, state_undefined },
3359 { /*129, undefined */ 0, state_undefined },
3360 { /*130, undefined */ 0, state_undefined },
3361 { /*131, undefined */ 0, state_undefined },
3362 { /*132, undefined */ 0, state_undefined },
3363 { /*133, undefined */ 0, state_undefined },
3364 { /*134, undefined */ 0, state_undefined },
3365 { /*135, undefined */ 0, state_undefined },
3366 { /*136, undefined */ 0, state_undefined },
3367 { /*137, undefined */ 0, state_undefined },
3368 { /*138, undefined */ 0, state_undefined },
3369 { /*139, undefined */ 0, state_undefined },
3370 { /*140, undefined */ 0, state_undefined },
3371 { /*141, undefined */ 0, state_undefined },
3372 { /*142, undefined */ 0, state_undefined },
3373 { /*143, undefined */ 0, state_undefined },
3374 { /*144, undefined */ 0, state_undefined },
3375 { /*145, undefined */ 0, state_undefined },
3376 { /*146, undefined */ 0, state_undefined },
3377 { /*147, undefined */ 0, state_undefined },
3378 { /*148, undefined */ 0, state_undefined },
3379 { /*149, undefined */ 0, state_undefined },
3380 { /*150, undefined */ 0, state_undefined },
3381 { /*151, undefined */ 0, state_undefined },
3382 { /*152, undefined */ 0, state_undefined },
3383 { /*153, undefined */ 0, state_undefined },
3384 { /*154, undefined */ 0, state_undefined },
3385 { /*155, undefined */ 0, state_undefined },
3386 { /*156, undefined */ 0, state_undefined },
3387 { /*157, undefined */ 0, state_undefined },
3388 { /*158, undefined */ 0, state_undefined },
3389 { /*159, undefined */ 0, state_undefined },
3390 { /*160, undefined */ 0, state_undefined },
3391 { /*161, undefined */ 0, state_undefined },
3392 { /*162, undefined */ 0, state_undefined },
3393 { /*163, undefined */ 0, state_undefined },
3394 { /*164, undefined */ 0, state_undefined },
3395 { /*165, undefined */ 0, state_undefined },
3396 { /*166, undefined */ 0, state_undefined },
3397 { /*167, undefined */ 0, state_undefined },
3398 { /*168, undefined */ 0, state_undefined },
3399 { /*169, undefined */ 0, state_undefined },
3400 { /*170, undefined */ 0, state_undefined },
3401 { /*171, undefined */ 0, state_undefined },
3402 { /*172, undefined */ 0, state_undefined },
3403 { /*173, undefined */ 0, state_undefined },
3404 { /*174, undefined */ 0, state_undefined },
3405 { /*175, undefined */ 0, state_undefined },
3406 { /*176, undefined */ 0, state_undefined },
3407 { /*177, undefined */ 0, state_undefined },
3408 { /*178, undefined */ 0, state_undefined },
3409 { /*179, undefined */ 0, state_undefined },
3410 { /*180, undefined */ 0, state_undefined },
3411 { /*181, undefined */ 0, state_undefined },
3412 { /*182, undefined */ 0, state_undefined },
3413 { /*183, undefined */ 0, state_undefined },
3414 { /*184, undefined */ 0, state_undefined },
3415 { /*185, undefined */ 0, state_undefined },
3416 { /*186, undefined */ 0, state_undefined },
3417 { /*187, undefined */ 0, state_undefined },
3418 { /*188, undefined */ 0, state_undefined },
3419 { /*189, undefined */ 0, state_undefined },
3420 { /*190, undefined */ 0, state_undefined },
3421 { /*191, undefined */ 0, state_undefined },
3422 { /*192, undefined */ 0, state_undefined },
3423 { /*193, undefined */ 0, state_undefined },
3424 { /*194, undefined */ 0, state_undefined },
3425 { /*195, undefined */ 0, state_undefined },
3426 { /*196, undefined */ 0, state_undefined },
3427 { /*197, undefined */ 0, state_undefined },
3428 { /*198, undefined */ 0, state_undefined },
3429 { /*199, undefined */ 0, state_undefined },
3430 { /*200, undefined */ 0, state_undefined },
3431 { /*201, undefined */ 0, state_undefined },
3432 { /*202, undefined */ 0, state_undefined },
3433 { /*203, undefined */ 0, state_undefined },
3434 { /*204, undefined */ 0, state_undefined },
3435 { /*205, undefined */ 0, state_undefined },
3436 { /*206, undefined */ 0, state_undefined },
3437 { /*207, undefined */ 0, state_undefined },
3438 { /*208, undefined */ 0, state_undefined },
3439 { /*209, undefined */ 0, state_undefined },
3440 { /*210, undefined */ 0, state_undefined },
3441 { /*211, undefined */ 0, state_undefined },
3442 { /*212, undefined */ 0, state_undefined },
3443 { /*213, undefined */ 0, state_undefined },
3444 { /*214, undefined */ 0, state_undefined },
3445 { /*215, undefined */ 0, state_undefined },
3446 { /*216, undefined */ 0, state_undefined },
3447 { /*217, undefined */ 0, state_undefined },
3448 { /*218, undefined */ 0, state_undefined },
3449 { /*219, undefined */ 0, state_undefined },
3450 { /*220, undefined */ 0, state_undefined },
3451 { /*221, undefined */ 0, state_undefined },
3452 { /*222, undefined */ 0, state_undefined },
3453 { /*223, undefined */ 0, state_undefined },
3454 { /*224, undefined */ 0, state_undefined },
3455 { /*225, undefined */ 0, state_undefined },
3456 { /*226, undefined */ 0, state_undefined },
3457 { /*227, undefined */ 0, state_undefined },
3458 { /*228, undefined */ 0, state_undefined },
3459 { /*229, undefined */ 0, state_undefined },
3460 { /*230, undefined */ 0, state_undefined },
3461 { /*231, undefined */ 0, state_undefined },
3462 { /*232, undefined */ 0, state_undefined },
3463 { /*233, undefined */ 0, state_undefined },
3464 { /*234, undefined */ 0, state_undefined },
3465 { /*235, undefined */ 0, state_undefined },
3466 { /*236, undefined */ 0, state_undefined },
3467 { /*237, undefined */ 0, state_undefined },
3468 { /*238, undefined */ 0, state_undefined },
3469 { /*239, undefined */ 0, state_undefined },
3470 { /*240, undefined */ 0, state_undefined },
3471 { /*241, undefined */ 0, state_undefined },
3472 { /*242, undefined */ 0, state_undefined },
3473 { /*243, undefined */ 0, state_undefined },
3474 { /*244, undefined */ 0, state_undefined },
3475 { /*245, undefined */ 0, state_undefined },
3476 { /*246, undefined */ 0, state_undefined },
3477 { /*247, undefined */ 0, state_undefined },
3478 { /*248, undefined */ 0, state_undefined },
3479 { /*249, undefined */ 0, state_undefined },
3480 { /*250, undefined */ 0, state_undefined },
3481 { /*251, undefined */ 0, state_undefined },
3482 { /*252, undefined */ 0, state_undefined },
3483 { /*253, undefined */ 0, state_undefined },
3484 { /*254, undefined */ 0, state_undefined },
3485 { /*255, undefined */ 0, state_undefined },
3486 /* End huge gap */
3487 { /*256, WINED3DTS_WORLDMATRIX(0) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), transform_world },
3488 { /*257, WINED3DTS_WORLDMATRIX(1) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(1)), transform_worldex },
3489 { /*258, WINED3DTS_WORLDMATRIX(2) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(2)), transform_worldex },
3490 { /*259, WINED3DTS_WORLDMATRIX(3) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(3)), transform_worldex },
3491 { /*260, WINED3DTS_WORLDMATRIX(4) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(4)), transform_worldex },
3492 { /*261, WINED3DTS_WORLDMATRIX(5) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(5)), transform_worldex },
3493 { /*262, WINED3DTS_WORLDMATRIX(6) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(6)), transform_worldex },
3494 { /*263, WINED3DTS_WORLDMATRIX(7) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(7)), transform_worldex },
3495 { /*264, WINED3DTS_WORLDMATRIX(8) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(8)), transform_worldex },
3496 { /*265, WINED3DTS_WORLDMATRIX(9) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(9)), transform_worldex },
3497 { /*266, WINED3DTS_WORLDMATRIX(10) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(10)), transform_worldex },
3498 { /*267, WINED3DTS_WORLDMATRIX(11) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(11)), transform_worldex },
3499 { /*268, WINED3DTS_WORLDMATRIX(12) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(12)), transform_worldex },
3500 { /*269, WINED3DTS_WORLDMATRIX(13) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(13)), transform_worldex },
3501 { /*270, WINED3DTS_WORLDMATRIX(14) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(14)), transform_worldex },
3502 { /*271, WINED3DTS_WORLDMATRIX(15) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(15)), transform_worldex },
3503 { /*272, WINED3DTS_WORLDMATRIX(16) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(16)), transform_worldex },
3504 { /*273, WINED3DTS_WORLDMATRIX(17) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(17)), transform_worldex },
3505 { /*274, WINED3DTS_WORLDMATRIX(18) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(18)), transform_worldex },
3506 { /*275, WINED3DTS_WORLDMATRIX(19) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(19)), transform_worldex },
3507 { /*276, WINED3DTS_WORLDMATRIX(20) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(20)), transform_worldex },
3508 { /*277, WINED3DTS_WORLDMATRIX(21) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(21)), transform_worldex },
3509 { /*278, WINED3DTS_WORLDMATRIX(22) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(22)), transform_worldex },
3510 { /*279, WINED3DTS_WORLDMATRIX(23) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(23)), transform_worldex },
3511 { /*280, WINED3DTS_WORLDMATRIX(24) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(24)), transform_worldex },
3512 { /*281, WINED3DTS_WORLDMATRIX(25) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(25)), transform_worldex },
3513 { /*282, WINED3DTS_WORLDMATRIX(26) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(26)), transform_worldex },
3514 { /*283, WINED3DTS_WORLDMATRIX(27) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(27)), transform_worldex },
3515 { /*284, WINED3DTS_WORLDMATRIX(28) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(28)), transform_worldex },
3516 { /*285, WINED3DTS_WORLDMATRIX(29) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(29)), transform_worldex },
3517 { /*286, WINED3DTS_WORLDMATRIX(30) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(30)), transform_worldex },
3518 { /*287, WINED3DTS_WORLDMATRIX(31) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(31)), transform_worldex },
3519 { /*288, WINED3DTS_WORLDMATRIX(32) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(32)), transform_worldex },
3520 { /*289, WINED3DTS_WORLDMATRIX(33) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(33)), transform_worldex },
3521 { /*290, WINED3DTS_WORLDMATRIX(34) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(34)), transform_worldex },
3522 { /*291, WINED3DTS_WORLDMATRIX(35) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(35)), transform_worldex },
3523 { /*292, WINED3DTS_WORLDMATRIX(36) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(36)), transform_worldex },
3524 { /*293, WINED3DTS_WORLDMATRIX(37) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(37)), transform_worldex },
3525 { /*294, WINED3DTS_WORLDMATRIX(38) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(38)), transform_worldex },
3526 { /*295, WINED3DTS_WORLDMATRIX(39) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(39)), transform_worldex },
3527 { /*296, WINED3DTS_WORLDMATRIX(40) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(40)), transform_worldex },
3528 { /*297, WINED3DTS_WORLDMATRIX(41) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(41)), transform_worldex },
3529 { /*298, WINED3DTS_WORLDMATRIX(42) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(42)), transform_worldex },
3530 { /*299, WINED3DTS_WORLDMATRIX(43) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(43)), transform_worldex },
3531 { /*300, WINED3DTS_WORLDMATRIX(44) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(44)), transform_worldex },
3532 { /*301, WINED3DTS_WORLDMATRIX(45) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(45)), transform_worldex },
3533 { /*302, WINED3DTS_WORLDMATRIX(46) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(46)), transform_worldex },
3534 { /*303, WINED3DTS_WORLDMATRIX(47) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(47)), transform_worldex },
3535 { /*304, WINED3DTS_WORLDMATRIX(48) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(48)), transform_worldex },
3536 { /*305, WINED3DTS_WORLDMATRIX(49) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(49)), transform_worldex },
3537 { /*306, WINED3DTS_WORLDMATRIX(50) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(50)), transform_worldex },
3538 { /*307, WINED3DTS_WORLDMATRIX(51) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(51)), transform_worldex },
3539 { /*308, WINED3DTS_WORLDMATRIX(52) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(52)), transform_worldex },
3540 { /*309, WINED3DTS_WORLDMATRIX(53) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(53)), transform_worldex },
3541 { /*310, WINED3DTS_WORLDMATRIX(54) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(54)), transform_worldex },
3542 { /*311, WINED3DTS_WORLDMATRIX(55) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(55)), transform_worldex },
3543 { /*312, WINED3DTS_WORLDMATRIX(56) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(56)), transform_worldex },
3544 { /*313, WINED3DTS_WORLDMATRIX(57) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(57)), transform_worldex },
3545 { /*314, WINED3DTS_WORLDMATRIX(58) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(58)), transform_worldex },
3546 { /*315, WINED3DTS_WORLDMATRIX(59) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(59)), transform_worldex },
3547 { /*316, WINED3DTS_WORLDMATRIX(60) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(60)), transform_worldex },
3548 { /*317, WINED3DTS_WORLDMATRIX(61) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(61)), transform_worldex },
3549 { /*318, WINED3DTS_WORLDMATRIX(62) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(62)), transform_worldex },
3550 { /*319, WINED3DTS_WORLDMATRIX(63) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(63)), transform_worldex },
3551 { /*320, WINED3DTS_WORLDMATRIX(64) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(64)), transform_worldex },
3552 { /*321, WINED3DTS_WORLDMATRIX(65) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(65)), transform_worldex },
3553 { /*322, WINED3DTS_WORLDMATRIX(66) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(66)), transform_worldex },
3554 { /*323, WINED3DTS_WORLDMATRIX(67) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(67)), transform_worldex },
3555 { /*324, WINED3DTS_WORLDMATRIX(68) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(68)), transform_worldex },
3556 { /*325, WINED3DTS_WORLDMATRIX(68) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(69)), transform_worldex },
3557 { /*326, WINED3DTS_WORLDMATRIX(70) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(70)), transform_worldex },
3558 { /*327, WINED3DTS_WORLDMATRIX(71) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(71)), transform_worldex },
3559 { /*328, WINED3DTS_WORLDMATRIX(72) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(72)), transform_worldex },
3560 { /*329, WINED3DTS_WORLDMATRIX(73) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(73)), transform_worldex },
3561 { /*330, WINED3DTS_WORLDMATRIX(74) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(74)), transform_worldex },
3562 { /*331, WINED3DTS_WORLDMATRIX(75) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(75)), transform_worldex },
3563 { /*332, WINED3DTS_WORLDMATRIX(76) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(76)), transform_worldex },
3564 { /*333, WINED3DTS_WORLDMATRIX(77) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(77)), transform_worldex },
3565 { /*334, WINED3DTS_WORLDMATRIX(78) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(78)), transform_worldex },
3566 { /*335, WINED3DTS_WORLDMATRIX(79) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(79)), transform_worldex },
3567 { /*336, WINED3DTS_WORLDMATRIX(80) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(80)), transform_worldex },
3568 { /*337, WINED3DTS_WORLDMATRIX(81) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(81)), transform_worldex },
3569 { /*338, WINED3DTS_WORLDMATRIX(82) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(82)), transform_worldex },
3570 { /*339, WINED3DTS_WORLDMATRIX(83) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(83)), transform_worldex },
3571 { /*340, WINED3DTS_WORLDMATRIX(84) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(84)), transform_worldex },
3572 { /*341, WINED3DTS_WORLDMATRIX(85) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(85)), transform_worldex },
3573 { /*341, WINED3DTS_WORLDMATRIX(86) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(86)), transform_worldex },
3574 { /*343, WINED3DTS_WORLDMATRIX(87) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(87)), transform_worldex },
3575 { /*344, WINED3DTS_WORLDMATRIX(88) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(88)), transform_worldex },
3576 { /*345, WINED3DTS_WORLDMATRIX(89) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(89)), transform_worldex },
3577 { /*346, WINED3DTS_WORLDMATRIX(90) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(90)), transform_worldex },
3578 { /*347, WINED3DTS_WORLDMATRIX(91) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(91)), transform_worldex },
3579 { /*348, WINED3DTS_WORLDMATRIX(92) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(92)), transform_worldex },
3580 { /*349, WINED3DTS_WORLDMATRIX(93) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(93)), transform_worldex },
3581 { /*350, WINED3DTS_WORLDMATRIX(94) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(94)), transform_worldex },
3582 { /*351, WINED3DTS_WORLDMATRIX(95) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(95)), transform_worldex },
3583 { /*352, WINED3DTS_WORLDMATRIX(96) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(96)), transform_worldex },
3584 { /*353, WINED3DTS_WORLDMATRIX(97) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(97)), transform_worldex },
3585 { /*354, WINED3DTS_WORLDMATRIX(98) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(98)), transform_worldex },
3586 { /*355, WINED3DTS_WORLDMATRIX(99) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(99)), transform_worldex },
3587 { /*356, WINED3DTS_WORLDMATRIX(100) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), transform_worldex },
3588 { /*357, WINED3DTS_WORLDMATRIX(101) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), transform_worldex },
3589 { /*358, WINED3DTS_WORLDMATRIX(102) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), transform_worldex },
3590 { /*359, WINED3DTS_WORLDMATRIX(103) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), transform_worldex },
3591 { /*360, WINED3DTS_WORLDMATRIX(104) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), transform_worldex },
3592 { /*361, WINED3DTS_WORLDMATRIX(105) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), transform_worldex },
3593 { /*362, WINED3DTS_WORLDMATRIX(106) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), transform_worldex },
3594 { /*363, WINED3DTS_WORLDMATRIX(107) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), transform_worldex },
3595 { /*364, WINED3DTS_WORLDMATRIX(108) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), transform_worldex },
3596 { /*365, WINED3DTS_WORLDMATRIX(109) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), transform_worldex },
3597 { /*366, WINED3DTS_WORLDMATRIX(110) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), transform_worldex },
3598 { /*367, WINED3DTS_WORLDMATRIX(111) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), transform_worldex },
3599 { /*368, WINED3DTS_WORLDMATRIX(112) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), transform_worldex },
3600 { /*369, WINED3DTS_WORLDMATRIX(113) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), transform_worldex },
3601 { /*370, WINED3DTS_WORLDMATRIX(114) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), transform_worldex },
3602 { /*371, WINED3DTS_WORLDMATRIX(115) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), transform_worldex },
3603 { /*372, WINED3DTS_WORLDMATRIX(116) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), transform_worldex },
3604 { /*373, WINED3DTS_WORLDMATRIX(117) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), transform_worldex },
3605 { /*374, WINED3DTS_WORLDMATRIX(118) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), transform_worldex },
3606 { /*375, WINED3DTS_WORLDMATRIX(119) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), transform_worldex },
3607 { /*376, WINED3DTS_WORLDMATRIX(120) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), transform_worldex },
3608 { /*377, WINED3DTS_WORLDMATRIX(121) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), transform_worldex },
3609 { /*378, WINED3DTS_WORLDMATRIX(122) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), transform_worldex },
3610 { /*379, WINED3DTS_WORLDMATRIX(123) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), transform_worldex },
3611 { /*380, WINED3DTS_WORLDMATRIX(124) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), transform_worldex },
3612 { /*381, WINED3DTS_WORLDMATRIX(125) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), transform_worldex },
3613 { /*382, WINED3DTS_WORLDMATRIX(126) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), transform_worldex },
3614 { /*383, WINED3DTS_WORLDMATRIX(127) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), transform_worldex },
3615 { /*384, WINED3DTS_WORLDMATRIX(128) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), transform_worldex },
3616 { /*385, WINED3DTS_WORLDMATRIX(129) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), transform_worldex },
3617 { /*386, WINED3DTS_WORLDMATRIX(130) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), transform_worldex },
3618 { /*387, WINED3DTS_WORLDMATRIX(131) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), transform_worldex },
3619 { /*388, WINED3DTS_WORLDMATRIX(132) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), transform_worldex },
3620 { /*389, WINED3DTS_WORLDMATRIX(133) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), transform_worldex },
3621 { /*390, WINED3DTS_WORLDMATRIX(134) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), transform_worldex },
3622 { /*391, WINED3DTS_WORLDMATRIX(135) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), transform_worldex },
3623 { /*392, WINED3DTS_WORLDMATRIX(136) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), transform_worldex },
3624 { /*393, WINED3DTS_WORLDMATRIX(137) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), transform_worldex },
3625 { /*394, WINED3DTS_WORLDMATRIX(138) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), transform_worldex },
3626 { /*395, WINED3DTS_WORLDMATRIX(139) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), transform_worldex },
3627 { /*396, WINED3DTS_WORLDMATRIX(140) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), transform_worldex },
3628 { /*397, WINED3DTS_WORLDMATRIX(141) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), transform_worldex },
3629 { /*398, WINED3DTS_WORLDMATRIX(142) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), transform_worldex },
3630 { /*399, WINED3DTS_WORLDMATRIX(143) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), transform_worldex },
3631 { /*400, WINED3DTS_WORLDMATRIX(144) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), transform_worldex },
3632 { /*401, WINED3DTS_WORLDMATRIX(145) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), transform_worldex },
3633 { /*402, WINED3DTS_WORLDMATRIX(146) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), transform_worldex },
3634 { /*403, WINED3DTS_WORLDMATRIX(147) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), transform_worldex },
3635 { /*404, WINED3DTS_WORLDMATRIX(148) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), transform_worldex },
3636 { /*405, WINED3DTS_WORLDMATRIX(149) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), transform_worldex },
3637 { /*406, WINED3DTS_WORLDMATRIX(150) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), transform_worldex },
3638 { /*407, WINED3DTS_WORLDMATRIX(151) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), transform_worldex },
3639 { /*408, WINED3DTS_WORLDMATRIX(152) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), transform_worldex },
3640 { /*409, WINED3DTS_WORLDMATRIX(153) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), transform_worldex },
3641 { /*410, WINED3DTS_WORLDMATRIX(154) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), transform_worldex },
3642 { /*411, WINED3DTS_WORLDMATRIX(155) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), transform_worldex },
3643 { /*412, WINED3DTS_WORLDMATRIX(156) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), transform_worldex },
3644 { /*413, WINED3DTS_WORLDMATRIX(157) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), transform_worldex },
3645 { /*414, WINED3DTS_WORLDMATRIX(158) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), transform_worldex },
3646 { /*415, WINED3DTS_WORLDMATRIX(159) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), transform_worldex },
3647 { /*416, WINED3DTS_WORLDMATRIX(160) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), transform_worldex },
3648 { /*417, WINED3DTS_WORLDMATRIX(161) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), transform_worldex },
3649 { /*418, WINED3DTS_WORLDMATRIX(162) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), transform_worldex },
3650 { /*419, WINED3DTS_WORLDMATRIX(163) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), transform_worldex },
3651 { /*420, WINED3DTS_WORLDMATRIX(164) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), transform_worldex },
3652 { /*421, WINED3DTS_WORLDMATRIX(165) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), transform_worldex },
3653 { /*422, WINED3DTS_WORLDMATRIX(166) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), transform_worldex },
3654 { /*423, WINED3DTS_WORLDMATRIX(167) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), transform_worldex },
3655 { /*424, WINED3DTS_WORLDMATRIX(168) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), transform_worldex },
3656 { /*425, WINED3DTS_WORLDMATRIX(168) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), transform_worldex },
3657 { /*426, WINED3DTS_WORLDMATRIX(170) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), transform_worldex },
3658 { /*427, WINED3DTS_WORLDMATRIX(171) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), transform_worldex },
3659 { /*428, WINED3DTS_WORLDMATRIX(172) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), transform_worldex },
3660 { /*429, WINED3DTS_WORLDMATRIX(173) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), transform_worldex },
3661 { /*430, WINED3DTS_WORLDMATRIX(174) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), transform_worldex },
3662 { /*431, WINED3DTS_WORLDMATRIX(175) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), transform_worldex },
3663 { /*432, WINED3DTS_WORLDMATRIX(176) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), transform_worldex },
3664 { /*433, WINED3DTS_WORLDMATRIX(177) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), transform_worldex },
3665 { /*434, WINED3DTS_WORLDMATRIX(178) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), transform_worldex },
3666 { /*435, WINED3DTS_WORLDMATRIX(179) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), transform_worldex },
3667 { /*436, WINED3DTS_WORLDMATRIX(180) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), transform_worldex },
3668 { /*437, WINED3DTS_WORLDMATRIX(181) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), transform_worldex },
3669 { /*438, WINED3DTS_WORLDMATRIX(182) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), transform_worldex },
3670 { /*439, WINED3DTS_WORLDMATRIX(183) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), transform_worldex },
3671 { /*440, WINED3DTS_WORLDMATRIX(184) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), transform_worldex },
3672 { /*441, WINED3DTS_WORLDMATRIX(185) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), transform_worldex },
3673 { /*441, WINED3DTS_WORLDMATRIX(186) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), transform_worldex },
3674 { /*443, WINED3DTS_WORLDMATRIX(187) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), transform_worldex },
3675 { /*444, WINED3DTS_WORLDMATRIX(188) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), transform_worldex },
3676 { /*445, WINED3DTS_WORLDMATRIX(189) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), transform_worldex },
3677 { /*446, WINED3DTS_WORLDMATRIX(190) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), transform_worldex },
3678 { /*447, WINED3DTS_WORLDMATRIX(191) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), transform_worldex },
3679 { /*448, WINED3DTS_WORLDMATRIX(192) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), transform_worldex },
3680 { /*449, WINED3DTS_WORLDMATRIX(193) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), transform_worldex },
3681 { /*450, WINED3DTS_WORLDMATRIX(194) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), transform_worldex },
3682 { /*451, WINED3DTS_WORLDMATRIX(195) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), transform_worldex },
3683 { /*452, WINED3DTS_WORLDMATRIX(196) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), transform_worldex },
3684 { /*453, WINED3DTS_WORLDMATRIX(197) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), transform_worldex },
3685 { /*454, WINED3DTS_WORLDMATRIX(198) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), transform_worldex },
3686 { /*455, WINED3DTS_WORLDMATRIX(199) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), transform_worldex },
3687 { /*356, WINED3DTS_WORLDMATRIX(200) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), transform_worldex },
3688 { /*457, WINED3DTS_WORLDMATRIX(201) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), transform_worldex },
3689 { /*458, WINED3DTS_WORLDMATRIX(202) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), transform_worldex },
3690 { /*459, WINED3DTS_WORLDMATRIX(203) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), transform_worldex },
3691 { /*460, WINED3DTS_WORLDMATRIX(204) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), transform_worldex },
3692 { /*461, WINED3DTS_WORLDMATRIX(205) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), transform_worldex },
3693 { /*462, WINED3DTS_WORLDMATRIX(206) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), transform_worldex },
3694 { /*463, WINED3DTS_WORLDMATRIX(207) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), transform_worldex },
3695 { /*464, WINED3DTS_WORLDMATRIX(208) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), transform_worldex },
3696 { /*465, WINED3DTS_WORLDMATRIX(209) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), transform_worldex },
3697 { /*466, WINED3DTS_WORLDMATRIX(210) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), transform_worldex },
3698 { /*467, WINED3DTS_WORLDMATRIX(211) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), transform_worldex },
3699 { /*468, WINED3DTS_WORLDMATRIX(212) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), transform_worldex },
3700 { /*469, WINED3DTS_WORLDMATRIX(213) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), transform_worldex },
3701 { /*470, WINED3DTS_WORLDMATRIX(214) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), transform_worldex },
3702 { /*471, WINED3DTS_WORLDMATRIX(215) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), transform_worldex },
3703 { /*472, WINED3DTS_WORLDMATRIX(216) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), transform_worldex },
3704 { /*473, WINED3DTS_WORLDMATRIX(217) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), transform_worldex },
3705 { /*474, WINED3DTS_WORLDMATRIX(218) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), transform_worldex },
3706 { /*475, WINED3DTS_WORLDMATRIX(219) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), transform_worldex },
3707 { /*476, WINED3DTS_WORLDMATRIX(220) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), transform_worldex },
3708 { /*477, WINED3DTS_WORLDMATRIX(221) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), transform_worldex },
3709 { /*478, WINED3DTS_WORLDMATRIX(222) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), transform_worldex },
3710 { /*479, WINED3DTS_WORLDMATRIX(223) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), transform_worldex },
3711 { /*480, WINED3DTS_WORLDMATRIX(224) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), transform_worldex },
3712 { /*481, WINED3DTS_WORLDMATRIX(225) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), transform_worldex },
3713 { /*482, WINED3DTS_WORLDMATRIX(226) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), transform_worldex },
3714 { /*483, WINED3DTS_WORLDMATRIX(227) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), transform_worldex },
3715 { /*484, WINED3DTS_WORLDMATRIX(228) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), transform_worldex },
3716 { /*485, WINED3DTS_WORLDMATRIX(229) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), transform_worldex },
3717 { /*486, WINED3DTS_WORLDMATRIX(230) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), transform_worldex },
3718 { /*487, WINED3DTS_WORLDMATRIX(231) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), transform_worldex },
3719 { /*488, WINED3DTS_WORLDMATRIX(232) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), transform_worldex },
3720 { /*489, WINED3DTS_WORLDMATRIX(233) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), transform_worldex },
3721 { /*490, WINED3DTS_WORLDMATRIX(234) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), transform_worldex },
3722 { /*491, WINED3DTS_WORLDMATRIX(235) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), transform_worldex },
3723 { /*492, WINED3DTS_WORLDMATRIX(236) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), transform_worldex },
3724 { /*493, WINED3DTS_WORLDMATRIX(237) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), transform_worldex },
3725 { /*494, WINED3DTS_WORLDMATRIX(238) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), transform_worldex },
3726 { /*495, WINED3DTS_WORLDMATRIX(239) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), transform_worldex },
3727 { /*496, WINED3DTS_WORLDMATRIX(240) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), transform_worldex },
3728 { /*497, WINED3DTS_WORLDMATRIX(241) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), transform_worldex },
3729 { /*498, WINED3DTS_WORLDMATRIX(242) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), transform_worldex },
3730 { /*499, WINED3DTS_WORLDMATRIX(243) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), transform_worldex },
3731 { /*500, WINED3DTS_WORLDMATRIX(244) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), transform_worldex },
3732 { /*501, WINED3DTS_WORLDMATRIX(245) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), transform_worldex },
3733 { /*502, WINED3DTS_WORLDMATRIX(246) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), transform_worldex },
3734 { /*503, WINED3DTS_WORLDMATRIX(247) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), transform_worldex },
3735 { /*504, WINED3DTS_WORLDMATRIX(248) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), transform_worldex },
3736 { /*505, WINED3DTS_WORLDMATRIX(249) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), transform_worldex },
3737 { /*506, WINED3DTS_WORLDMATRIX(250) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), transform_worldex },
3738 { /*507, WINED3DTS_WORLDMATRIX(251) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), transform_worldex },
3739 { /*508, WINED3DTS_WORLDMATRIX(252) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), transform_worldex },
3740 { /*509, WINED3DTS_WORLDMATRIX(253) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), transform_worldex },
3741 { /*510, WINED3DTS_WORLDMATRIX(254) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), transform_worldex },
3742 { /*511, WINED3DTS_WORLDMATRIX(255) */ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), transform_worldex },
3743 /* Various Vertex states follow */
3744 { /* , STATE_STREAMSRC */ STATE_VDECL, vertexdeclaration },
3745 { /* , STATE_VDECL */ STATE_VDECL, vertexdeclaration },
3746 { /* , STATE_VSHADER */ STATE_VDECL, vertexdeclaration },
3747 { /* , STATE_VIEWPORT */ STATE_VIEWPORT, viewport },
3748 { /* , STATE_VERTEXSHADERCONSTANT */ STATE_VERTEXSHADERCONSTANT, shaderconstant },
3749 { /* , STATE_PIXELSHADERCONSTANT */ STATE_VERTEXSHADERCONSTANT, shaderconstant },