ReactOS 0.4.17-dev-934-g091855f
ffp_hlsl.c
Go to the documentation of this file.
1/*
2 * Fixed-function pipeline replacement implemented using HLSL shaders
3 *
4 * Copyright 2006 Jason Green
5 * Copyright 2006-2007 Henri Verbeet
6 * Copyright 2007-2009,2013 Stefan Dösinger for CodeWeavers
7 * Copyright 2009-2011 Henri Verbeet for CodeWeavers
8 * Copyright 2022,2024 Elizabeth Figura for CodeWeavers
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include "wined3d_private.h"
26#include <vkd3d_shader.h>
27
29
30static const char *get_material_colour_source(enum wined3d_material_color_source mcs, const char *material)
31{
32 switch (mcs)
33 {
35 return material;
37 return "i.diffuse";
39 return "i.specular";
40 default:
41 ERR("Invalid material color source %#x.\n", mcs);
42 return "<invalid>";
43 }
44}
45
47 const struct wined3d_ffp_vs_settings *settings, unsigned int idx, bool legacy_lighting)
48{
49 shader_addline(buffer, " diffuse += saturate(dot(dir, normal)) * c.lights[%u].diffuse.xyz * att;\n", idx);
50 if (settings->localviewer)
51 shader_addline(buffer, " t = dot(normal, ffp_normalize(dir - ffp_normalize(ec_pos.xyz)));\n");
52 else
53 shader_addline(buffer, " t = dot(normal, ffp_normalize(dir + float3(0.0, 0.0, -1.0)));\n");
54 if (settings->specular_enable)
55 {
56 shader_addline(buffer, " if (dot(dir, normal) > 0.0 && t > 0.0");
57 if (legacy_lighting)
58 shader_addline(buffer, " && c.material.power > 0.0");
59 shader_addline(buffer, ")\n");
60 shader_addline(buffer, " specular += pow(t, c.material.power) * c.lights[%u].specular * att;\n", idx);
61 }
62}
63
65 const struct wined3d_ffp_vs_settings *settings, bool legacy_lighting)
66{
67 const char *ambient, *diffuse, *specular, *emissive;
68 unsigned int idx = 0;
69
70 if (!settings->lighting)
71 {
72 if (settings->diffuse)
73 shader_addline(buffer, " o.diffuse = i.diffuse;\n");
74 else
75 shader_addline(buffer, " o.diffuse = 1.0;\n");
76 shader_addline(buffer, " o.specular = i.specular;\n");
77 return;
78 }
79
80 shader_addline(buffer, " float3 ambient = c.ambient_colour.xyz;\n");
81 shader_addline(buffer, " float3 diffuse = 0.0;\n");
82 shader_addline(buffer, " float3 dir, dst;\n");
83 shader_addline(buffer, " float att, t, range, falloff, cos_htheta, cos_hphi;\n");
84
85 if (settings->specular_enable)
86 shader_addline(buffer, " float4 specular = 0.0;\n");
87
88 ambient = get_material_colour_source(settings->ambient_source, "c.material.ambient");
89 diffuse = get_material_colour_source(settings->diffuse_source, "c.material.diffuse");
90 specular = get_material_colour_source(settings->specular_source, "c.material.specular");
91 emissive = get_material_colour_source(settings->emissive_source, "c.material.emissive");
92
93 for (unsigned int i = 0; i < settings->point_light_count; ++i)
94 {
95 shader_addline(buffer, " dir = c.lights[%u].position.xyz - ec_pos.xyz;\n", idx);
96 shader_addline(buffer, " dst.z = dot(dir, dir);\n");
97 shader_addline(buffer, " dst.y = sqrt(dst.z);\n");
98 shader_addline(buffer, " dst.x = 1.0;\n");
99
100 shader_addline(buffer, " range = c.lights[%u].packed_params.x;\n", idx);
101
102 if (legacy_lighting)
103 {
104 shader_addline(buffer, " dst.y = (range - dst.y) / range;\n");
105 shader_addline(buffer, " dst.z = dst.y * dst.y;\n");
106 shader_addline(buffer, " if (dst.y > 0.0)\n{\n");
107 shader_addline(buffer, " att = dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
108 }
109 else
110 {
111 shader_addline(buffer, " if (dst.y <= range)\n{\n");
112 shader_addline(buffer, " att = 1.0 / dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
113 }
114 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz * att;\n", idx);
115 if (settings->normal)
116 {
117 shader_addline(buffer, " dir = ffp_normalize(dir);\n");
118 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
119 }
120 shader_addline(buffer, " }\n");
121
122 ++idx;
123 }
124
125 for (unsigned int i = 0; i < settings->spot_light_count; ++i)
126 {
127 shader_addline(buffer, " dir = c.lights[%u].position.xyz - ec_pos.xyz;\n", idx);
128 shader_addline(buffer, " dst.z = dot(dir, dir);\n");
129 shader_addline(buffer, " dst.y = sqrt(dst.z);\n");
130 shader_addline(buffer, " dst.x = 1.0;\n");
131
132 shader_addline(buffer, " range = c.lights[%u].packed_params.x;\n", idx);
133 shader_addline(buffer, " falloff = c.lights[%u].packed_params.y;\n", idx);
134 shader_addline(buffer, " cos_htheta = c.lights[%u].packed_params.z;\n", idx);
135 shader_addline(buffer, " cos_hphi = c.lights[%u].packed_params.w;\n", idx);
136
137 if (legacy_lighting)
138 {
139 shader_addline(buffer, " dst.y = (range - dst.y) / range;\n");
140 shader_addline(buffer, " dst.z = dst.y * dst.y;\n");
141 shader_addline(buffer, " if (dst.y > 0.0)\n{\n");
142 }
143 else
144 {
145 shader_addline(buffer, " if (dst.y <= range)\n{\n");
146 }
147 shader_addline(buffer, " dir = ffp_normalize(dir);\n");
148 shader_addline(buffer, " t = dot(-dir, ffp_normalize(c.lights[%u].direction.xyz));\n", idx);
149 shader_addline(buffer, " if (t > cos_htheta) att = 1.0;\n");
150 shader_addline(buffer, " else if (t <= cos_hphi) att = 0.0;\n");
151 shader_addline(buffer, " else att = pow((t - cos_hphi) / (cos_htheta - cos_hphi), falloff);\n");
152 if (legacy_lighting)
153 shader_addline(buffer, " att *= dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
154 else
155 shader_addline(buffer, " att /= dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
156 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz * att;\n", idx);
157 if (settings->normal)
158 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
159 shader_addline(buffer, " }\n");
160
161 ++idx;
162 }
163
164 for (unsigned int i = 0; i < settings->directional_light_count; ++i)
165 {
166 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz;\n", idx);
167 if (settings->normal)
168 {
169 shader_addline(buffer, " att = 1.0;\n");
170 shader_addline(buffer, " dir = ffp_normalize(c.lights[%u].direction.xyz);\n", idx);
171 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
172 }
173
174 ++idx;
175 }
176
177 for (unsigned int i = 0; i < settings->parallel_point_light_count; ++i)
178 {
179 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz;\n", idx);
180 if (settings->normal)
181 {
182 shader_addline(buffer, " att = 1.0;\n");
183 shader_addline(buffer, " dir = ffp_normalize(c.lights[%u].position.xyz);\n", idx);
184 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
185 }
186
187 ++idx;
188 }
189
190 shader_addline(buffer, " o.diffuse.xyz = %s.xyz * ambient + %s.xyz * diffuse + %s.xyz;\n",
191 ambient, diffuse, emissive);
192 shader_addline(buffer, " o.diffuse.w = %s.w;\n", diffuse);
193 if (settings->specular_enable)
194 shader_addline(buffer, " o.specular = %s * specular;\n", specular);
195 else
196 shader_addline(buffer, " o.specular = i.specular;\n");
197}
198
200 struct wined3d_string_buffer *buffer, bool legacy_lighting)
201{
202 struct wined3d_string_buffer texcoord;
203
204 /* This must be kept in sync with struct wined3d_ffp_vs_constants. */
205 shader_addline(buffer, "uniform struct\n");
206 shader_addline(buffer, "{\n");
207 shader_addline(buffer, " float4x4 modelview_matrices[%u];\n", MAX_VERTEX_BLENDS);
208 shader_addline(buffer, " float4x4 projection_matrix;\n");
209 shader_addline(buffer, " float4x4 texture_matrices[%u];\n", WINED3D_MAX_FFP_TEXTURES);
210 shader_addline(buffer, " float4 point_params;\n");
211 shader_addline(buffer, " struct\n");
212 shader_addline(buffer, " {\n");
213 shader_addline(buffer, " float4 diffuse;\n");
214 shader_addline(buffer, " float4 ambient;\n");
215 shader_addline(buffer, " float4 specular;\n");
216 shader_addline(buffer, " float4 emissive;\n");
217 shader_addline(buffer, " float power;\n");
218 shader_addline(buffer, " } material;\n");
219 shader_addline(buffer, " float4 ambient_colour;\n");
220 shader_addline(buffer, " struct\n");
221 shader_addline(buffer, " {\n");
222 shader_addline(buffer, " float4 diffuse, specular, ambient;\n");
223 shader_addline(buffer, " float4 position, direction;\n");
224 shader_addline(buffer, " float4 packed_params;\n");
225 shader_addline(buffer, " float4 attenuation;\n");
226 shader_addline(buffer, " } lights[%u];\n", WINED3D_MAX_ACTIVE_LIGHTS);
227 shader_addline(buffer, "} c;\n");
228
229 shader_addline(buffer, "struct input\n");
230 shader_addline(buffer, "{\n");
231 shader_addline(buffer, " float4 pos : POSITION;\n");
232 shader_addline(buffer, " float4 blend_weight : BLENDWEIGHT;\n");
233 shader_addline(buffer, " uint blend_indices : BLENDINDICES;\n");
234 shader_addline(buffer, " float3 normal : NORMAL;\n");
235 shader_addline(buffer, " float point_size : PSIZE;\n");
236 shader_addline(buffer, " float4 diffuse : COLOR0;\n");
237 shader_addline(buffer, " float4 specular : COLOR1;\n");
238 shader_addline(buffer, " float4 texcoord[%u] : TEXCOORD;\n", WINED3D_MAX_FFP_TEXTURES);
239 shader_addline(buffer, "};\n\n");
240
241 shader_addline(buffer, "struct output\n");
242 shader_addline(buffer, "{\n");
243 shader_addline(buffer, " float4 pos : POSITION;\n");
244 shader_addline(buffer, " float4 diffuse : COLOR0;\n");
245 shader_addline(buffer, " float4 specular : COLOR1;\n");
246 for (unsigned int i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
247 {
248 if (((settings->texgen[i] & 0xffff0000) != WINED3DTSS_TCI_PASSTHRU) || (settings->texcoords & (1u << i)))
249 shader_addline(buffer, " float4 texcoord%u : TEXCOORD%u;\n", i, i);
250 }
252 shader_addline(buffer, " float fogcoord : FOG;\n");
253 shader_addline(buffer, " float point_size : PSIZE;\n");
254 shader_addline(buffer, "};\n\n");
255
256 shader_addline(buffer, "float3 ffp_normalize(float3 n)\n{\n");
257 shader_addline(buffer, " float lensq = dot(n, n);\n");
258 shader_addline(buffer, " return lensq == 0.0 ? n : (n * rsqrt(lensq));\n");
259 shader_addline(buffer, "}\n\n");
260
261 shader_addline(buffer, "void main(in struct input i, out struct output o)\n");
262 shader_addline(buffer, "{\n");
263
264 shader_addline(buffer, " i.blend_weight[%u] = 1.0;\n", settings->vertexblends);
265
266 if (settings->transformed)
267 {
268 shader_addline(buffer, " float4 ec_pos = float4(i.pos.xyz, 1.0);\n");
269 /* We reuse the projection matrix to undo the transformation from clip
270 * coordinates to pixel coordinates. */
271 shader_addline(buffer, " float4 out_pos = mul(c.projection_matrix, ec_pos);\n\n");
272
273 /* Use a ternary; this is not the most natural way to write it but is
274 * nicer to the compiler. */
275 shader_addline(buffer, " o.pos = (i.pos.w == 0.0 ? out_pos : out_pos / i.pos.w);\n");
276 }
277 else
278 {
279 for (unsigned int i = 0; i < settings->vertexblends; ++i)
280 shader_addline(buffer, " i.blend_weight[%u] -= i.blend_weight[%u];\n", settings->vertexblends, i);
281
282 shader_addline(buffer, " float4 ec_pos = 0.0;\n\n");
283 for (unsigned int i = 0; i < settings->vertexblends + 1; ++i)
284 shader_addline(buffer, " ec_pos += i.blend_weight[%u] * mul(c.modelview_matrices[%u], float4(i.pos.xyz, 1.0));\n", i, i);
285
286 shader_addline(buffer, " o.pos = mul(c.projection_matrix, ec_pos);\n");
287 shader_addline(buffer, " ec_pos /= ec_pos.w;\n\n");
288 }
289
290 shader_addline(buffer, " float3 normal = 0.0;\n");
291 if (settings->normal)
292 {
293 if (!settings->vertexblends)
294 {
295 if (settings->transformed)
296 shader_addline(buffer, " normal = i.normal;\n");
297 else
298 shader_addline(buffer, " normal = mul((float3x3)c.modelview_matrices[1], i.normal);\n");
299 }
300 else
301 {
302 for (unsigned int i = 0; i < settings->vertexblends + 1; ++i)
303 {
304 if (settings->transformed)
305 shader_addline(buffer, " normal += i.blend_weight[%u] * i.normal;\n", i);
306 else
307 shader_addline(buffer, " normal += i.blend_weight[%u]"
308 " * mul((float3x3)c.modelview_matrices[%u], i.normal);\n", i, i);
309 }
310 }
311
312 if (settings->normalize)
313 shader_addline(buffer, " normal = ffp_normalize(normal);\n");
314 }
315
316 generate_lighting(buffer, settings, legacy_lighting);
317
318 string_buffer_init(&texcoord);
319 for (unsigned int i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
320 {
321 string_buffer_clear(&texcoord);
322
323 switch (settings->texgen[i] & 0xffff0000)
324 {
326 if (settings->texcoords & (1u << i))
327 shader_addline(&texcoord, "i.texcoord[%u]", settings->texgen[i] & 0x0000ffff);
328 else
329 continue;
330 break;
331
332 default:
333 FIXME("Unhandled texgen %#x.\n", settings->texgen[i]);
334 break;
335 }
336
337 if (settings->transformed)
338 shader_addline(buffer, " o.texcoord%u = %s;\n", i, texcoord.buffer);
339 else
340 shader_addline(buffer, " o.texcoord%u = mul(c.texture_matrices[%u], %s);\n", i, i, texcoord.buffer);
341 }
342 string_buffer_free(&texcoord);
343
344 switch (settings->fog_mode)
345 {
347 break;
348
350 /* This is FOGTABLEMODE == NONE, FOGVERTEXMODE == NONE.
351 * The specular W is used in that case, even if we output fogcoord,
352 * so there's no point in outputting fogcoord. */
353 break;
354
356 shader_addline(buffer, " o.fogcoord = length(ec_pos.xyz);\n");
357 break;
358
360 if (settings->transformed)
361 shader_addline(buffer, " o.fogcoord = ec_pos.z;\n");
362 else
363 shader_addline(buffer, " o.fogcoord = abs(o.pos.z);\n");
364 break;
365 }
366
367 shader_addline(buffer, " o.point_size = %s / sqrt(c.point_params.x"
368 " + c.point_params.y * length(ec_pos.xyz)"
369 " + c.point_params.z * dot(ec_pos.xyz, ec_pos.xyz));\n",
370 settings->per_vertex_point_size ? "i.point_size" : "c.point_params.w");
371
372 shader_addline(buffer, "}\n");
373
374 return true;
375}
376
378 unsigned int argnum, unsigned int stage, unsigned int arg)
379{
380 const char *ret;
381
382 if (arg == ARG_UNUSED)
383 return "<unused arg>";
384
385 switch (arg & WINED3DTA_SELECTMASK)
386 {
388 ret = "i.diffuse";
389 break;
390
392 ret = "ret";
393 break;
394
396 switch (stage)
397 {
398 case 0: ret = "tex0"; break;
399 case 1: ret = "tex1"; break;
400 case 2: ret = "tex2"; break;
401 case 3: ret = "tex3"; break;
402 case 4: ret = "tex4"; break;
403 case 5: ret = "tex5"; break;
404 case 6: ret = "tex6"; break;
405 case 7: ret = "tex7"; break;
406 default:
407 ret = "<invalid texture>";
408 break;
409 }
410 break;
411
413 ret = "c.texture_factor";
414 break;
415
417 ret = "i.specular";
418 break;
419
420 case WINED3DTA_TEMP:
421 ret = "temp_reg";
422 break;
423
425 switch (stage)
426 {
427 case 0: ret = "c.texture_constants[0]"; break;
428 case 1: ret = "c.texture_constants[1]"; break;
429 case 2: ret = "c.texture_constants[2]"; break;
430 case 3: ret = "c.texture_constants[3]"; break;
431 case 4: ret = "c.texture_constants[4]"; break;
432 case 5: ret = "c.texture_constants[5]"; break;
433 case 6: ret = "c.texture_constants[6]"; break;
434 case 7: ret = "c.texture_constants[7]"; break;
435 default:
436 ret = "<invalid constant>";
437 break;
438 }
439 break;
440
441 default:
442 return "<unhandled arg>";
443 }
444
446 {
447 shader_addline(buffer, " arg%u = 1.0 - %s;\n", argnum, ret);
448 if (argnum == 0)
449 ret = "arg0";
450 else if (argnum == 1)
451 ret = "arg1";
452 else if (argnum == 2)
453 ret = "arg2";
454 }
455
457 {
458 shader_addline(buffer, " arg%u = %s.w;\n", argnum, ret);
459 if (argnum == 0)
460 ret = "arg0";
461 else if (argnum == 1)
462 ret = "arg1";
463 else if (argnum == 2)
464 ret = "arg2";
465 }
466
467 return ret;
468}
469
470static void generate_fragment_op(struct wined3d_string_buffer *buffer, unsigned int stage, bool color,
471 bool alpha, bool tmp_dst, unsigned int op, unsigned int dw_arg0, unsigned int dw_arg1, unsigned int dw_arg2)
472{
473 const char *dstmask, *dstreg, *arg0, *arg1, *arg2;
474
475 if (color && alpha)
476 dstmask = "";
477 else if (color)
478 dstmask = ".xyz";
479 else
480 dstmask = ".w";
481
482 dstreg = tmp_dst ? "temp_reg" : "ret";
483
484 arg0 = get_fragment_op_arg(buffer, 0, stage, dw_arg0);
485 arg1 = get_fragment_op_arg(buffer, 1, stage, dw_arg1);
486 arg2 = get_fragment_op_arg(buffer, 2, stage, dw_arg2);
487
488 switch (op)
489 {
491 break;
492
494 shader_addline(buffer, " %s%s = %s%s;\n", dstreg, dstmask, arg1, dstmask);
495 break;
496
498 shader_addline(buffer, " %s%s = %s%s;\n", dstreg, dstmask, arg2, dstmask);
499 break;
500
502 shader_addline(buffer, " %s%s = %s%s * %s%s;\n", dstreg, dstmask, arg1, dstmask, arg2, dstmask);
503 break;
504
506 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s * 4.0);\n",
507 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
508 break;
509
511 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s * 2.0);\n",
512 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
513 break;
514
515 case WINED3D_TOP_ADD:
516 shader_addline(buffer, " %s%s = saturate(%s%s + %s%s);\n",
517 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
518 break;
519
521 shader_addline(buffer, " %s%s = saturate(%s%s + (%s - 0.5)%s);\n",
522 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
523 break;
524
526 shader_addline(buffer, " %s%s = saturate((%s%s + (%s - 0.5)%s) * 2.0);\n",
527 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
528 break;
529
531 shader_addline(buffer, " %s%s = saturate(%s%s - %s%s);\n",
532 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
533 break;
534
536 shader_addline(buffer, " %s%s = saturate((1.0 - %s)%s * %s%s + %s%s);\n",
537 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg1, dstmask);
538 break;
539
542 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
543 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
544 break;
545
548 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
549 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
550 break;
551
554 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
555 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
556 break;
557
560 shader_addline(buffer, " %s%s = saturate(%s%s * (1.0 - %s.w) + %s%s);\n",
561 dstreg, dstmask, arg2, dstmask, arg0, arg1, dstmask);
562 break;
563
566 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
567 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
568 break;
569
571 shader_addline(buffer, " %s%s = saturate(%s%s * %s.w + %s%s);\n",
572 dstreg, dstmask, arg2, dstmask, arg1, arg1, dstmask);
573 break;
574
576 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s + %s.w);\n",
577 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg1);
578 break;
579
581 shader_addline(buffer, " %s%s = saturate(%s%s * (1.0 - %s.w) + %s%s);\n",
582 dstreg, dstmask, arg2, dstmask, arg1, arg1, dstmask);
583 break;
585 shader_addline(buffer, " %s%s = saturate((1.0 - %s)%s * %s%s + %s.w);\n",
586 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg1);
587 break;
588
591 /* These are handled in the first pass, nothing to do. */
592 break;
593
595 shader_addline(buffer, " %s%s = saturate(dot(%s.xyz - 0.5, %s.xyz - 0.5) * 4.0);\n",
596 dstreg, dstmask, arg1, arg2);
597 break;
598
600 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s + %s%s);\n",
601 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg0, dstmask);
602 break;
603
604 case WINED3D_TOP_LERP:
605 /* MSDN isn't quite right here. */
606 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s%s);\n",
607 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0, dstmask);
608 break;
609
610 default:
611 FIXME("Unhandled operation %#x.\n", op);
612 break;
613 }
614}
615
618{
619 uint8_t tex_map = 0;
620 unsigned int i;
621
622 /* Find out which textures are read. */
623 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
624 {
625 unsigned int arg0, arg1, arg2;
626
627 if (settings->op[i].cop == WINED3D_TOP_DISABLE)
628 break;
629
630 arg0 = settings->op[i].carg0 & WINED3DTA_SELECTMASK;
631 arg1 = settings->op[i].carg1 & WINED3DTA_SELECTMASK;
632 arg2 = settings->op[i].carg2 & WINED3DTA_SELECTMASK;
633
635 || (i == 0 && settings->color_key_enabled))
636 tex_map |= 1u << i;
637
638 switch (settings->op[i].cop)
639 {
644 tex_map |= 1u << i;
645 break;
646
647 default:
648 break;
649 }
650
651 if (settings->op[i].aop == WINED3D_TOP_DISABLE)
652 continue;
653
654 arg0 = settings->op[i].aarg0 & WINED3DTA_SELECTMASK;
655 arg1 = settings->op[i].aarg1 & WINED3DTA_SELECTMASK;
656 arg2 = settings->op[i].aarg2 & WINED3DTA_SELECTMASK;
657
659 tex_map |= 1u << i;
660 }
661
662 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
663 {
664 const char *sampler_type;
665
666 if (!(tex_map & (1u << i)))
667 continue;
668
669 switch (settings->op[i].tex_type)
670 {
672 sampler_type = "1D";
673 break;
675 sampler_type = "2D";
676 break;
678 sampler_type = "3D";
679 break;
681 sampler_type = "CUBE";
682 break;
683 default:
684 FIXME("Unhandled sampler type %#x.\n", settings->op[i].tex_type);
685 sampler_type = NULL;
686 break;
687 }
688 if (sampler_type)
689 shader_addline(buffer, "sampler%s ps_sampler%u : register(s%u);\n", sampler_type, i, i);
690
691 shader_addline(buffer, "static float4 tex%u;\n", i);
692 }
693
694 /* This must be kept in sync with struct wined3d_ffp_vs_constants. */
695 shader_addline(buffer, "uniform struct\n");
696 shader_addline(buffer, "{\n");
697 shader_addline(buffer, " float4 texture_constants[%u];\n", WINED3D_MAX_FFP_TEXTURES);
698 shader_addline(buffer, " float4 texture_factor;\n");
699 shader_addline(buffer, " float4 specular_enable;\n");
700 shader_addline(buffer, " float4 color_key[2];\n");
701 /* Bumpenv constants are manually packed. */
702 shader_addline(buffer, " float4 bumpenv_matrices[%u];\n", WINED3D_MAX_FFP_TEXTURES);
703 shader_addline(buffer, " float4 bumpenv_lscale[2];\n");
704 shader_addline(buffer, " float4 bumpenv_loffset[2];\n");
705 shader_addline(buffer, "} c;\n");
706
707 shader_addline(buffer, "struct input\n");
708 shader_addline(buffer, "{\n");
709 shader_addline(buffer, " float4 pos : POSITION;\n");
710 shader_addline(buffer, " float4 diffuse : COLOR0;\n");
711 shader_addline(buffer, " float4 specular : COLOR1;\n");
712 shader_addline(buffer, " float4 texcoord[%u] : TEXCOORD;\n", WINED3D_MAX_FFP_TEXTURES);
713 shader_addline(buffer, "};\n\n");
714
715 shader_addline(buffer, "struct output\n");
716 shader_addline(buffer, "{\n");
717 shader_addline(buffer, " float4 colour : COLOR;\n");
718 shader_addline(buffer, "};\n\n");
719
720 shader_addline(buffer, "void main(in struct input i, out struct output o)\n");
721 shader_addline(buffer, "{\n");
722
723 shader_addline(buffer, " float4 texcoord[%u];\n", WINED3D_MAX_FFP_TEXTURES);
724 shader_addline(buffer, " float4 temp_reg = 0.0;\n\n");
725 shader_addline(buffer, " float4 ret, arg0, arg1, arg2;\n\n");
726
727 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
728 {
729 if (tex_map & (1u << i))
730 {
731 if (settings->pointsprite || (settings->texcoords_initialized & (1u << i)))
732 shader_addline(buffer, " texcoord[%u] = i.texcoord[%u];\n", i, i);
733 else
734 shader_addline(buffer, " texcoord[%u] = 0.0;\n", i);
735 }
736 }
737
738 /* Texture sampling. */
739
740 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES && settings->op[i].cop != WINED3D_TOP_DISABLE; ++i)
741 {
742 const char *texture_function, *coord_mask;
743 bool proj;
744
745 if (!(tex_map & (1u << i)))
746 continue;
747
748 if (settings->op[i].projected == WINED3D_PROJECTION_NONE)
749 {
750 proj = false;
751 }
752 else if (settings->op[i].projected == WINED3D_PROJECTION_COUNT4
753 || settings->op[i].projected == WINED3D_PROJECTION_COUNT3)
754 {
755 proj = true;
756 }
757 else
758 {
759 FIXME("Unexpected projection mode %d.\n", settings->op[i].projected);
760 proj = true;
761 }
762
763 switch (settings->op[i].tex_type)
764 {
766 texture_function = "tex1D";
767 coord_mask = "x";
768 break;
770 texture_function = "tex2D";
771 coord_mask = "xy";
772 break;
774 texture_function = "tex3D";
775 coord_mask = "xyz";
776 break;
778 texture_function = "texCUBE";
779 coord_mask = "xyz";
780 break;
781 default:
782 FIXME("Unhandled texture type %#x.\n", settings->op[i].tex_type);
783 texture_function = "";
784 coord_mask = "xyzw";
785 proj = false;
786 break;
787 }
788
789 if (proj)
790 coord_mask = "xyzw";
791
792 if (i > 0
793 && (settings->op[i - 1].cop == WINED3D_TOP_BUMPENVMAP
794 || settings->op[i - 1].cop == WINED3D_TOP_BUMPENVMAP_LUMINANCE))
795 {
796 shader_addline(buffer, "ret.xy = mul(transpose((float2x2)c.bumpenv_matrices[%u]), tex%u.xy);\n", i - 1, i - 1);
797
798 /* With projective textures, texbem only divides the static texture
799 * coordinate, not the displacement, so multiply the displacement
800 * with the dividing parameter before sampling. */
801 if (settings->op[i].projected != WINED3D_PROJECTION_NONE)
802 {
803 if (settings->op[i].projected == WINED3D_PROJECTION_COUNT4)
804 {
805 shader_addline(buffer, "ret.xy = (ret.xy * texcoord[%u].w) + texcoord[%u].xy;\n", i, i);
806 shader_addline(buffer, "ret.zw = texcoord[%u].ww;\n", i);
807 }
808 else
809 {
810 shader_addline(buffer, "ret.xy = (ret.xy * texcoord[%u].z) + texcoord[%u].xy;\n", i, i);
811 shader_addline(buffer, "ret.zw = texcoord[%u].zz;\n", i);
812 }
813 }
814 else
815 {
816 shader_addline(buffer, "ret = texcoord[%u] + ret.xyxy;\n", i);
817 }
818
819 shader_addline(buffer, "tex%u = %s%s(ps_sampler%u, ret.%s);\n",
820 i, texture_function, proj ? "proj" : "", i, coord_mask);
821
822 if (settings->op[i - 1].cop == WINED3D_TOP_BUMPENVMAP_LUMINANCE)
823 {
824 shader_addline(buffer, "tex%u *= saturate(tex%u.z * c.bumpenv_lscale[%u][%u] + c.bumpenv_loffset[%u][%u]);\n",
825 i, i - 1, (i - 1) / 4, (i - 1) % 4, (i - 1) / 4, (i - 1) % 4);
826 }
827 }
828 else if (settings->op[i].projected == WINED3D_PROJECTION_COUNT3)
829 {
830 shader_addline(buffer, " tex%u = %s%s(ps_sampler%u, texcoord[%u].xyzz);\n",
831 i, texture_function, proj ? "proj" : "", i, i);
832 }
833 else
834 {
835 shader_addline(buffer, " tex%u = %s%s(ps_sampler%u, texcoord[%u].%s);\n",
836 i, texture_function, proj ? "proj" : "", i, i, coord_mask);
837 }
838 }
839
840 if (settings->color_key_enabled)
841 {
842 shader_addline(buffer, " if (all(tex0 >= c.color_key[0]) && all(tex0 < c.color_key[1]))\n");
843 shader_addline(buffer, " discard;\n");
844 }
845
846 shader_addline(buffer, " ret = i.diffuse;\n");
847
848 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
849 {
850 bool op_equal;
851
852 if (settings->op[i].cop == WINED3D_TOP_DISABLE)
853 break;
854
855 if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG1
856 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG1)
857 op_equal = settings->op[i].carg1 == settings->op[i].aarg1;
858 else if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG1
859 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG2)
860 op_equal = settings->op[i].carg1 == settings->op[i].aarg2;
861 else if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG2
862 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG1)
863 op_equal = settings->op[i].carg2 == settings->op[i].aarg1;
864 else if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG2
865 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG2)
866 op_equal = settings->op[i].carg2 == settings->op[i].aarg2;
867 else
868 op_equal = settings->op[i].aop == settings->op[i].cop
869 && settings->op[i].carg0 == settings->op[i].aarg0
870 && settings->op[i].carg1 == settings->op[i].aarg1
871 && settings->op[i].carg2 == settings->op[i].aarg2;
872
873 if (settings->op[i].aop == WINED3D_TOP_DISABLE)
874 {
875 generate_fragment_op(buffer, i, true, false, settings->op[i].tmp_dst,
876 settings->op[i].cop, settings->op[i].carg0,
877 settings->op[i].carg1, settings->op[i].carg2);
878 }
879 else if (op_equal)
880 {
881 generate_fragment_op(buffer, i, true, true, settings->op[i].tmp_dst,
882 settings->op[i].cop, settings->op[i].carg0,
883 settings->op[i].carg1, settings->op[i].carg2);
884 }
885 else if (settings->op[i].cop != WINED3D_TOP_BUMPENVMAP
887 {
888 generate_fragment_op(buffer, i, true, false, settings->op[i].tmp_dst,
889 settings->op[i].cop, settings->op[i].carg0,
890 settings->op[i].carg1, settings->op[i].carg2);
891 generate_fragment_op(buffer, i, false, true, settings->op[i].tmp_dst,
892 settings->op[i].aop, settings->op[i].aarg0,
893 settings->op[i].aarg1, settings->op[i].aarg2);
894 }
895 }
896
897 shader_addline(buffer, " o.colour = i.specular * c.specular_enable + ret;\n");
898
899 shader_addline(buffer, "}\n");
900
901 return true;
902}
903
904static bool compile_hlsl_shader(const struct wined3d_string_buffer *hlsl,
905 struct vkd3d_shader_code *sm1, const char *profile)
906{
909 char *messages;
910 int ret;
911
912 compile_info.source.code = hlsl->buffer;
913 compile_info.source.size = hlsl->content_size;
916 compile_info.log_level = VKD3D_SHADER_LOG_WARNING;
917
918 compile_info.next = &hlsl_source_info;
919 hlsl_source_info.profile = profile;
920
921 ret = vkd3d_shader_compile(&compile_info, sm1, &messages);
922 if (messages && *messages && FIXME_ON(d3d_shader))
923 {
924 const char *ptr, *end, *line;
925
926 FIXME("Shader log:\n");
927 ptr = messages;
928 end = ptr + strlen(ptr);
929 while ((line = wined3d_get_line(&ptr, end)))
930 FIXME(" %.*s", (int)(ptr - line), line);
931 FIXME("\n");
932 }
934
935 if (ret < 0)
936 {
937 ERR("Failed to compile HLSL, ret %d.\n", ret);
938 return false;
939 }
940
941 return true;
942}
943
945 struct wined3d_shader_desc *shader_desc, struct wined3d_device *device)
946{
948 struct vkd3d_shader_code sm1;
949
950 if (!string_buffer_init(&string))
951 return false;
952
954 {
955 string_buffer_free(&string);
956 return false;
957 }
958
959 if (!compile_hlsl_shader(&string, &sm1, "vs_2_a"))
960 {
961 string_buffer_free(&string);
962 return false;
963 }
964 string_buffer_free(&string);
965
966 shader_desc->byte_code = sm1.code;
967 shader_desc->byte_code_size = ~(size_t)0;
968 return true;
969}
970
972{
974 struct vkd3d_shader_code sm1;
975
976 if (!string_buffer_init(&string))
977 return false;
978
980 {
981 string_buffer_free(&string);
982 return false;
983 }
984
985 if (!compile_hlsl_shader(&string, &sm1, "ps_2_a"))
986 {
987 string_buffer_free(&string);
988 return false;
989 }
990 string_buffer_free(&string);
991
992 shader_desc->byte_code = sm1.code;
993 shader_desc->byte_code_size = ~(size_t)0;
994 return true;
995}
struct mke2fs_defaults settings[]
static struct myctx * mcs
Definition: adnstest.c:53
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
UINT op
Definition: effect.c:235
void string_buffer_clear(struct wined3d_string_buffer *buffer)
Definition: shader.c:411
void string_buffer_free(struct wined3d_string_buffer *buffer)
Definition: shader.c:430
BOOL string_buffer_init(struct wined3d_string_buffer *buffer)
Definition: shader.c:417
int shader_addline(struct wined3d_string_buffer *buffer, const char *format,...)
Definition: shader.c:467
unsigned int idx
Definition: utils.c:40
unsigned int size_t
Definition: corecrt.h:203
unsigned char uint8_t
Definition: stdint.h:33
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
static const char * get_fragment_op_arg(struct wined3d_string_buffer *buffer, unsigned int argnum, unsigned int stage, unsigned int arg)
Definition: ffp_hlsl.c:377
static void generate_fragment_op(struct wined3d_string_buffer *buffer, unsigned int stage, bool color, bool alpha, bool tmp_dst, unsigned int op, unsigned int dw_arg0, unsigned int dw_arg1, unsigned int dw_arg2)
Definition: ffp_hlsl.c:470
static void generate_lighting(struct wined3d_string_buffer *buffer, const struct wined3d_ffp_vs_settings *settings, bool legacy_lighting)
Definition: ffp_hlsl.c:64
static bool compile_hlsl_shader(const struct wined3d_string_buffer *hlsl, struct vkd3d_shader_code *sm1, const char *profile)
Definition: ffp_hlsl.c:904
static bool ffp_hlsl_generate_pixel_shader(const struct ffp_frag_settings *settings, struct wined3d_string_buffer *buffer)
Definition: ffp_hlsl.c:616
bool ffp_hlsl_compile_ps(const struct ffp_frag_settings *settings, struct wined3d_shader_desc *shader_desc)
Definition: ffp_hlsl.c:971
static const char * get_material_colour_source(enum wined3d_material_color_source mcs, const char *material)
Definition: ffp_hlsl.c:30
bool ffp_hlsl_compile_vs(const struct wined3d_ffp_vs_settings *settings, struct wined3d_shader_desc *shader_desc, struct wined3d_device *device)
Definition: ffp_hlsl.c:944
static bool ffp_hlsl_generate_vertex_shader(const struct wined3d_ffp_vs_settings *settings, struct wined3d_string_buffer *buffer, bool legacy_lighting)
Definition: ffp_hlsl.c:199
static void generate_lighting_footer(struct wined3d_string_buffer *buffer, const struct wined3d_ffp_vs_settings *settings, unsigned int idx, bool legacy_lighting)
Definition: ffp_hlsl.c:46
GLclampf GLclampf GLclampf alpha
Definition: gl.h:1740
GLuint GLuint end
Definition: gl.h:1545
GLuint buffer
Definition: glext.h:5915
GLuint color
Definition: glext.h:6243
GLuint GLuint GLuint GLuint arg1
Definition: glext.h:9513
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
Definition: glext.h:9514
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define profile
Definition: kernel32.h:12
static PVOID ptr
Definition: dispmode.c:27
float specular[3]
Definition: d3drm.c:3534
float emissive[3]
Definition: d3drm.c:3535
#define FIXME_ON(ch)
Definition: debug.h:418
Definition: devices.h:37
Definition: parser.c:49
const void * code
Definition: vkd3d_shader.h:413
struct vkd3d_shader_code source
enum vkd3d_shader_log_level log_level
enum vkd3d_shader_structure_type type
enum vkd3d_shader_source_type source_type
enum vkd3d_shader_target_type target_type
enum vkd3d_shader_structure_type type
const DWORD * byte_code
Definition: wined3d.h:2105
size_t byte_code_size
Definition: wined3d.h:2106
@ VKD3D_SHADER_SOURCE_HLSL
@ VKD3D_SHADER_LOG_WARNING
@ VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO
Definition: vkd3d_shader.h:68
@ VKD3D_SHADER_STRUCTURE_TYPE_HLSL_SOURCE_INFO
Definition: vkd3d_shader.h:84
VKD3D_SHADER_API int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages)
@ VKD3D_SHADER_TARGET_D3D_BYTECODE
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
#define WINED3DTA_TEMP
Definition: wined3d.h:886
#define WINED3DTA_SPECULAR
Definition: wined3d.h:885
#define WINED3DTA_COMPLEMENT
Definition: wined3d.h:888
wined3d_material_color_source
Definition: wined3d.h:520
@ WINED3D_MCS_COLOR2
Definition: wined3d.h:523
@ WINED3D_MCS_MATERIAL
Definition: wined3d.h:521
@ WINED3D_MCS_COLOR1
Definition: wined3d.h:522
#define WINED3DTA_SELECTMASK
Definition: wined3d.h:880
#define WINED3DTA_TFACTOR
Definition: wined3d.h:884
#define WINED3DTSS_TCI_PASSTHRU
Definition: wined3d.h:874
#define WINED3DTA_CURRENT
Definition: wined3d.h:882
@ WINED3D_TOP_SELECT_ARG1
Definition: wined3d.h:629
@ WINED3D_TOP_DISABLE
Definition: wined3d.h:628
@ WINED3D_TOP_BLEND_DIFFUSE_ALPHA
Definition: wined3d.h:639
@ WINED3D_TOP_ADD
Definition: wined3d.h:634
@ WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM
Definition: wined3d.h:642
@ WINED3D_TOP_BLEND_CURRENT_ALPHA
Definition: wined3d.h:643
@ WINED3D_TOP_ADD_SIGNED_2X
Definition: wined3d.h:636
@ WINED3D_TOP_MODULATE_INVCOLOR_ADD_ALPHA
Definition: wined3d.h:648
@ WINED3D_TOP_MULTIPLY_ADD
Definition: wined3d.h:652
@ WINED3D_TOP_MODULATE_INVALPHA_ADD_COLOR
Definition: wined3d.h:647
@ WINED3D_TOP_SUBTRACT
Definition: wined3d.h:637
@ WINED3D_TOP_BUMPENVMAP_LUMINANCE
Definition: wined3d.h:650
@ WINED3D_TOP_MODULATE_COLOR_ADD_ALPHA
Definition: wined3d.h:646
@ WINED3D_TOP_MODULATE
Definition: wined3d.h:631
@ WINED3D_TOP_BUMPENVMAP
Definition: wined3d.h:649
@ WINED3D_TOP_MODULATE_4X
Definition: wined3d.h:633
@ WINED3D_TOP_SELECT_ARG2
Definition: wined3d.h:630
@ WINED3D_TOP_LERP
Definition: wined3d.h:653
@ WINED3D_TOP_MODULATE_ALPHA_ADD_COLOR
Definition: wined3d.h:645
@ WINED3D_TOP_BLEND_TEXTURE_ALPHA
Definition: wined3d.h:640
@ WINED3D_TOP_ADD_SIGNED
Definition: wined3d.h:635
@ WINED3D_TOP_DOTPRODUCT3
Definition: wined3d.h:651
@ WINED3D_TOP_ADD_SMOOTH
Definition: wined3d.h:638
@ WINED3D_TOP_MODULATE_2X
Definition: wined3d.h:632
@ WINED3D_TOP_BLEND_FACTOR_ALPHA
Definition: wined3d.h:641
#define WINED3DTA_ALPHAREPLICATE
Definition: wined3d.h:889
#define WINED3D_LEGACY_FFP_LIGHTING
Definition: wined3d.h:1329
#define WINED3DTA_DIFFUSE
Definition: wined3d.h:881
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
#define WINED3DTA_CONSTANT
Definition: wined3d.h:887
#define WINED3DTA_TEXTURE
Definition: wined3d.h:883
#define ARG_UNUSED
#define WINED3D_MAX_ACTIVE_LIGHTS
static const char * wined3d_get_line(const char **ptr, const char *end)
@ WINED3D_GL_RES_TYPE_TEX_3D
@ WINED3D_GL_RES_TYPE_TEX_CUBE
@ WINED3D_GL_RES_TYPE_TEX_2D
@ WINED3D_GL_RES_TYPE_TEX_1D
@ WINED3D_FFP_VS_FOG_FOGCOORD
@ WINED3D_FFP_VS_FOG_OFF
@ WINED3D_FFP_VS_FOG_DEPTH
@ WINED3D_FFP_VS_FOG_RANGE
#define MAX_VERTEX_BLENDS
@ WINED3D_PROJECTION_COUNT3
@ WINED3D_PROJECTION_NONE
@ WINED3D_PROJECTION_COUNT4