ReactOS 0.4.17-dev-966-gf06eace
shader.c
Go to the documentation of this file.
1/*
2 * Copyright 2002-2003 Jason Edmeades
3 * Copyright 2002-2003 Raphael Junqueira
4 * Copyright 2004 Christian Costa
5 * Copyright 2005 Oliver Stieber
6 * Copyright 2006 Ivan Gyurdiev
7 * Copyright 2007-2008, 2013 Stefan Dösinger for CodeWeavers
8 * Copyright 2009-2011 Henri Verbeet 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 <stdio.h>
26#include <string.h>
27
28#include "wined3d_private.h"
29
31
33{
34 /* pow, mul_high, sub_high, mul_low */
35 {0.41666f, 1.055f, 0.055f, 12.92f},
36 /* cmp */
37 {0.0031308f, 0.0f, 0.0f, 0.0f},
38};
39
40static const char * const shader_opcode_names[] =
41{
42 /* WINED3DSIH_ABS */ "abs",
43 /* WINED3DSIH_ADD */ "add",
44 /* WINED3DSIH_AND */ "and",
45 /* WINED3DSIH_ATOMIC_AND */ "atomic_and",
46 /* WINED3DSIH_ATOMIC_CMP_STORE */ "atomic_cmp_store",
47 /* WINED3DSIH_ATOMIC_IADD */ "atomic_iadd",
48 /* WINED3DSIH_ATOMIC_IMAX */ "atomic_imax",
49 /* WINED3DSIH_ATOMIC_IMIN */ "atomic_imin",
50 /* WINED3DSIH_ATOMIC_OR */ "atomic_or",
51 /* WINED3DSIH_ATOMIC_UMAX */ "atomic_umax",
52 /* WINED3DSIH_ATOMIC_UMIN */ "atomic_umin",
53 /* WINED3DSIH_ATOMIC_XOR */ "atomic_xor",
54 /* WINED3DSIH_BEM */ "bem",
55 /* WINED3DSIH_BFI */ "bfi",
56 /* WINED3DSIH_BFREV */ "bfrev",
57 /* WINED3DSIH_BREAK */ "break",
58 /* WINED3DSIH_BREAKC */ "breakc",
59 /* WINED3DSIH_BREAKP */ "breakp",
60 /* WINED3DSIH_BUFINFO */ "bufinfo",
61 /* WINED3DSIH_CALL */ "call",
62 /* WINED3DSIH_CALLNZ */ "callnz",
63 /* WINED3DSIH_CASE */ "case",
64 /* WINED3DSIH_CMP */ "cmp",
65 /* WINED3DSIH_CND */ "cnd",
66 /* WINED3DSIH_CONTINUE */ "continue",
67 /* WINED3DSIH_CONTINUEP */ "continuec",
68 /* WINED3DSIH_COUNTBITS */ "countbits",
69 /* WINED3DSIH_CRS */ "crs",
70 /* WINED3DSIH_CUT */ "cut",
71 /* WINED3DSIH_CUT_STREAM */ "cut_stream",
72 /* WINED3DSIH_DCL */ "dcl",
73 /* WINED3DSIH_DCL_CONSTANT_BUFFER */ "dcl_constantBuffer",
74 /* WINED3DSIH_DCL_FUNCTION_BODY */ "dcl_function_body",
75 /* WINED3DSIH_DCL_FUNCTION_TABLE */ "dcl_function_table",
76 /* WINED3DSIH_DCL_GLOBAL_FLAGS */ "dcl_globalFlags",
77 /* WINED3DSIH_DCL_GS_INSTANCES */ "dcl_gs_instances",
78 /* WINED3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT */ "dcl_hs_fork_phase_instance_count",
79 /* WINED3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT */ "dcl_hs_join_phase_instance_count",
80 /* WINED3DSIH_DCL_HS_MAX_TESSFACTOR */ "dcl_hs_max_tessfactor",
81 /* WINED3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER */ "dcl_immediateConstantBuffer",
82 /* WINED3DSIH_DCL_INDEX_RANGE */ "dcl_index_range",
83 /* WINED3DSIH_DCL_INDEXABLE_TEMP */ "dcl_indexableTemp",
84 /* WINED3DSIH_DCL_INPUT */ "dcl_input",
85 /* WINED3DSIH_DCL_INPUT_CONTROL_POINT_COUNT */ "dcl_input_control_point_count",
86 /* WINED3DSIH_DCL_INPUT_PRIMITIVE */ "dcl_inputPrimitive",
87 /* WINED3DSIH_DCL_INPUT_PS */ "dcl_input_ps",
88 /* WINED3DSIH_DCL_INPUT_PS_SGV */ "dcl_input_ps_sgv",
89 /* WINED3DSIH_DCL_INPUT_PS_SIV */ "dcl_input_ps_siv",
90 /* WINED3DSIH_DCL_INPUT_SGV */ "dcl_input_sgv",
91 /* WINED3DSIH_DCL_INPUT_SIV */ "dcl_input_siv",
92 /* WINED3DSIH_DCL_INTERFACE */ "dcl_interface",
93 /* WINED3DSIH_DCL_OUTPUT */ "dcl_output",
94 /* WINED3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT */ "dcl_output_control_point_count",
95 /* WINED3DSIH_DCL_OUTPUT_SIV */ "dcl_output_siv",
96 /* WINED3DSIH_DCL_OUTPUT_TOPOLOGY */ "dcl_outputTopology",
97 /* WINED3DSIH_DCL_RESOURCE_RAW */ "dcl_resource_raw",
98 /* WINED3DSIH_DCL_RESOURCE_STRUCTURED */ "dcl_resource_structured",
99 /* WINED3DSIH_DCL_SAMPLER */ "dcl_sampler",
100 /* WINED3DSIH_DCL_STREAM */ "dcl_stream",
101 /* WINED3DSIH_DCL_TEMPS */ "dcl_temps",
102 /* WINED3DSIH_DCL_TESSELLATOR_DOMAIN */ "dcl_tessellator_domain",
103 /* WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE */ "dcl_tessellator_output_primitive",
104 /* WINED3DSIH_DCL_TESSELLATOR_PARTITIONING */ "dcl_tessellator_partitioning",
105 /* WINED3DSIH_DCL_TGSM_RAW */ "dcl_tgsm_raw",
106 /* WINED3DSIH_DCL_TGSM_STRUCTURED */ "dcl_tgsm_structured",
107 /* WINED3DSIH_DCL_THREAD_GROUP */ "dcl_thread_group",
108 /* WINED3DSIH_DCL_UAV_RAW */ "dcl_uav_raw",
109 /* WINED3DSIH_DCL_UAV_STRUCTURED */ "dcl_uav_structured",
110 /* WINED3DSIH_DCL_UAV_TYPED */ "dcl_uav_typed",
111 /* WINED3DSIH_DCL_VERTICES_OUT */ "dcl_maxOutputVertexCount",
112 /* WINED3DSIH_DEF */ "def",
113 /* WINED3DSIH_DEFAULT */ "default",
114 /* WINED3DSIH_DEFB */ "defb",
115 /* WINED3DSIH_DEFI */ "defi",
116 /* WINED3DSIH_DIV */ "div",
117 /* WINED3DSIH_DP2 */ "dp2",
118 /* WINED3DSIH_DP2ADD */ "dp2add",
119 /* WINED3DSIH_DP3 */ "dp3",
120 /* WINED3DSIH_DP4 */ "dp4",
121 /* WINED3DSIH_DST */ "dst",
122 /* WINED3DSIH_DSX */ "dsx",
123 /* WINED3DSIH_DSX_COARSE */ "deriv_rtx_coarse",
124 /* WINED3DSIH_DSX_FINE */ "deriv_rtx_fine",
125 /* WINED3DSIH_DSY */ "dsy",
126 /* WINED3DSIH_DSY_COARSE */ "deriv_rty_coarse",
127 /* WINED3DSIH_DSY_FINE */ "deriv_rty_fine",
128 /* WINED3DSIH_ELSE */ "else",
129 /* WINED3DSIH_EMIT */ "emit",
130 /* WINED3DSIH_EMIT_STREAM */ "emit_stream",
131 /* WINED3DSIH_ENDIF */ "endif",
132 /* WINED3DSIH_ENDLOOP */ "endloop",
133 /* WINED3DSIH_ENDREP */ "endrep",
134 /* WINED3DSIH_ENDSWITCH */ "endswitch",
135 /* WINED3DSIH_EQ */ "eq",
136 /* WINED3DSIH_EVAL_CENTROID */ "eval_centroid",
137 /* WINED3DSIH_EVAL_SAMPLE_INDEX */ "eval_sample_index",
138 /* WINED3DSIH_EXP */ "exp",
139 /* WINED3DSIH_EXPP */ "expp",
140 /* WINED3DSIH_F16TOF32 */ "f16tof32",
141 /* WINED3DSIH_F32TOF16 */ "f32tof16",
142 /* WINED3DSIH_FCALL */ "fcall",
143 /* WINED3DSIH_FIRSTBIT_HI */ "firstbit_hi",
144 /* WINED3DSIH_FIRSTBIT_LO */ "firstbit_lo",
145 /* WINED3DSIH_FIRSTBIT_SHI */ "firstbit_shi",
146 /* WINED3DSIH_FRC */ "frc",
147 /* WINED3DSIH_FTOI */ "ftoi",
148 /* WINED3DSIH_FTOU */ "ftou",
149 /* WINED3DSIH_GATHER4 */ "gather4",
150 /* WINED3DSIH_GATHER4_C */ "gather4_c",
151 /* WINED3DSIH_GATHER4_PO */ "gather4_po",
152 /* WINED3DSIH_GATHER4_PO_C */ "gather4_po_c",
153 /* WINED3DSIH_GE */ "ge",
154 /* WINED3DSIH_HS_CONTROL_POINT_PHASE */ "hs_control_point_phase",
155 /* WINED3DSIH_HS_DECLS */ "hs_decls",
156 /* WINED3DSIH_HS_FORK_PHASE */ "hs_fork_phase",
157 /* WINED3DSIH_HS_JOIN_PHASE */ "hs_join_phase",
158 /* WINED3DSIH_IADD */ "iadd",
159 /* WINED3DSIH_IBFE */ "ibfe",
160 /* WINED3DSIH_IEQ */ "ieq",
161 /* WINED3DSIH_IF */ "if",
162 /* WINED3DSIH_IFC */ "ifc",
163 /* WINED3DSIH_IGE */ "ige",
164 /* WINED3DSIH_ILT */ "ilt",
165 /* WINED3DSIH_IMAD */ "imad",
166 /* WINED3DSIH_IMAX */ "imax",
167 /* WINED3DSIH_IMIN */ "imin",
168 /* WINED3DSIH_IMM_ATOMIC_ALLOC */ "imm_atomic_alloc",
169 /* WINED3DSIH_IMM_ATOMIC_AND */ "imm_atomic_and",
170 /* WINED3DSIH_IMM_ATOMIC_CMP_EXCH */ "imm_atomic_cmp_exch",
171 /* WINED3DSIH_IMM_ATOMIC_CONSUME */ "imm_atomic_consume",
172 /* WINED3DSIH_IMM_ATOMIC_EXCH */ "imm_atomic_exch",
173 /* WINED3DSIH_IMM_ATOMIC_IADD */ "imm_atomic_iadd",
174 /* WINED3DSIH_IMM_ATOMIC_IMAX */ "imm_atomic_imax",
175 /* WINED3DSIH_IMM_ATOMIC_IMIN */ "imm_atomic_imin",
176 /* WINED3DSIH_IMM_ATOMIC_OR */ "imm_atomic_or",
177 /* WINED3DSIH_IMM_ATOMIC_UMAX */ "imm_atomic_umax",
178 /* WINED3DSIH_IMM_ATOMIC_UMIN */ "imm_atomic_umin",
179 /* WINED3DSIH_IMM_ATOMIC_XOR */ "imm_atomic_xor",
180 /* WINED3DSIH_IMUL */ "imul",
181 /* WINED3DSIH_INE */ "ine",
182 /* WINED3DSIH_INEG */ "ineg",
183 /* WINED3DSIH_ISHL */ "ishl",
184 /* WINED3DSIH_ISHR */ "ishr",
185 /* WINED3DSIH_ITOF */ "itof",
186 /* WINED3DSIH_LABEL */ "label",
187 /* WINED3DSIH_LD */ "ld",
188 /* WINED3DSIH_LD2DMS */ "ld2dms",
189 /* WINED3DSIH_LD_RAW */ "ld_raw",
190 /* WINED3DSIH_LD_STRUCTURED */ "ld_structured",
191 /* WINED3DSIH_LD_UAV_TYPED */ "ld_uav_typed",
192 /* WINED3DSIH_LIT */ "lit",
193 /* WINED3DSIH_LOD */ "lod",
194 /* WINED3DSIH_LOG */ "log",
195 /* WINED3DSIH_LOGP */ "logp",
196 /* WINED3DSIH_LOOP */ "loop",
197 /* WINED3DSIH_LRP */ "lrp",
198 /* WINED3DSIH_LT */ "lt",
199 /* WINED3DSIH_M3x2 */ "m3x2",
200 /* WINED3DSIH_M3x3 */ "m3x3",
201 /* WINED3DSIH_M3x4 */ "m3x4",
202 /* WINED3DSIH_M4x3 */ "m4x3",
203 /* WINED3DSIH_M4x4 */ "m4x4",
204 /* WINED3DSIH_MAD */ "mad",
205 /* WINED3DSIH_MAX */ "max",
206 /* WINED3DSIH_MIN */ "min",
207 /* WINED3DSIH_MOV */ "mov",
208 /* WINED3DSIH_MOVA */ "mova",
209 /* WINED3DSIH_MOVC */ "movc",
210 /* WINED3DSIH_MUL */ "mul",
211 /* WINED3DSIH_NE */ "ne",
212 /* WINED3DSIH_NOP */ "nop",
213 /* WINED3DSIH_NOT */ "not",
214 /* WINED3DSIH_NRM */ "nrm",
215 /* WINED3DSIH_OR */ "or",
216 /* WINED3DSIH_PHASE */ "phase",
217 /* WINED3DSIH_POW */ "pow",
218 /* WINED3DSIH_RCP */ "rcp",
219 /* WINED3DSIH_REP */ "rep",
220 /* WINED3DSIH_RESINFO */ "resinfo",
221 /* WINED3DSIH_RET */ "ret",
222 /* WINED3DSIH_RETP */ "retp",
223 /* WINED3DSIH_ROUND_NE */ "round_ne",
224 /* WINED3DSIH_ROUND_NI */ "round_ni",
225 /* WINED3DSIH_ROUND_PI */ "round_pi",
226 /* WINED3DSIH_ROUND_Z */ "round_z",
227 /* WINED3DSIH_RSQ */ "rsq",
228 /* WINED3DSIH_SAMPLE */ "sample",
229 /* WINED3DSIH_SAMPLE_B */ "sample_b",
230 /* WINED3DSIH_SAMPLE_C */ "sample_c",
231 /* WINED3DSIH_SAMPLE_C_LZ */ "sample_c_lz",
232 /* WINED3DSIH_SAMPLE_GRAD */ "sample_d",
233 /* WINED3DSIH_SAMPLE_INFO */ "sample_info",
234 /* WINED3DSIH_SAMPLE_LOD */ "sample_l",
235 /* WINED3DSIH_SAMPLE_POS */ "sample_pos",
236 /* WINED3DSIH_SETP */ "setp",
237 /* WINED3DSIH_SGE */ "sge",
238 /* WINED3DSIH_SGN */ "sgn",
239 /* WINED3DSIH_SINCOS */ "sincos",
240 /* WINED3DSIH_SLT */ "slt",
241 /* WINED3DSIH_SQRT */ "sqrt",
242 /* WINED3DSIH_STORE_RAW */ "store_raw",
243 /* WINED3DSIH_STORE_STRUCTURED */ "store_structured",
244 /* WINED3DSIH_STORE_UAV_TYPED */ "store_uav_typed",
245 /* WINED3DSIH_SUB */ "sub",
246 /* WINED3DSIH_SWAPC */ "swapc",
247 /* WINED3DSIH_SWITCH */ "switch",
248 /* WINED3DSIH_SYNC */ "sync",
249 /* WINED3DSIH_TEX */ "texld",
250 /* WINED3DSIH_TEXBEM */ "texbem",
251 /* WINED3DSIH_TEXBEML */ "texbeml",
252 /* WINED3DSIH_TEXCOORD */ "texcrd",
253 /* WINED3DSIH_TEXDEPTH */ "texdepth",
254 /* WINED3DSIH_TEXDP3 */ "texdp3",
255 /* WINED3DSIH_TEXDP3TEX */ "texdp3tex",
256 /* WINED3DSIH_TEXKILL */ "texkill",
257 /* WINED3DSIH_TEXLDD */ "texldd",
258 /* WINED3DSIH_TEXLDL */ "texldl",
259 /* WINED3DSIH_TEXM3x2DEPTH */ "texm3x2depth",
260 /* WINED3DSIH_TEXM3x2PAD */ "texm3x2pad",
261 /* WINED3DSIH_TEXM3x2TEX */ "texm3x2tex",
262 /* WINED3DSIH_TEXM3x3 */ "texm3x3",
263 /* WINED3DSIH_TEXM3x3DIFF */ "texm3x3diff",
264 /* WINED3DSIH_TEXM3x3PAD */ "texm3x3pad",
265 /* WINED3DSIH_TEXM3x3SPEC */ "texm3x3spec",
266 /* WINED3DSIH_TEXM3x3TEX */ "texm3x3tex",
267 /* WINED3DSIH_TEXM3x3VSPEC */ "texm3x3vspec",
268 /* WINED3DSIH_TEXREG2AR */ "texreg2ar",
269 /* WINED3DSIH_TEXREG2GB */ "texreg2gb",
270 /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb",
271 /* WINED3DSIH_UBFE */ "ubfe",
272 /* WINED3DSIH_UDIV */ "udiv",
273 /* WINED3DSIH_UGE */ "uge",
274 /* WINED3DSIH_ULT */ "ult",
275 /* WINED3DSIH_UMAX */ "umax",
276 /* WINED3DSIH_UMIN */ "umin",
277 /* WINED3DSIH_UMUL */ "umul",
278 /* WINED3DSIH_USHR */ "ushr",
279 /* WINED3DSIH_UTOF */ "utof",
280 /* WINED3DSIH_XOR */ "xor",
281};
282
283static const char * const semantic_names[] =
284{
285 /* WINED3D_DECL_USAGE_POSITION */ "SV_POSITION",
286 /* WINED3D_DECL_USAGE_BLEND_WEIGHT */ "BLENDWEIGHT",
287 /* WINED3D_DECL_USAGE_BLEND_INDICES */ "BLENDINDICES",
288 /* WINED3D_DECL_USAGE_NORMAL */ "NORMAL",
289 /* WINED3D_DECL_USAGE_PSIZE */ "PSIZE",
290 /* WINED3D_DECL_USAGE_TEXCOORD */ "TEXCOORD",
291 /* WINED3D_DECL_USAGE_TANGENT */ "TANGENT",
292 /* WINED3D_DECL_USAGE_BINORMAL */ "BINORMAL",
293 /* WINED3D_DECL_USAGE_TESS_FACTOR */ "TESSFACTOR",
294 /* WINED3D_DECL_USAGE_POSITIONT */ "POSITIONT",
295 /* WINED3D_DECL_USAGE_COLOR */ "COLOR",
296 /* WINED3D_DECL_USAGE_FOG */ "FOG",
297 /* WINED3D_DECL_USAGE_DEPTH */ "DEPTH",
298 /* WINED3D_DECL_USAGE_SAMPLE */ "SAMPLE",
299};
300
302{
303 if (handler_idx >= ARRAY_SIZE(shader_opcode_names))
304 return wine_dbg_sprintf("UNRECOGNIZED(%#x)", handler_idx);
305
306 return shader_opcode_names[handler_idx];
307}
308
310{
311 switch (shader_type)
312 {
325 default:
326 ERR("Invalid shader type %s.\n", debug_shader_type(shader_type));
328 }
329}
330
332{
334 {
335 FIXME("Unrecognized usage %#x.\n", usage);
336 return "UNRECOGNIZED";
337 }
338
339 return semantic_names[usage];
340}
341
343{
344 unsigned int i;
345
346 for (i = 0; i < ARRAY_SIZE(semantic_names); ++i)
347 {
348 if (!strcmp(name, semantic_names[i]))
349 return i;
350 }
351
352 return ~0U;
353}
354
356{
357 switch (usage)
358 {
360 return WINED3D_SV_POSITION;
361 default:
362 return 0;
363 }
364}
365
366BOOL shader_match_semantic(const char *semantic_name, enum wined3d_decl_usage usage)
367{
368 return !strcmp(semantic_name, shader_semantic_name_from_usage(usage));
369}
370
372 const struct wined3d_shader_semantic *s)
373{
374 e->semantic_name = shader_semantic_name_from_usage(s->usage);
375 e->semantic_idx = s->usage_idx;
376 e->stream_idx = 0;
377 e->sysval_semantic = shader_sysval_semantic_from_usage(s->usage);
378 e->component_type = WINED3D_TYPE_FLOAT;
379 e->register_idx = s->reg.reg.idx[0].offset;
380 e->mask = s->reg.write_mask;
381}
382
384 enum wined3d_decl_usage usage, UINT usage_idx, UINT reg_idx, DWORD write_mask)
385{
386 e->semantic_name = shader_semantic_name_from_usage(usage);
387 e->semantic_idx = usage_idx;
388 e->stream_idx = 0;
389 e->sysval_semantic = shader_sysval_semantic_from_usage(usage);
390 e->component_type = WINED3D_TYPE_FLOAT;
391 e->register_idx = reg_idx;
392 e->mask = write_mask;
393}
394
396{
397 switch (source_type)
398 {
400 return &sm1_shader_frontend;
401
403 return &sm4_shader_frontend;
404
405 default:
406 WARN("Invalid source type %#x specified.\n", source_type);
407 return NULL;
408 }
409}
410
412{
413 buffer->buffer[0] = '\0';
414 buffer->content_size = 0;
415}
416
418{
419 buffer->buffer_size = 32;
420 if (!(buffer->buffer = malloc(buffer->buffer_size)))
421 {
422 ERR("Failed to allocate shader buffer memory.\n");
423 return FALSE;
424 }
425
427 return TRUE;
428}
429
431{
432 free(buffer->buffer);
433}
434
436{
437 char *new_buffer;
438 unsigned int new_buffer_size = buffer->buffer_size * 2;
439
440 while (rc > 0 && (unsigned int)rc >= new_buffer_size - buffer->content_size)
441 new_buffer_size *= 2;
442 if (!(new_buffer = realloc(buffer->buffer, new_buffer_size)))
443 {
444 ERR("Failed to grow buffer.\n");
445 buffer->buffer[buffer->content_size] = '\0';
446 return FALSE;
447 }
448 buffer->buffer = new_buffer;
449 buffer->buffer_size = new_buffer_size;
450 return TRUE;
451}
452
454{
455 unsigned int rem;
456 int rc;
457
458 rem = buffer->buffer_size - buffer->content_size;
459 rc = vsnprintf(&buffer->buffer[buffer->content_size], rem, format, args);
460 if (rc < 0 /* C89 */ || (unsigned int)rc >= rem /* C99 */)
461 return rc;
462
463 buffer->content_size += rc;
464 return 0;
465}
466
467int shader_addline(struct wined3d_string_buffer *buffer, const char *format, ...)
468{
470 int ret;
471
472 for (;;)
473 {
476 va_end(args);
477 if (!ret)
478 return ret;
480 return -1;
481 }
482}
483
485{
487
488 if (list_empty(&list->list))
489 {
490 buffer = malloc(sizeof(*buffer));
492 {
493 ERR("Couldn't allocate buffer for temporary string.\n");
494 free(buffer);
495 return NULL;
496 }
497 }
498 else
499 {
501 list_remove(&buffer->entry);
502 }
504 return buffer;
505}
506
508{
509 if (!buffer)
510 return 0;
513}
514
516{
518 int ret;
519
520 for (;;)
521 {
524 va_end(args);
525 if (!ret)
526 return;
528 return;
529 }
530}
531
533{
534 if (!buffer)
535 return;
536 list_add_head(&list->list, &buffer->entry);
537}
538
540{
542}
543
545{
546 struct wined3d_string_buffer *buffer, *buffer_next;
547
549 {
551 free(buffer);
552 }
554}
555
556static void shader_delete_constant_list(struct list *clist)
557{
558 struct wined3d_shader_lconst *constant, *constant_next;
559
560 LIST_FOR_EACH_ENTRY_SAFE(constant, constant_next, clist, struct wined3d_shader_lconst, entry)
561 free(constant);
562 list_init(clist);
563}
564
566{
567 static const struct limits_entry
568 {
569 unsigned int min_version;
570 unsigned int max_version;
571 struct wined3d_shader_limits limits;
572 }
573 vs_limits[] =
574 {
575 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
576 {WINED3D_SHADER_VERSION(1, 0), WINED3D_SHADER_VERSION(1, 1), { 0, 0, 256, 0, 12, 0}},
577 {WINED3D_SHADER_VERSION(2, 0), WINED3D_SHADER_VERSION(2, 1), { 0, 16, 256, 16, 12, 0}},
578 /* DX10 cards on Windows advertise a D3D9 constant limit of 256
579 * even though they are capable of supporting much more (GL
580 * drivers advertise 1024). d3d9.dll and d3d8.dll clamp the
581 * wined3d-advertised maximum. Clamp the constant limit for <= 3.0
582 * shaders to 256. */
583 {WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), { 4, 16, 256, 16, 12, 0}},
584 {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(4, 0), {16, 0, 0, 0, 16, 0}},
585 {WINED3D_SHADER_VERSION(4, 1), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 0}},
586 {0}
587 },
588 hs_limits[] =
589 {
590 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packet_input */
591 {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 32}},
592 },
593 ds_limits[] =
594 {
595 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packet_input */
596 {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 32}},
597 },
598 gs_limits[] =
599 {
600 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
601 {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(4, 0), {16, 0, 0, 0, 32, 16}},
602 {WINED3D_SHADER_VERSION(4, 1), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 32, 32}},
603 {0}
604 },
605 ps_limits[] =
606 {
607 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
608 {WINED3D_SHADER_VERSION(1, 0), WINED3D_SHADER_VERSION(1, 3), { 4, 0, 8, 0, 0, 0}},
609 {WINED3D_SHADER_VERSION(1, 4), WINED3D_SHADER_VERSION(1, 4), { 6, 0, 8, 0, 0, 0}},
610 {WINED3D_SHADER_VERSION(2, 0), WINED3D_SHADER_VERSION(2, 0), {16, 0, 32, 0, 0, 0}},
611 {WINED3D_SHADER_VERSION(2, 1), WINED3D_SHADER_VERSION(2, 1), {16, 16, 32, 16, 0, 0}},
612 {WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), {16, 16, 224, 16, 0, 10}},
613 {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 32}},
614 {0}
615 },
616 cs_limits[] =
617 {
618 /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
619 {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 0}},
620 };
621 const struct limits_entry *limits_array;
622 DWORD shader_version = WINED3D_SHADER_VERSION(shader->reg_maps.shader_version.major,
623 shader->reg_maps.shader_version.minor);
624 int i = 0;
625
626 switch (shader->reg_maps.shader_version.type)
627 {
628 default:
629 FIXME("Unexpected shader type %u found.\n", shader->reg_maps.shader_version.type);
630 /* Fall-through. */
632 limits_array = vs_limits;
633 break;
635 limits_array = hs_limits;
636 break;
638 limits_array = ds_limits;
639 break;
641 limits_array = gs_limits;
642 break;
644 limits_array = ps_limits;
645 break;
647 limits_array = cs_limits;
648 break;
649 }
650
651 while (limits_array[i].min_version && limits_array[i].min_version <= shader_version)
652 {
653 if (shader_version <= limits_array[i].max_version)
654 {
655 shader->limits = &limits_array[i].limits;
656 break;
657 }
658 ++i;
659 }
660 if (!shader->limits)
661 {
662 FIXME("Unexpected shader version \"%u.%u\" (shader type %u).\n",
663 shader->reg_maps.shader_version.major,
664 shader->reg_maps.shader_version.minor,
665 shader->reg_maps.shader_version.type);
666 shader->limits = &limits_array[max(0, i - 1)].limits;
667 }
668}
669
671 const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type, unsigned int constf_size)
672{
673 switch (reg->type)
674 {
675 case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */
677 reg_maps->texcoord |= 1u << reg->idx[0].offset;
678 else
679 reg_maps->address |= 1u << reg->idx[0].offset;
680 break;
681
682 case WINED3DSPR_TEMP:
683 reg_maps->temporary |= 1u << reg->idx[0].offset;
684 break;
685
686 case WINED3DSPR_INPUT:
687 if (reg->idx[0].rel_addr)
688 reg_maps->input_rel_addressing = 1;
690 {
691 /* If relative addressing is used, we must assume that all
692 * registers are used. Even if it is a construct like v3[aL],
693 * we can't assume that v0, v1 and v2 aren't read because aL
694 * can be negative. */
695 if (reg->idx[0].rel_addr)
696 shader->u.ps.input_reg_used = ~0u;
697 else
698 shader->u.ps.input_reg_used |= 1u << reg->idx[0].offset;
699 }
700 else
701 {
702 reg_maps->input_registers |= 1u << reg->idx[0].offset;
703 }
704 break;
705
707 if (reg->idx[0].offset == 1)
708 reg_maps->fog = 1;
709 if (reg->idx[0].offset == 2)
710 reg_maps->point_size = 1;
711 break;
712
715 {
716 if (!reg->idx[0].offset)
717 reg_maps->vpos = 1;
718 else if (reg->idx[0].offset == 1)
719 reg_maps->usesfacing = 1;
720 }
721 break;
722
723 case WINED3DSPR_CONST:
724 if (reg->idx[0].rel_addr)
725 {
726 if (reg->idx[0].offset < reg_maps->min_rel_offset)
727 reg_maps->min_rel_offset = reg->idx[0].offset;
728 if (reg->idx[0].offset > reg_maps->max_rel_offset)
729 reg_maps->max_rel_offset = reg->idx[0].offset;
730 reg_maps->usesrelconstF = TRUE;
731 }
732 else
733 {
734 if (reg->idx[0].offset >= min(shader->limits->constant_float, constf_size))
735 {
736 WARN("Shader using float constant %u which is not supported.\n", reg->idx[0].offset);
737 return FALSE;
738 }
739 else
740 {
741 wined3d_insert_bits(reg_maps->constf, reg->idx[0].offset, 1, 0x1);
742 }
743 }
744 break;
745
747 if (reg->idx[0].offset >= shader->limits->constant_int)
748 {
749 WARN("Shader using integer constant %u which is not supported.\n", reg->idx[0].offset);
750 return FALSE;
751 }
752 else
753 {
754 reg_maps->integer_constants |= (1u << reg->idx[0].offset);
755 }
756 break;
757
759 if (reg->idx[0].offset >= shader->limits->constant_bool)
760 {
761 WARN("Shader using bool constant %u which is not supported.\n", reg->idx[0].offset);
762 return FALSE;
763 }
764 else
765 {
766 reg_maps->boolean_constants |= (1u << reg->idx[0].offset);
767 }
768 break;
769
771 reg_maps->rt_mask |= (1u << reg->idx[0].offset);
772 break;
773
775 reg_maps->vocp = 1;
776 break;
777
779 reg_maps->sample_mask = 1;
780 break;
781
783 reg_maps->stencil_ref = 1;
784 break;
785
786 default:
787 TRACE("Not recording register of type %#x and [%#x][%#x].\n",
788 reg->type, reg->idx[0].offset, reg->idx[1].offset);
789 break;
790 }
791 return TRUE;
792}
793
795 unsigned int resource_idx, unsigned int sampler_idx, unsigned int bind_idx)
796{
797 struct wined3d_shader_sampler_map_entry *entries, *entry;
799 unsigned int i;
800
801 map = &reg_maps->sampler_map;
802 entries = map->entries;
803 for (i = 0; i < map->count; ++i)
804 {
805 if (entries[i].resource_idx == resource_idx && entries[i].sampler_idx == sampler_idx)
806 return;
807 }
808
809 if (!map->size)
810 {
811 if (!(entries = calloc(4, sizeof(*entries))))
812 {
813 ERR("Failed to allocate sampler map entries.\n");
814 return;
815 }
816 map->size = 4;
817 map->entries = entries;
818 }
819 else if (map->count == map->size)
820 {
821 size_t new_size = map->size * 2;
822
823 if (sizeof(*entries) * new_size <= sizeof(*entries) * map->size
824 || !(entries = realloc(entries, sizeof(*entries) * new_size)))
825 {
826 ERR("Failed to resize sampler map entries.\n");
827 return;
828 }
829 map->size = new_size;
830 map->entries = entries;
831 }
832
833 entry = &entries[map->count++];
834 entry->resource_idx = resource_idx;
835 entry->sampler_idx = sampler_idx;
836 entry->bind_idx = bind_idx;
837}
838
839static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
840{
841 switch (instr)
842 {
843 case WINED3DSIH_M4x4:
844 case WINED3DSIH_M3x4:
845 return param == 1 ? 3 : 0;
846
847 case WINED3DSIH_M4x3:
848 case WINED3DSIH_M3x3:
849 return param == 1 ? 2 : 0;
850
851 case WINED3DSIH_M3x2:
852 return param == 1 ? 1 : 0;
853
854 default:
855 return 0;
856 }
857}
858
860 unsigned int register_idx, unsigned int size, unsigned int stride)
861{
862 struct wined3d_shader_tgsm *tgsm;
863
864 if (register_idx >= MAX_TGSM_REGISTERS)
865 {
866 ERR("Invalid TGSM register index %u.\n", register_idx);
867 return S_OK;
868 }
869 if (reg_maps->shader_version.type != WINED3D_SHADER_TYPE_COMPUTE)
870 {
871 FIXME("TGSM declarations are allowed only in compute shaders.\n");
872 return S_OK;
873 }
874
875 if (!wined3d_array_reserve((void **)&reg_maps->tgsm, &reg_maps->tgsm_capacity,
876 register_idx + 1, sizeof(*reg_maps->tgsm)))
877 return E_OUTOFMEMORY;
878
879 reg_maps->tgsm_count = max(register_idx + 1, reg_maps->tgsm_count);
880 tgsm = &reg_maps->tgsm[register_idx];
881 tgsm->size = size;
882 tgsm->stride = stride;
883 return S_OK;
884}
885
887 struct wined3d_shader_phase **current_phase, const struct wined3d_shader_instruction *ins,
888 const DWORD *current_instruction_ptr, const DWORD *previous_instruction_ptr)
889{
890 struct wined3d_shader_phase *phase;
891
892 if ((phase = *current_phase))
893 {
894 phase->end = previous_instruction_ptr;
895 *current_phase = NULL;
896 }
897
898 if (shader->reg_maps.shader_version.type != WINED3D_SHADER_TYPE_HULL)
899 {
900 ERR("Unexpected shader type %s.\n", debug_shader_type(shader->reg_maps.shader_version.type));
901 return E_FAIL;
902 }
903
904 switch (ins->handler_idx)
905 {
907 if (shader->u.hs.phases.control_point)
908 {
909 FIXME("Multiple control point phases.\n");
910 free(shader->u.hs.phases.control_point);
911 }
912 if (!(shader->u.hs.phases.control_point = calloc(1, sizeof(*shader->u.hs.phases.control_point))))
913 return E_OUTOFMEMORY;
914 phase = shader->u.hs.phases.control_point;
915 break;
917 if (!wined3d_array_reserve((void **)&shader->u.hs.phases.fork,
918 &shader->u.hs.phases.fork_size, shader->u.hs.phases.fork_count + 1,
919 sizeof(*shader->u.hs.phases.fork)))
920 return E_OUTOFMEMORY;
921 phase = &shader->u.hs.phases.fork[shader->u.hs.phases.fork_count++];
922 break;
924 if (!wined3d_array_reserve((void **)&shader->u.hs.phases.join,
925 &shader->u.hs.phases.join_size, shader->u.hs.phases.join_count + 1,
926 sizeof(*shader->u.hs.phases.join)))
927 return E_OUTOFMEMORY;
928 phase = &shader->u.hs.phases.join[shader->u.hs.phases.join_count++];
929 break;
930 default:
931 ERR("Unexpected opcode %s.\n", debug_d3dshaderinstructionhandler(ins->handler_idx));
932 return E_FAIL;
933 }
934
935 phase->start = current_instruction_ptr;
936 *current_phase = phase;
937
938 return WINED3D_OK;
939}
940
942 const struct wined3d_shader_signature_element *e, unsigned int *mask)
943{
944 /* Clip and cull distances are packed in 4 component registers. 0 and 1 are
945 * the only allowed semantic indices.
946 */
947 if (e->semantic_idx >= WINED3D_MAX_CLIP_DISTANCES / 4)
948 {
949 *mask = 0;
950 WARN("Invalid clip/cull distance index %u.\n", e->semantic_idx);
952 }
953
954 *mask = (e->mask & WINED3DSP_WRITEMASK_ALL) << (4 * e->semantic_idx);
955 return WINED3D_OK;
956}
957
958static void wined3d_insert_interpolation_mode(uint32_t *packed_interpolation_mode,
959 unsigned int register_idx, enum wined3d_shader_interpolation_mode mode)
960{
962 FIXME("Unexpected interpolation mode %#x.\n", mode);
963
964 wined3d_insert_bits(packed_interpolation_mode,
966}
967
969{
970 const struct wined3d_shader_signature *output_signature = &shader->output_signature;
971 struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
972 unsigned int i;
973 HRESULT hr;
974
975 for (i = 0; i < output_signature->element_count; ++i)
976 {
977 const struct wined3d_shader_signature_element *e = &output_signature->elements[i];
978 unsigned int mask;
979
980 reg_maps->output_registers |= 1u << e->register_idx;
981 if (e->sysval_semantic == WINED3D_SV_CLIP_DISTANCE)
982 {
984 return hr;
985 reg_maps->clip_distance_mask |= mask;
986 }
987 else if (e->sysval_semantic == WINED3D_SV_CULL_DISTANCE)
988 {
990 return hr;
991 reg_maps->cull_distance_mask |= mask;
992 }
993 else if (e->sysval_semantic == WINED3D_SV_VIEWPORT_ARRAY_INDEX)
994 {
995 reg_maps->viewport_array = 1;
996 }
997 }
998
999 return WINED3D_OK;
1000}
1001
1002/* Note that this does not count the loop register as an address register. */
1004{
1005 struct wined3d_shader_signature_element input_signature_elements[max(MAX_ATTRIBS, MAX_REG_INPUT)];
1006 struct wined3d_shader_signature_element output_signature_elements[MAX_REG_OUTPUT];
1007 struct wined3d_shader_signature *output_signature = &shader->output_signature;
1008 struct wined3d_shader_signature *input_signature = &shader->input_signature;
1009 struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
1010 const struct wined3d_shader_frontend *fe = shader->frontend;
1011 unsigned int cur_loop_depth = 0, max_loop_depth = 0;
1012 struct wined3d_shader_version shader_version;
1013 struct wined3d_shader_phase *phase = NULL;
1014 const DWORD *ptr, *prev_ins, *current_ins;
1015 void *fe_data = shader->frontend_data;
1016 unsigned int i;
1017 HRESULT hr;
1018
1019 memset(reg_maps, 0, sizeof(*reg_maps));
1020 memset(input_signature_elements, 0, sizeof(input_signature_elements));
1021 memset(output_signature_elements, 0, sizeof(output_signature_elements));
1022 reg_maps->min_rel_offset = ~0U;
1023 list_init(&reg_maps->indexable_temps);
1024
1025 fe->shader_read_header(fe_data, &ptr, &shader_version);
1026 prev_ins = current_ins = ptr;
1027 reg_maps->shader_version = shader_version;
1028
1030
1031 if (!(reg_maps->constf = calloc(((min(shader->limits->constant_float, constf_size) + 31) / 32),
1032 sizeof(*reg_maps->constf))))
1033 {
1034 ERR("Failed to allocate constant map memory.\n");
1035 return E_OUTOFMEMORY;
1036 }
1037
1038 while (!fe->shader_is_end(fe_data, &ptr))
1039 {
1040 struct wined3d_shader_instruction ins;
1041
1042 current_ins = ptr;
1043 /* Fetch opcode. */
1044 fe->shader_read_instruction(fe_data, &ptr, &ins);
1045
1046 /* Unhandled opcode, and its parameters. */
1048 {
1049 WARN("Encountered unrecognised or invalid instruction.\n");
1051 }
1052
1053 /* Handle declarations. */
1054 if (ins.handler_idx == WINED3DSIH_DCL
1056 {
1057 struct wined3d_shader_semantic *semantic = &ins.declaration.semantic;
1058 unsigned int reg_idx = semantic->reg.reg.idx[0].offset;
1059
1060 switch (semantic->reg.reg.type)
1061 {
1062 /* Mark input registers used. */
1063 case WINED3DSPR_INPUT:
1064 if (reg_idx >= MAX_REG_INPUT)
1065 {
1066 ERR("Invalid input register index %u.\n", reg_idx);
1067 break;
1068 }
1069 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL && shader_version.major == 3
1070 && semantic->usage == WINED3D_DECL_USAGE_POSITION && !semantic->usage_idx)
1072 reg_maps->input_registers |= 1u << reg_idx;
1073 shader_signature_from_semantic(&input_signature_elements[reg_idx], semantic);
1074 break;
1075
1076 /* Vertex shader: mark 3.0 output registers used, save token. */
1077 case WINED3DSPR_OUTPUT:
1078 if (reg_idx >= MAX_REG_OUTPUT)
1079 {
1080 ERR("Invalid output register index %u.\n", reg_idx);
1081 break;
1082 }
1083 reg_maps->output_registers |= 1u << reg_idx;
1084 shader_signature_from_semantic(&output_signature_elements[reg_idx], semantic);
1085 if (semantic->usage == WINED3D_DECL_USAGE_FOG)
1086 reg_maps->fog = 1;
1087 if (semantic->usage == WINED3D_DECL_USAGE_PSIZE)
1088 reg_maps->point_size = 1;
1089 break;
1090
1091 case WINED3DSPR_SAMPLER:
1092 shader_record_sample(reg_maps, reg_idx, reg_idx, reg_idx);
1094 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1095 {
1096 ERR("Invalid resource index %u.\n", reg_idx);
1097 break;
1098 }
1099 reg_maps->resource_info[reg_idx].type = semantic->resource_type;
1100 if (semantic->resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2DMS && semantic->sample_count == 1)
1101 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_TEXTURE_2D;
1102 if (semantic->resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY && semantic->sample_count == 1)
1104 reg_maps->resource_info[reg_idx].data_type = semantic->resource_data_type;
1105 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1106 break;
1107
1108 case WINED3DSPR_UAV:
1109 if (reg_idx >= ARRAY_SIZE(reg_maps->uav_resource_info))
1110 {
1111 ERR("Invalid UAV resource index %u.\n", reg_idx);
1112 break;
1113 }
1114 reg_maps->uav_resource_info[reg_idx].type = semantic->resource_type;
1115 reg_maps->uav_resource_info[reg_idx].data_type = semantic->resource_data_type;
1116 if (ins.flags)
1117 FIXME("Ignoring typed UAV flags %#x.\n", ins.flags);
1118 break;
1119
1120 default:
1121 TRACE("Not recording DCL register type %#x.\n", semantic->reg.reg.type);
1122 break;
1123 }
1124 }
1126 {
1127 struct wined3d_shader_register *reg = &ins.declaration.src.reg;
1128 if (reg->idx[0].offset >= WINED3D_MAX_CBS)
1129 {
1130 ERR("Invalid CB index %u.\n", reg->idx[0].offset);
1131 }
1132 else
1133 {
1134 reg_maps->cb_sizes[reg->idx[0].offset] = reg->idx[1].offset;
1135 wined3d_bitmap_set(&reg_maps->cb_map, reg->idx[0].offset);
1136 }
1137 }
1139 {
1141 {
1142 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1143 shader->u.ps.force_early_depth_stencil = TRUE;
1144 else
1145 FIXME("Invalid instruction %#x for shader type %#x.\n",
1146 ins.handler_idx, shader_version.type);
1147 }
1148 else
1149 {
1150 WARN("Ignoring global flags %#x.\n", ins.flags);
1151 }
1152 }
1154 {
1155 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1156 shader->u.gs.instance_count = ins.declaration.count;
1157 else
1158 FIXME("Invalid instruction %#x for shader type %#x.\n",
1159 ins.handler_idx, shader_version.type);
1160 }
1163 {
1164 if (phase)
1165 phase->instance_count = ins.declaration.count;
1166 else
1167 FIXME("Instruction %s outside of shader phase.\n",
1169 }
1171 {
1172 if (reg_maps->icb)
1173 FIXME("Multiple immediate constant buffers.\n");
1174 reg_maps->icb = ins.declaration.icb;
1175 }
1177 {
1178 if (phase)
1179 {
1180 FIXME("Indexable temporary registers not supported.\n");
1181 }
1182 else
1183 {
1185
1186 if (!(reg = malloc(sizeof(*reg))))
1187 return E_OUTOFMEMORY;
1188
1190 list_add_tail(&reg_maps->indexable_temps, &reg->entry);
1191 }
1192 }
1194 {
1195 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1196 shader->u.gs.input_type = ins.declaration.primitive_type.type;
1197 else
1198 FIXME("Invalid instruction %#x for shader type %#x.\n",
1199 ins.handler_idx, shader_version.type);
1200 }
1201 else if (ins.handler_idx == WINED3DSIH_DCL_INPUT_PS)
1202 {
1203 unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
1204 if (reg_idx >= MAX_REG_INPUT)
1205 {
1206 ERR("Invalid register index %u.\n", reg_idx);
1207 break;
1208 }
1209 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1210 wined3d_insert_interpolation_mode(shader->u.ps.interpolation_mode, reg_idx, ins.flags);
1211 else
1212 FIXME("Invalid instruction %#x for shader type %#x.\n",
1213 ins.handler_idx, shader_version.type);
1214 }
1215 else if (ins.handler_idx == WINED3DSIH_DCL_OUTPUT)
1216 {
1217 if (ins.declaration.dst.reg.type == WINED3DSPR_DEPTHOUT
1218 || ins.declaration.dst.reg.type == WINED3DSPR_DEPTHOUTGE
1219 || ins.declaration.dst.reg.type == WINED3DSPR_DEPTHOUTLE)
1220 {
1221 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1222 shader->u.ps.depth_output = ins.declaration.dst.reg.type;
1223 else
1224 FIXME("Invalid instruction %#x for shader type %#x.\n",
1225 ins.handler_idx, shader_version.type);
1226 }
1227 }
1229 {
1230 if (shader_version.type == WINED3D_SHADER_TYPE_HULL)
1231 shader->u.hs.output_vertex_count = ins.declaration.count;
1232 else
1233 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1234 }
1236 {
1237 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1238 shader->u.gs.output_type = ins.declaration.primitive_type.type;
1239 else
1240 FIXME("Invalid instruction %#x for shader type %#x.\n",
1241 ins.handler_idx, shader_version.type);
1242 }
1244 {
1245 unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
1246 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1247 {
1248 ERR("Invalid resource index %u.\n", reg_idx);
1249 break;
1250 }
1251 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1252 reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1253 reg_maps->resource_info[reg_idx].flags = WINED3D_VIEW_BUFFER_RAW;
1254 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1255 }
1257 {
1258 unsigned int reg_idx = ins.declaration.structured_resource.reg.reg.idx[0].offset;
1259 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1260 {
1261 ERR("Invalid resource index %u.\n", reg_idx);
1262 break;
1263 }
1264 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1265 reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1266 reg_maps->resource_info[reg_idx].flags = 0;
1267 reg_maps->resource_info[reg_idx].stride = ins.declaration.structured_resource.byte_stride / 4;
1268 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1269 }
1270 else if (ins.handler_idx == WINED3DSIH_DCL_SAMPLER)
1271 {
1273 reg_maps->sampler_comparison_mode |= (1u << ins.declaration.dst.reg.idx[0].offset);
1274 }
1275 else if (ins.handler_idx == WINED3DSIH_DCL_TEMPS)
1276 {
1277 if (phase)
1278 phase->temporary_count = ins.declaration.count;
1279 else
1280 reg_maps->temporary_count = ins.declaration.count;
1281 }
1283 {
1284 if (shader_version.type == WINED3D_SHADER_TYPE_DOMAIN)
1285 shader->u.ds.tessellator_domain = ins.declaration.tessellator_domain;
1286 else if (shader_version.type != WINED3D_SHADER_TYPE_HULL)
1287 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1288 }
1290 {
1291 if (shader_version.type == WINED3D_SHADER_TYPE_HULL)
1292 shader->u.hs.tessellator_output_primitive = ins.declaration.tessellator_output_primitive;
1293 else
1294 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1295 }
1297 {
1298 if (shader_version.type == WINED3D_SHADER_TYPE_HULL)
1299 shader->u.hs.tessellator_partitioning = ins.declaration.tessellator_partitioning;
1300 else
1301 FIXME("Invalid instruction %#x for shader type %#x.\n", ins.handler_idx, shader_version.type);
1302 }
1303 else if (ins.handler_idx == WINED3DSIH_DCL_TGSM_RAW)
1304 {
1305 if (FAILED(hr = shader_reg_maps_add_tgsm(reg_maps, ins.declaration.tgsm_raw.reg.reg.idx[0].offset,
1306 ins.declaration.tgsm_raw.byte_count / 4, 0)))
1307 return hr;
1308 }
1310 {
1311 unsigned int stride = ins.declaration.tgsm_structured.byte_stride / 4;
1312 unsigned int size = stride * ins.declaration.tgsm_structured.structure_count;
1313 if (FAILED(hr = shader_reg_maps_add_tgsm(reg_maps,
1314 ins.declaration.tgsm_structured.reg.reg.idx[0].offset, size, stride)))
1315 return hr;
1316 }
1318 {
1319 if (shader_version.type == WINED3D_SHADER_TYPE_COMPUTE)
1320 {
1321 shader->u.cs.thread_group_size = ins.declaration.thread_group_size;
1322 }
1323 else
1324 {
1325 FIXME("Invalid instruction %#x for shader type %#x.\n",
1326 ins.handler_idx, shader_version.type);
1327 }
1328 }
1329 else if (ins.handler_idx == WINED3DSIH_DCL_UAV_RAW)
1330 {
1331 unsigned int reg_idx = ins.declaration.dst.reg.idx[0].offset;
1332 if (reg_idx >= ARRAY_SIZE(reg_maps->uav_resource_info))
1333 {
1334 ERR("Invalid UAV resource index %u.\n", reg_idx);
1335 break;
1336 }
1337 if (ins.flags)
1338 FIXME("Ignoring raw UAV flags %#x.\n", ins.flags);
1339 reg_maps->uav_resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1340 reg_maps->uav_resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1341 reg_maps->uav_resource_info[reg_idx].flags = WINED3D_VIEW_BUFFER_RAW;
1342 }
1344 {
1345 unsigned int reg_idx = ins.declaration.structured_resource.reg.reg.idx[0].offset;
1346 if (reg_idx >= ARRAY_SIZE(reg_maps->uav_resource_info))
1347 {
1348 ERR("Invalid UAV resource index %u.\n", reg_idx);
1349 break;
1350 }
1351 if (ins.flags)
1352 FIXME("Ignoring structured UAV flags %#x.\n", ins.flags);
1353 reg_maps->uav_resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_BUFFER;
1354 reg_maps->uav_resource_info[reg_idx].data_type = WINED3D_DATA_UINT;
1355 reg_maps->uav_resource_info[reg_idx].flags = 0;
1356 reg_maps->uav_resource_info[reg_idx].stride = ins.declaration.structured_resource.byte_stride / 4;
1357 }
1359 {
1360 if (shader_version.type == WINED3D_SHADER_TYPE_GEOMETRY)
1361 shader->u.gs.vertices_out = ins.declaration.count;
1362 else
1363 FIXME("Invalid instruction %#x for shader type %#x.\n",
1364 ins.handler_idx, shader_version.type);
1365 }
1366 else if (ins.handler_idx == WINED3DSIH_DEF)
1367 {
1368 struct wined3d_shader_lconst *lconst;
1369 float *value;
1370
1371 if (!(lconst = malloc(sizeof(*lconst))))
1372 return E_OUTOFMEMORY;
1373
1374 lconst->idx = ins.dst[0].reg.idx[0].offset;
1375 memcpy(lconst->value, ins.src[0].reg.u.immconst_data, 4 * sizeof(DWORD));
1376 value = (float *)lconst->value;
1377
1378 /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */
1379 if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1380 {
1381 if (value[0] < -1.0f) value[0] = -1.0f;
1382 else if (value[0] > 1.0f) value[0] = 1.0f;
1383 if (value[1] < -1.0f) value[1] = -1.0f;
1384 else if (value[1] > 1.0f) value[1] = 1.0f;
1385 if (value[2] < -1.0f) value[2] = -1.0f;
1386 else if (value[2] > 1.0f) value[2] = 1.0f;
1387 if (value[3] < -1.0f) value[3] = -1.0f;
1388 else if (value[3] > 1.0f) value[3] = 1.0f;
1389 }
1390
1391 list_add_head(&shader->constantsF, &lconst->entry);
1392
1393 if (isinf(value[0]) || isnan(value[0]) || isinf(value[1]) || isnan(value[1])
1394 || isinf(value[2]) || isnan(value[2]) || isinf(value[3]) || isnan(value[3]))
1395 {
1396 shader->lconst_inf_or_nan = TRUE;
1397 }
1398 }
1399 else if (ins.handler_idx == WINED3DSIH_DEFI)
1400 {
1401 struct wined3d_shader_lconst *lconst;
1402
1403 if (!(lconst = malloc(sizeof(*lconst))))
1404 return E_OUTOFMEMORY;
1405
1406 lconst->idx = ins.dst[0].reg.idx[0].offset;
1407 memcpy(lconst->value, ins.src[0].reg.u.immconst_data, 4 * sizeof(DWORD));
1408
1409 list_add_head(&shader->constantsI, &lconst->entry);
1410 reg_maps->local_int_consts |= (1u << lconst->idx);
1411 }
1412 else if (ins.handler_idx == WINED3DSIH_DEFB)
1413 {
1414 struct wined3d_shader_lconst *lconst;
1415
1416 if (!(lconst = malloc(sizeof(*lconst))))
1417 return E_OUTOFMEMORY;
1418
1419 lconst->idx = ins.dst[0].reg.idx[0].offset;
1420 memcpy(lconst->value, ins.src[0].reg.u.immconst_data, sizeof(DWORD));
1421
1422 list_add_head(&shader->constantsB, &lconst->entry);
1423 reg_maps->local_bool_consts |= (1u << lconst->idx);
1424 }
1425 /* Handle shader phases. */
1429 {
1430 if (FAILED(hr = shader_record_shader_phase(shader, &phase, &ins, current_ins, prev_ins)))
1431 return hr;
1432 }
1433 /* For subroutine prototypes. */
1434 else if (ins.handler_idx == WINED3DSIH_LABEL)
1435 {
1436 reg_maps->labels |= 1u << ins.src[0].reg.idx[0].offset;
1437 }
1438 /* Set texture, address, temporary registers. */
1439 else
1440 {
1441 BOOL color0_mov = FALSE;
1442 unsigned int i;
1443
1444 /* This will loop over all the registers and try to
1445 * make a bitmask of the ones we're interested in.
1446 *
1447 * Relative addressing tokens are ignored, but that's
1448 * okay, since we'll catch any address registers when
1449 * they are initialized (required by spec). */
1450 for (i = 0; i < ins.dst_count; ++i)
1451 {
1452 if (!shader_record_register_usage(shader, reg_maps, &ins.dst[i].reg,
1453 shader_version.type, constf_size))
1455
1456 if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
1457 {
1458 UINT idx = ins.dst[i].reg.idx[0].offset;
1459
1460 switch (ins.dst[i].reg.type)
1461 {
1462 case WINED3DSPR_RASTOUT:
1463 if (shader_version.major >= 3)
1464 break;
1465 switch (idx)
1466 {
1467 case 0: /* oPos */
1468 reg_maps->output_registers |= 1u << 10;
1469 shader_signature_from_usage(&output_signature_elements[10],
1471 break;
1472
1473 case 1: /* oFog */
1474 reg_maps->output_registers |= 1u << 11;
1475 shader_signature_from_usage(&output_signature_elements[11],
1477 break;
1478
1479 case 2: /* oPts */
1480 reg_maps->output_registers |= 1u << 11;
1481 shader_signature_from_usage(&output_signature_elements[12],
1483 break;
1484 }
1485 break;
1486
1487 case WINED3DSPR_ATTROUT:
1488 if (shader_version.major >= 3)
1489 break;
1490 if (idx < 2)
1491 {
1492 idx += 8;
1493 if (reg_maps->output_registers & (1u << idx))
1494 {
1495 output_signature_elements[idx].mask |= ins.dst[i].write_mask;
1496 }
1497 else
1498 {
1499 reg_maps->output_registers |= 1u << idx;
1500 shader_signature_from_usage(&output_signature_elements[idx],
1501 WINED3D_DECL_USAGE_COLOR, idx - 8, idx, ins.dst[i].write_mask);
1502 }
1503 }
1504 break;
1505
1506 case WINED3DSPR_TEXCRDOUT: /* WINED3DSPR_OUTPUT */
1507 if (shader_version.major >= 3)
1508 {
1509 if (idx >= ARRAY_SIZE(reg_maps->u.output_registers_mask))
1510 {
1511 WARN("Invalid output register index %u.\n", idx);
1512 break;
1513 }
1514 reg_maps->u.output_registers_mask[idx] |= ins.dst[i].write_mask;
1515 break;
1516 }
1517 if (idx >= ARRAY_SIZE(reg_maps->u.texcoord_mask))
1518 {
1519 WARN("Invalid texcoord index %u.\n", idx);
1520 break;
1521 }
1522 reg_maps->u.texcoord_mask[idx] |= ins.dst[i].write_mask;
1523 if (reg_maps->output_registers & (1u << idx))
1524 {
1525 output_signature_elements[idx].mask |= ins.dst[i].write_mask;
1526 }
1527 else
1528 {
1529 reg_maps->output_registers |= 1u << idx;
1530 shader_signature_from_usage(&output_signature_elements[idx],
1531 WINED3D_DECL_USAGE_TEXCOORD, idx, idx, ins.dst[i].write_mask);
1532 }
1533 break;
1534
1535 default:
1536 break;
1537 }
1538 }
1539
1540 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1541 {
1542 if (ins.dst[i].reg.type == WINED3DSPR_COLOROUT && !ins.dst[i].reg.idx[0].offset)
1543 {
1544 /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to
1545 * COLOROUT 0. If we know this in advance, the ARB shader backend can skip
1546 * the mov and perform the sRGB write correction from the source register.
1547 *
1548 * However, if the mov is only partial, we can't do this, and if the write
1549 * comes from an instruction other than MOV it is hard to do as well. If
1550 * COLOROUT 0 is overwritten partially later, the marker is dropped again. */
1551 shader->u.ps.color0_mov = FALSE;
1552 if (ins.handler_idx == WINED3DSIH_MOV
1553 && ins.dst[i].write_mask == WINED3DSP_WRITEMASK_ALL)
1554 {
1555 /* Used later when the source register is read. */
1556 color0_mov = TRUE;
1557 }
1558 }
1559 /* Also drop the MOV marker if the source register is overwritten prior to the shader
1560 * end
1561 */
1562 else if (ins.dst[i].reg.type == WINED3DSPR_TEMP
1563 && ins.dst[i].reg.idx[0].offset == shader->u.ps.color0_reg)
1564 {
1565 shader->u.ps.color0_mov = FALSE;
1566 }
1567 }
1568
1569 /* Declare 1.x samplers implicitly, based on the destination reg. number. */
1570 if (shader_version.major == 1
1571 && (ins.handler_idx == WINED3DSIH_TEX
1582 {
1583 unsigned int reg_idx = ins.dst[i].reg.idx[0].offset;
1584
1585 if (reg_idx >= ARRAY_SIZE(reg_maps->resource_info))
1586 {
1587 WARN("Invalid 1.x sampler index %u.\n", reg_idx);
1588 continue;
1589 }
1590
1591 TRACE("Setting fake 2D resource for 1.x pixelshader.\n");
1592 reg_maps->resource_info[reg_idx].type = WINED3D_SHADER_RESOURCE_TEXTURE_2D;
1593 reg_maps->resource_info[reg_idx].data_type = WINED3D_DATA_FLOAT;
1594 shader_record_sample(reg_maps, reg_idx, reg_idx, reg_idx);
1595 wined3d_bitmap_set(reg_maps->resource_map, reg_idx);
1596
1597 /* texbem is only valid with < 1.4 pixel shaders */
1600 {
1601 reg_maps->bumpmat |= 1u << reg_idx;
1603 {
1604 reg_maps->luminanceparams |= 1u << reg_idx;
1605 }
1606 }
1607 }
1608 else if (ins.handler_idx == WINED3DSIH_BEM)
1609 {
1610 reg_maps->bumpmat |= 1u << ins.dst[i].reg.idx[0].offset;
1611 }
1612 }
1613
1615 {
1616 unsigned int reg_idx = ins.src[0].reg.idx[0].offset;
1617 if (reg_idx >= MAX_UNORDERED_ACCESS_VIEWS)
1618 {
1619 ERR("Invalid UAV index %u.\n", reg_idx);
1620 break;
1621 }
1622 reg_maps->uav_counter_mask |= (1u << reg_idx);
1623 }
1626 || (ins.handler_idx == WINED3DSIH_BUFINFO && ins.src[0].reg.type == WINED3DSPR_UAV)
1628 || (ins.handler_idx == WINED3DSIH_LD_RAW && ins.src[1].reg.type == WINED3DSPR_UAV)
1629 || (ins.handler_idx == WINED3DSIH_LD_STRUCTURED && ins.src[2].reg.type == WINED3DSPR_UAV))
1630 {
1631 const struct wined3d_shader_register *reg;
1632
1634 reg = &ins.src[1].reg;
1635 else if (ins.handler_idx == WINED3DSIH_LD_STRUCTURED)
1636 reg = &ins.src[2].reg;
1638 reg = &ins.dst[0].reg;
1639 else if (ins.handler_idx == WINED3DSIH_BUFINFO)
1640 reg = &ins.src[0].reg;
1641 else
1642 reg = &ins.dst[1].reg;
1643
1644 if (reg->type == WINED3DSPR_UAV)
1645 {
1646 if (reg->idx[0].offset >= MAX_UNORDERED_ACCESS_VIEWS)
1647 {
1648 ERR("Invalid UAV index %u.\n", reg->idx[0].offset);
1649 break;
1650 }
1651 reg_maps->uav_read_mask |= (1u << reg->idx[0].offset);
1652 }
1653 }
1654 else if (ins.handler_idx == WINED3DSIH_NRM)
1655 {
1656 reg_maps->usesnrm = 1;
1657 }
1658 else if (ins.handler_idx == WINED3DSIH_DSY
1661 {
1662 reg_maps->usesdsy = 1;
1663 }
1664 else if (ins.handler_idx == WINED3DSIH_DSX
1667 {
1668 reg_maps->usesdsx = 1;
1669 }
1670 else if (ins.handler_idx == WINED3DSIH_TEXLDD) reg_maps->usestexldd = 1;
1671 else if (ins.handler_idx == WINED3DSIH_TEXLDL) reg_maps->usestexldl = 1;
1672 else if (ins.handler_idx == WINED3DSIH_MOVA) reg_maps->usesmova = 1;
1673 else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1;
1674 else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1;
1675 else if (ins.handler_idx == WINED3DSIH_POW) reg_maps->usespow = 1;
1676 else if (ins.handler_idx == WINED3DSIH_LOOP
1677 || ins.handler_idx == WINED3DSIH_REP)
1678 {
1679 ++cur_loop_depth;
1680 if (cur_loop_depth > max_loop_depth)
1681 max_loop_depth = cur_loop_depth;
1682 }
1683 else if (ins.handler_idx == WINED3DSIH_ENDLOOP
1685 {
1686 --cur_loop_depth;
1687 }
1688 else if (ins.handler_idx == WINED3DSIH_GATHER4
1696 {
1697 shader_record_sample(reg_maps, ins.src[1].reg.idx[0].offset,
1698 ins.src[2].reg.idx[0].offset, reg_maps->sampler_map.count);
1699 }
1700 else if (ins.handler_idx == WINED3DSIH_GATHER4_PO
1702 {
1703 shader_record_sample(reg_maps, ins.src[2].reg.idx[0].offset,
1704 ins.src[3].reg.idx[0].offset, reg_maps->sampler_map.count);
1705 }
1706 else if ((ins.handler_idx == WINED3DSIH_BUFINFO && ins.src[0].reg.type == WINED3DSPR_RESOURCE)
1707 || (ins.handler_idx == WINED3DSIH_SAMPLE_INFO && ins.src[0].reg.type == WINED3DSPR_RESOURCE))
1708 {
1709 shader_record_sample(reg_maps, ins.src[0].reg.idx[0].offset,
1710 WINED3D_SAMPLER_DEFAULT, reg_maps->sampler_map.count);
1711 }
1712 else if (ins.handler_idx == WINED3DSIH_LD
1714 || (ins.handler_idx == WINED3DSIH_LD_RAW && ins.src[1].reg.type == WINED3DSPR_RESOURCE)
1715 || (ins.handler_idx == WINED3DSIH_RESINFO && ins.src[1].reg.type == WINED3DSPR_RESOURCE))
1716 {
1717 shader_record_sample(reg_maps, ins.src[1].reg.idx[0].offset,
1718 WINED3D_SAMPLER_DEFAULT, reg_maps->sampler_map.count);
1719 }
1721 && ins.src[2].reg.type == WINED3DSPR_RESOURCE)
1722 {
1723 shader_record_sample(reg_maps, ins.src[2].reg.idx[0].offset,
1724 WINED3D_SAMPLER_DEFAULT, reg_maps->sampler_map.count);
1725 }
1726
1727 if (ins.predicate)
1728 if (!shader_record_register_usage(shader, reg_maps, &ins.predicate->reg,
1729 shader_version.type, constf_size))
1731
1732 for (i = 0; i < ins.src_count; ++i)
1733 {
1734 unsigned int count = get_instr_extra_regcount(ins.handler_idx, i);
1735 struct wined3d_shader_register reg = ins.src[i].reg;
1736
1737 if (!shader_record_register_usage(shader, reg_maps, &ins.src[i].reg,
1738 shader_version.type, constf_size))
1740 while (count)
1741 {
1742 ++reg.idx[0].offset;
1743 if (!shader_record_register_usage(shader, reg_maps, &reg,
1744 shader_version.type, constf_size))
1746 --count;
1747 }
1748
1749 if (color0_mov)
1750 {
1751 if (ins.src[i].reg.type == WINED3DSPR_TEMP
1752 && ins.src[i].swizzle == WINED3DSP_NOSWIZZLE)
1753 {
1754 shader->u.ps.color0_mov = TRUE;
1755 shader->u.ps.color0_reg = ins.src[i].reg.idx[0].offset;
1756 }
1757 }
1758 }
1759 }
1760
1761 prev_ins = current_ins;
1762 }
1763 reg_maps->loop_depth = max_loop_depth;
1764
1765 if (phase)
1766 {
1767 phase->end = prev_ins;
1768 phase = NULL;
1769 }
1770
1771 /* PS before 2.0 don't have explicit color outputs. Instead the value of
1772 * R0 is written to the render target. */
1773 if (shader_version.major < 2 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1774 reg_maps->rt_mask |= (1u << 0);
1775
1776 if (input_signature->elements)
1777 {
1778 for (i = 0; i < input_signature->element_count; ++i)
1779 {
1780 if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
1781 {
1782 if (input_signature->elements[i].register_idx >= ARRAY_SIZE(shader->u.vs.attributes))
1783 {
1784 WARN("Invalid input signature register index %u.\n", input_signature->elements[i].register_idx);
1786 }
1787 }
1788 else if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL)
1789 {
1790 if (input_signature->elements[i].sysval_semantic == WINED3D_SV_POSITION)
1791 reg_maps->vpos = 1;
1792 else if (input_signature->elements[i].sysval_semantic == WINED3D_SV_IS_FRONT_FACE)
1793 reg_maps->usesfacing = 1;
1794 }
1795 reg_maps->input_registers |= 1u << input_signature->elements[i].register_idx;
1796 }
1797 }
1798 else if (!input_signature->elements && reg_maps->input_registers)
1799 {
1800 unsigned int count = wined3d_popcount(reg_maps->input_registers);
1802 unsigned int i;
1803
1804 if (!(input_signature->elements = calloc(count, sizeof(*input_signature->elements))))
1805 return E_OUTOFMEMORY;
1806 input_signature->element_count = count;
1807
1808 e = input_signature->elements;
1809 for (i = 0; i < ARRAY_SIZE(input_signature_elements); ++i)
1810 {
1811 if (!(reg_maps->input_registers & (1u << i)))
1812 continue;
1813 input_signature_elements[i].register_idx = i;
1814 *e++ = input_signature_elements[i];
1815 }
1816 }
1817
1818 if (output_signature->elements)
1819 {
1821 return hr;
1822 }
1823 else if (reg_maps->output_registers)
1824 {
1826 unsigned int count = 0;
1827
1828 for (i = 0; i < ARRAY_SIZE(output_signature_elements); ++i)
1829 {
1830 if (output_signature_elements[i].semantic_name)
1831 ++count;
1832 }
1833
1834 if (!(output_signature->elements = calloc(count, sizeof(*output_signature->elements))))
1835 return E_OUTOFMEMORY;
1836 output_signature->element_count = count;
1837
1838 e = output_signature->elements;
1839 for (i = 0; i < ARRAY_SIZE(output_signature_elements); ++i)
1840 {
1841 if (output_signature_elements[i].semantic_name)
1842 *e++ = output_signature_elements[i];
1843 }
1844 }
1845
1846 return WINED3D_OK;
1847}
1848
1850{
1851 struct wined3d_shader_indexable_temp *reg, *reg_next;
1852
1853 free(reg_maps->constf);
1854 free(reg_maps->sampler_map.entries);
1855
1857 free(reg);
1858 list_init(&reg_maps->indexable_temps);
1859
1860 free(reg_maps->tgsm);
1861}
1862
1863unsigned int shader_find_free_input_register(const struct wined3d_shader_reg_maps *reg_maps, unsigned int max)
1864{
1865 DWORD map = 1u << max;
1866 map |= map - 1;
1867 map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers;
1868
1869 return wined3d_log2i(map);
1870}
1871
1872/* Shared code in order to generate the bulk of the shader string. */
1874 const struct wined3d_shader_reg_maps *reg_maps, void *backend_ctx,
1875 const DWORD *start, const DWORD *end)
1876{
1877 struct wined3d_device *device = shader->device;
1878 const struct wined3d_shader_frontend *fe = shader->frontend;
1879 void *fe_data = shader->frontend_data;
1880 struct wined3d_shader_version shader_version;
1882 struct wined3d_shader_instruction ins;
1883 struct wined3d_shader_tex_mx tex_mx;
1885 const DWORD *ptr;
1886
1887 /* Initialize current parsing state. */
1888 tex_mx.current_row = 0;
1889 state.current_loop_depth = 0;
1890 state.current_loop_reg = 0;
1891 state.in_subroutine = FALSE;
1892
1893 ctx.shader = shader;
1894 ctx.reg_maps = reg_maps;
1895 ctx.buffer = buffer;
1896 ctx.tex_mx = &tex_mx;
1897 ctx.state = &state;
1898 ctx.backend_data = backend_ctx;
1899 ins.ctx = &ctx;
1900
1901 fe->shader_read_header(fe_data, &ptr, &shader_version);
1902 if (start)
1903 ptr = start;
1904
1905 while (!fe->shader_is_end(fe_data, &ptr) && ptr != end)
1906 {
1907 /* Read opcode. */
1908 fe->shader_read_instruction(fe_data, &ptr, &ins);
1909
1910 /* Unknown opcode and its parameters. */
1912 {
1913 WARN("Encountered unrecognised or invalid instruction.\n");
1915 }
1916
1917 if (ins.predicate)
1918 FIXME("Predicates not implemented.\n");
1919
1920 /* Call appropriate function for output target */
1921 device->shader_backend->shader_handle_instruction(&ins);
1922 }
1923
1924 return WINED3D_OK;
1925}
1926
1928{
1929 if (shader->reg_maps.shader_version.type == WINED3D_SHADER_TYPE_HULL)
1930 {
1931 free(shader->u.hs.phases.control_point);
1932 free(shader->u.hs.phases.fork);
1933 free(shader->u.hs.phases.join);
1934 }
1935
1936 free(shader->patch_constant_signature.elements);
1937 free(shader->output_signature.elements);
1938 free(shader->input_signature.elements);
1939 shader->device->shader_backend->shader_destroy(shader);
1940 shader_cleanup_reg_maps(&shader->reg_maps);
1941 free(shader->byte_code);
1942 shader_delete_constant_list(&shader->constantsF);
1943 shader_delete_constant_list(&shader->constantsB);
1944 shader_delete_constant_list(&shader->constantsI);
1945 list_remove(&shader->shader_list_entry);
1946
1947 if (shader->frontend && shader->frontend_data)
1948 shader->frontend->shader_free(shader->frontend_data);
1949}
1950
1952{
1955};
1956
1958static void shader_none_precompile(void *shader_priv, struct wined3d_shader *shader) {}
1959static void shader_none_apply_compute_state(void *shader_priv, struct wined3d_context *context,
1960 const struct wined3d_state *state) {}
1966
1967/* Context activation is done by the caller. */
1968static void shader_none_apply_draw_state(void *shader_priv, struct wined3d_context *context,
1969 const struct wined3d_state *state)
1970{
1971 struct shader_none_priv *priv = shader_priv;
1972
1973 priv->vertex_pipe->vp_apply_draw_state(context, state);
1974 priv->fragment_pipe->fp_apply_draw_state(context, state);
1975}
1976
1977/* Context activation is done by the caller. */
1978static void shader_none_disable(void *shader_priv, struct wined3d_context *context)
1979{
1980 struct shader_none_priv *priv = shader_priv;
1981
1982 priv->vertex_pipe->vp_disable(context);
1983 priv->fragment_pipe->fp_disable(context);
1984
1985 context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
1988 | (1u << WINED3D_SHADER_TYPE_HULL)
1991}
1992
1995{
1996 void *vertex_priv, *fragment_priv;
1997 struct shader_none_priv *priv;
1998
1999 if (!(priv = malloc(sizeof(*priv))))
2000 return E_OUTOFMEMORY;
2001
2002 if (!(vertex_priv = vertex_pipe->vp_alloc(&none_shader_backend, priv)))
2003 {
2004 ERR("Failed to initialize vertex pipe.\n");
2005 free(priv);
2006 return E_FAIL;
2007 }
2008
2009 if (!(fragment_priv = fragment_pipe->alloc_private(&none_shader_backend, priv)))
2010 {
2011 ERR("Failed to initialize fragment pipe.\n");
2012 vertex_pipe->vp_free(device, NULL);
2013 free(priv);
2014 return E_FAIL;
2015 }
2016
2017 priv->vertex_pipe = vertex_pipe;
2019
2020 device->vertex_priv = vertex_priv;
2021 device->fragment_priv = fragment_priv;
2022 device->shader_priv = priv;
2023
2024 return WINED3D_OK;
2025}
2026
2028{
2029 struct shader_none_priv *priv = device->shader_priv;
2030
2031 priv->fragment_pipe->free_private(device, context);
2032 priv->vertex_pipe->vp_free(device, context);
2033 free(priv);
2034}
2035
2037{
2038 return TRUE;
2039}
2040
2041static void shader_none_get_caps(const struct wined3d_adapter *adapter, struct shader_caps *caps)
2042{
2043 /* Set the shader caps to 0 for the none shader backend */
2044 memset(caps, 0, sizeof(*caps));
2045}
2046
2048{
2049 /* We "support" every possible fixup, since we don't support any shader
2050 * model, and will never have to actually sample a texture. */
2051 return TRUE;
2052}
2053
2056{
2057 return 0;
2058}
2059
2061{
2078};
2079
2081{
2082 switch (level)
2083 {
2086 return 5;
2089 return 4;
2091 return 3;
2094 return 2;
2095 default:
2096 return 1;
2097 }
2098}
2099
2101 unsigned int stream_idx, const char *semantic_name, unsigned int semantic_idx)
2102{
2103 struct wined3d_shader_signature_element *e = s->elements;
2104 unsigned int i;
2105
2106 for (i = 0; i < s->element_count; ++i)
2107 {
2108 if (e[i].stream_idx == stream_idx
2111 return &e[i];
2112 }
2113
2114 return NULL;
2115}
2116
2118 const struct wined3d_stream_output_element *so_element, unsigned int *register_idx, unsigned int *component_idx)
2119{
2120 const struct wined3d_shader_signature_element *output;
2121 unsigned int idx;
2122
2123 if (!(output = shader_find_signature_element(&shader->output_signature,
2124 so_element->stream_idx, so_element->semantic_name, so_element->semantic_idx)))
2125 return FALSE;
2126
2127 for (idx = 0; idx < 4; ++idx)
2128 {
2129 if (output->mask & (1u << idx))
2130 break;
2131 }
2132 idx += so_element->component_idx;
2133
2134 *register_idx = output->register_idx;
2135 *component_idx = idx;
2136 return TRUE;
2137}
2138
2140 const struct wined3d_stream_output_desc *so_desc)
2141{
2142 struct wined3d_so_desc_entry *s;
2143 struct wine_rb_entry *entry;
2144 unsigned int i;
2145 size_t size;
2146 char *name;
2147
2148 if ((entry = wine_rb_get(&device->so_descs, so_desc)))
2149 {
2150 gs->so_desc = &WINE_RB_ENTRY_VALUE(entry, struct wined3d_so_desc_entry, entry)->desc;
2151 return WINED3D_OK;
2152 }
2153
2154 size = FIELD_OFFSET(struct wined3d_so_desc_entry, elements[so_desc->element_count]);
2155 for (i = 0; i < so_desc->element_count; ++i)
2156 {
2157 const char *n = so_desc->elements[i].semantic_name;
2158
2159 if (n)
2160 size += strlen(n) + 1;
2161 }
2162 if (!(s = malloc(size)))
2163 return E_OUTOFMEMORY;
2164
2165 s->desc = *so_desc;
2166
2167 memcpy(s->elements, so_desc->elements, so_desc->element_count * sizeof(*s->elements));
2168 s->desc.elements = s->elements;
2169
2170 name = (char *)&s->elements[s->desc.element_count];
2171 for (i = 0; i < so_desc->element_count; ++i)
2172 {
2173 struct wined3d_stream_output_element *e = &s->elements[i];
2174
2175 if (!e->semantic_name)
2176 continue;
2177
2178 size = strlen(e->semantic_name) + 1;
2179 memcpy(name, e->semantic_name, size);
2180 e->semantic_name = name;
2181 name += size;
2182 }
2183
2184 if (wine_rb_put(&device->so_descs, &s->desc, &s->entry) == -1)
2185 {
2186 free(s);
2187 return E_FAIL;
2188 }
2189 gs->so_desc = &s->desc;
2190
2191 return WINED3D_OK;
2192}
2193
2195 const struct wined3d_stream_output_desc *so_desc)
2196{
2197 const struct wined3d_shader_frontend *fe = shader->frontend;
2198 const struct wined3d_shader_signature_element *output;
2199 unsigned int i, component_idx, register_idx, mask;
2200 struct wined3d_shader_version shader_version;
2201 const DWORD *ptr;
2202 void *fe_data;
2203 HRESULT hr;
2204
2205 if (!so_desc)
2206 return WINED3D_OK;
2207
2208 if (!(fe_data = fe->shader_init(shader->function, shader->functionLength, &shader->output_signature)))
2209 {
2210 WARN("Failed to initialise frontend data.\n");
2212 }
2213 fe->shader_read_header(fe_data, &ptr, &shader_version);
2214 fe->shader_free(fe_data);
2215
2216 switch (shader_version.type)
2217 {
2220 shader->function = NULL;
2221 shader->functionLength = 0;
2222 break;
2224 break;
2225 default:
2226 WARN("Wrong shader type %s.\n", debug_shader_type(shader_version.type));
2227 return E_INVALIDARG;
2228 }
2229
2230 if (!shader->function)
2231 {
2232 shader->reg_maps.shader_version = shader_version;
2233 shader->reg_maps.shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
2236 return hr;
2237 }
2238
2239 for (i = 0; i < so_desc->element_count; ++i)
2240 {
2241 const struct wined3d_stream_output_element *e = &so_desc->elements[i];
2242
2243 if (!e->semantic_name)
2244 continue;
2245 if (!(output = shader_find_signature_element(&shader->output_signature,
2246 e->stream_idx, e->semantic_name, e->semantic_idx))
2248 {
2249 WARN("Failed to find output signature element for stream output entry.\n");
2250 return E_INVALIDARG;
2251 }
2252
2253 mask = wined3d_mask_from_size(e->component_count) << component_idx;
2254 if ((output->mask & 0xff & mask) != mask)
2255 {
2256 WARN("Invalid component range %u-%u (mask %#x), output mask %#x.\n",
2257 component_idx, e->component_count, mask, output->mask & 0xff);
2258 return E_INVALIDARG;
2259 }
2260 }
2261
2262 if (FAILED(hr = geometry_shader_init_so_desc(&shader->u.gs, shader->device, so_desc)))
2263 {
2264 WARN("Failed to initialise stream output description, hr %#lx.\n", hr);
2265 return hr;
2266 }
2267
2268 return WINED3D_OK;
2269}
2270
2271static void shader_trace(const void *code, size_t size, enum vkd3d_shader_source_type source_type)
2272{
2274 struct vkd3d_shader_code d3d_asm;
2275 const char *ptr, *end, *line;
2276 char *messages;
2277 int ret;
2278
2279 static const struct vkd3d_shader_compile_option compile_options[] =
2280 {
2282 };
2283
2284 info.source.code = code;
2285 info.source.size = size;
2286 info.source_type = source_type;
2287 info.target_type = VKD3D_SHADER_TARGET_D3D_ASM;
2288 info.options = compile_options;
2289 info.option_count = ARRAY_SIZE(compile_options);
2290 info.log_level = VKD3D_SHADER_LOG_WARNING;
2291
2292 ret = vkd3d_shader_compile(&info, &d3d_asm, &messages);
2293 if (messages && *messages && FIXME_ON(d3d_shader))
2294 {
2295 FIXME("Shader log:\n");
2296 ptr = messages;
2297 end = ptr + strlen(ptr);
2298 while ((line = wined3d_get_line(&ptr, end)))
2299 FIXME(" %.*s", (int)(ptr - line), line);
2300 FIXME("\n");
2301 }
2303
2304 if (ret < 0)
2305 {
2306 ERR("Failed to disassemble, ret %d.\n", ret);
2307 return;
2308 }
2309
2310 ptr = d3d_asm.code;
2311 end = ptr + d3d_asm.size;
2312 while ((line = wined3d_get_line(&ptr, end)))
2313 TRACE(" %.*s", (int)(ptr - line), line);
2314 TRACE("\n");
2315
2317}
2318
2320 enum wined3d_shader_type type, const struct wined3d_stream_output_desc *so_desc, unsigned int float_const_count)
2321{
2322 const struct wined3d_d3d_info *d3d_info = &shader->device->adapter->d3d_info;
2323 struct wined3d_shader_reg_maps *reg_maps = &shader->reg_maps;
2324 const struct wined3d_shader_version *version = &reg_maps->shader_version;
2325 unsigned int highest_reg_used = 0, num_regs_used = 0;
2326 const struct wined3d_shader_frontend *fe;
2327 unsigned int backend_version;
2328 HRESULT hr;
2329
2330 TRACE("shader %p, byte_code %p, size %#Ix, type %s, float_const_count %u.\n",
2331 shader, desc->byte_code, desc->byte_code_size, debug_shader_type(type), float_const_count);
2332
2333 if (!desc->byte_code)
2335
2336 if (desc->byte_code_size == ~(size_t)0)
2337 {
2338 struct wined3d_shader_version shader_version;
2339 const struct wined3d_shader_frontend *fe;
2340 struct wined3d_shader_instruction ins;
2341 const DWORD *ptr;
2342 void *fe_data;
2343
2345 if (!(shader->frontend = shader_select_frontend(shader->source_type)))
2346 {
2347 FIXME("Unable to find frontend for shader.\n");
2350 }
2351
2352 fe = shader->frontend;
2353 if (!(fe_data = fe->shader_init(desc->byte_code, desc->byte_code_size, &shader->output_signature)))
2354 {
2355 WARN("Failed to initialise frontend data.\n");
2358 }
2359
2360 fe->shader_read_header(fe_data, &ptr, &shader_version);
2361 while (!fe->shader_is_end(fe_data, &ptr))
2362 fe->shader_read_instruction(fe_data, &ptr, &ins);
2363
2364 fe->shader_free(fe_data);
2365
2366 shader->byte_code_size = (ptr - desc->byte_code) * sizeof(*ptr);
2367
2368 if (!(shader->byte_code = malloc(shader->byte_code_size)))
2369 {
2371 return E_OUTOFMEMORY;
2372 }
2373 memcpy(shader->byte_code, desc->byte_code, shader->byte_code_size);
2374
2375 shader->function = shader->byte_code;
2376 shader->functionLength = shader->byte_code_size;
2377 }
2378 else
2379 {
2380 unsigned int max_version;
2381
2382 if (!(shader->byte_code = malloc(desc->byte_code_size)))
2383 {
2385 return E_OUTOFMEMORY;
2386 }
2387 memcpy(shader->byte_code, desc->byte_code, desc->byte_code_size);
2388 shader->byte_code_size = desc->byte_code_size;
2389
2390 max_version = shader_max_version_from_feature_level(shader->device->cs->c.state->feature_level);
2391 if (FAILED(hr = wined3d_shader_extract_from_dxbc(shader, max_version, &shader->source_type)))
2392 {
2394 return hr;
2395 }
2396
2397 if (!(shader->frontend = shader_select_frontend(shader->source_type)))
2398 {
2399 FIXME("Unable to find frontend for shader.\n");
2402 }
2403 }
2404
2405 if (TRACE_ON(d3d_shader))
2406 {
2407 if (shader->source_type == VKD3D_SHADER_SOURCE_D3D_BYTECODE)
2408 shader_trace(shader->function, shader->functionLength, shader->source_type);
2409 else
2410 shader_trace(shader->byte_code, shader->byte_code_size, shader->source_type);
2411 }
2412
2414 {
2416 return hr;
2417 if (!shader->function)
2418 return S_OK;
2419 }
2420
2421 fe = shader->frontend;
2422 if (!(shader->frontend_data = fe->shader_init(shader->function,
2423 shader->functionLength, &shader->output_signature)))
2424 {
2425 FIXME("Failed to initialize frontend.\n");
2427 }
2428
2429 if (FAILED(hr = shader_get_registers_used(shader, float_const_count)))
2430 return hr;
2431
2432 shader->load_local_constsF = shader->lconst_inf_or_nan;
2433
2434 if (version->type != type)
2435 {
2436 WARN("Wrong shader type %s.\n", debug_shader_type(reg_maps->shader_version.type));
2438 }
2439 if (!shader->is_ffp_vs && !shader->is_ffp_ps
2440 && version->major > shader_max_version_from_feature_level(shader->device->cs->c.state->feature_level))
2441 {
2442 WARN("Shader version %u not supported by this device.\n", version->major);
2444 }
2445 switch (type)
2446 {
2448 for (unsigned int i = 0; i < shader->input_signature.element_count; ++i)
2449 {
2450 const struct wined3d_shader_signature_element *input = &shader->input_signature.elements[i];
2451
2452 if (!(reg_maps->input_registers & (1u << input->register_idx)) || !input->semantic_name)
2453 continue;
2454
2455 shader->u.vs.attributes[input->register_idx].usage =
2456 shader_usage_from_semantic_name(input->semantic_name);
2457 shader->u.vs.attributes[input->register_idx].usage_idx = input->semantic_idx;
2458 }
2459
2460 if (reg_maps->usesrelconstF && !list_empty(&shader->constantsF))
2461 shader->load_local_constsF = TRUE;
2462
2463 backend_version = d3d_info->limits.vs_version;
2464 break;
2465
2467 backend_version = d3d_info->limits.hs_version;
2468 break;
2470 backend_version = d3d_info->limits.ds_version;
2471 break;
2473 backend_version = d3d_info->limits.gs_version;
2474 break;
2476 for (unsigned int i = 0; i < MAX_REG_INPUT; ++i)
2477 {
2478 if (shader->u.ps.input_reg_used & (1u << i))
2479 {
2480 ++num_regs_used;
2481 highest_reg_used = i;
2482 }
2483 }
2484
2485 /* Don't do any register mapping magic if it is not needed,
2486 * or if we can't achieve anything anyway. */
2487 if (highest_reg_used < (d3d_info->limits.varying_count / 4)
2488 || num_regs_used > (d3d_info->limits.varying_count / 4)
2489 || shader->reg_maps.shader_version.major >= 4)
2490 {
2491 if (num_regs_used > (d3d_info->limits.varying_count / 4))
2492 {
2493 /* This happens with relative addressing. The input mapper
2494 * function warns about this if the higher registers are
2495 * declared too, so don't write a FIXME here. */
2496 WARN("More varying registers used than supported.\n");
2497 }
2498
2499 for (unsigned int i = 0; i < MAX_REG_INPUT; ++i)
2500 shader->u.ps.input_reg_map[i] = i;
2501
2502 shader->u.ps.declared_in_count = highest_reg_used + 1;
2503 }
2504 else
2505 {
2506 shader->u.ps.declared_in_count = 0;
2507 for (unsigned int i = 0; i < MAX_REG_INPUT; ++i)
2508 {
2509 if (shader->u.ps.input_reg_used & (1u << i))
2510 shader->u.ps.input_reg_map[i] = shader->u.ps.declared_in_count++;
2511 else
2512 shader->u.ps.input_reg_map[i] = ~0u;
2513 }
2514 }
2515
2516 backend_version = d3d_info->limits.ps_version;
2517 break;
2519 backend_version = d3d_info->limits.cs_version;
2520 break;
2521 default:
2522 FIXME("No backend version-checking for this shader type.\n");
2523 backend_version = 0;
2524 }
2525 if (version->major > backend_version)
2526 {
2527 WARN("Shader version %u.%u not supported by the current shader backend.\n",
2528 version->major, version->minor);
2530 }
2531
2532 return WINED3D_OK;
2533}
2534
2536{
2537 unsigned int refcount = InterlockedIncrement(&shader->ref);
2538
2539 TRACE("%p increasing refcount to %u.\n", shader, refcount);
2540
2541 return refcount;
2542}
2543
2544static void wined3d_shader_init_object(void *object)
2545{
2546 struct wined3d_shader *shader = object;
2547 struct wined3d_device *device = shader->device;
2548
2549 TRACE("shader %p.\n", shader);
2550
2551 list_add_head(&device->shaders, &shader->shader_list_entry);
2552
2553 if (shader->is_ffp_vs)
2554 {
2555 struct wined3d_ffp_vs_settings *settings = shader->byte_code;
2557
2559 return;
2560 free(settings);
2562 device->adapter->d3d_info.limits.vs_uniform_count);
2563 }
2564
2565 if (shader->is_ffp_ps)
2566 {
2567 struct ffp_frag_settings *settings = shader->byte_code;
2569
2571 return;
2572 free(settings);
2574 device->adapter->d3d_info.limits.ps_uniform_count);
2575 }
2576
2577 device->shader_backend->shader_precompile(device->shader_priv, shader);
2578}
2579
2580static void wined3d_shader_destroy_object(void *object)
2581{
2582 TRACE("object %p.\n", object);
2583
2584 shader_cleanup(object);
2585 free(object);
2586}
2587
2589{
2590 unsigned int refcount = InterlockedDecrement(&shader->ref);
2591
2592 TRACE("%p decreasing refcount to %u.\n", shader, refcount);
2593
2594 if (!refcount)
2595 {
2597 shader->parent_ops->wined3d_object_destroyed(shader->parent);
2600 }
2601
2602 return refcount;
2603}
2604
2606{
2607 TRACE("shader %p.\n", shader);
2608
2609 return shader->parent;
2610}
2611
2614{
2615 TRACE("shader %p, byte_code %p, byte_code_size %p.\n", shader, byte_code, byte_code_size);
2616
2617 if (!byte_code)
2618 {
2619 *byte_code_size = shader->byte_code_size;
2620 return WINED3D_OK;
2621 }
2622
2623 if (*byte_code_size < shader->byte_code_size)
2624 {
2625 /* MSDN claims (for d3d8 at least) that if *byte_code_size is smaller
2626 * than the required size we should write the required size and
2627 * return D3DERR_MOREDATA. That's not actually true. */
2629 }
2630
2631 memcpy(byte_code, shader->byte_code, shader->byte_code_size);
2632
2633 return WINED3D_OK;
2634}
2635
2636/* Set local constants for d3d8 shaders. */
2638 UINT start_idx, const float *src_data, UINT count)
2639{
2640 UINT end_idx = start_idx + count;
2641 UINT i;
2642
2643 TRACE("shader %p, start_idx %u, src_data %p, count %u.\n", shader, start_idx, src_data, count);
2644
2645 if (end_idx > shader->limits->constant_float)
2646 {
2647 WARN("end_idx %u > float constants limit %u.\n",
2648 end_idx, shader->limits->constant_float);
2649 end_idx = shader->limits->constant_float;
2650 }
2651
2652 for (i = start_idx; i < end_idx; ++i)
2653 {
2654 struct wined3d_shader_lconst *lconst;
2655 float *value;
2656
2657 if (!(lconst = malloc(sizeof(*lconst))))
2658 return E_OUTOFMEMORY;
2659
2660 lconst->idx = i;
2661 value = (float *)lconst->value;
2662 memcpy(value, src_data + (i - start_idx) * 4 /* 4 components */, 4 * sizeof(float));
2663 list_add_head(&shader->constantsF, &lconst->entry);
2664
2665 if (isinf(value[0]) || isnan(value[0]) || isinf(value[1]) || isnan(value[1])
2666 || isinf(value[2]) || isnan(value[2]) || isinf(value[3]) || isnan(value[3]))
2667 {
2668 shader->lconst_inf_or_nan = TRUE;
2669 }
2670 }
2671
2672 return WINED3D_OK;
2673}
2674
2675static void init_interpolation_compile_args(uint32_t *interpolation_args,
2676 const struct wined3d_shader *pixel_shader, const struct wined3d_d3d_info *d3d_info)
2677{
2678 if (!d3d_info->shader_output_interpolation || !pixel_shader
2679 || pixel_shader->reg_maps.shader_version.major < 4)
2680 {
2681 memset(interpolation_args, 0, sizeof(pixel_shader->u.ps.interpolation_mode));
2682 return;
2683 }
2684
2685 memcpy(interpolation_args, pixel_shader->u.ps.interpolation_mode,
2686 sizeof(pixel_shader->u.ps.interpolation_mode));
2687}
2688
2690 struct vs_compile_args *args, const struct wined3d_context *context)
2691{
2692 const struct wined3d_shader *geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY];
2693 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
2694 const struct wined3d_shader *hull_shader = state->shader[WINED3D_SHADER_TYPE_HULL];
2695 const struct wined3d_d3d_info *d3d_info = context->d3d_info;
2696 WORD swizzle_map = context->stream_info.swizzle_map;
2697
2698 if (state->render_states[WINED3D_RS_FOGTABLEMODE] != WINED3D_FOG_NONE)
2699 {
2700 if (state->transforms[WINED3D_TS_PROJECTION]._14 == 0.0f
2701 && state->transforms[WINED3D_TS_PROJECTION]._24 == 0.0f
2702 && state->transforms[WINED3D_TS_PROJECTION]._34 == 0.0f
2703 && state->transforms[WINED3D_TS_PROJECTION]._44 == 1.0f)
2704 {
2705 /* Fog source is vertex output Z.
2706 *
2707 * However, if drawing RHW (which means we are using an HLSL
2708 * replacement shader, since we got here), and depth testing is
2709 * disabled, primitives are not supposed to be clipped by the
2710 * viewport. We handle this in the vertex shader by essentially
2711 * flushing output Z to zero.
2712 *
2713 * Fog needs to still read from the original Z, however. In this
2714 * case we read from oFog, which contains the original Z. */
2715
2716 if (state->vertex_declaration->position_transformed)
2717 args->fog_src = VS_FOG_COORD;
2718 else
2719 args->fog_src = VS_FOG_Z;
2720 }
2721 else
2722 {
2723 args->fog_src = VS_FOG_W;
2724 }
2725 }
2726 else
2727 {
2728 args->fog_src = VS_FOG_COORD;
2729 }
2730
2731 args->clip_enabled = state->render_states[WINED3D_RS_CLIPPING]
2732 && state->render_states[WINED3D_RS_CLIPPLANEENABLE];
2733 args->point_size = state->primitive_type == WINED3D_PT_POINTLIST;
2734 args->next_shader_type = hull_shader ? WINED3D_SHADER_TYPE_HULL
2736 if (shader->reg_maps.shader_version.major >= 4)
2737 args->next_shader_input_count = hull_shader ? hull_shader->limits->packed_input
2738 : geometry_shader ? geometry_shader->limits->packed_input
2739 : pixel_shader ? pixel_shader->limits->packed_input : 0;
2740 else
2741 args->next_shader_input_count = 0;
2742 args->swizzle_map = swizzle_map;
2743 if (d3d_info->emulated_flatshading)
2744 args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT;
2745 else
2746 args->flatshading = 0;
2747
2748 init_interpolation_compile_args(args->interpolation_mode,
2749 args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, d3d_info);
2750}
2751
2752static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2)
2753{
2754 if (usage_idx1 != usage_idx2)
2755 return FALSE;
2756 if (usage1 == usage2)
2757 return TRUE;
2759 return TRUE;
2761 return TRUE;
2762
2763 return FALSE;
2764}
2765
2767 uint8_t usage_req, uint8_t usage_idx_req, unsigned int *regnum)
2768{
2769 uint32_t map = shader->reg_maps.input_registers & 0xffff;
2770 unsigned int i;
2771
2772 while (map)
2773 {
2775 if (match_usage(shader->u.vs.attributes[i].usage,
2776 shader->u.vs.attributes[i].usage_idx, usage_req, usage_idx_req))
2777 {
2778 *regnum = i;
2779 return true;
2780 }
2781 }
2782
2783 return false;
2784}
2785
2787 void *parent, const struct wined3d_parent_ops *parent_ops)
2788{
2789 shader->ref = 1;
2790 shader->device = device;
2791 shader->parent = parent;
2792 shader->parent_ops = parent_ops;
2793
2794 list_init(&shader->linked_programs);
2795 list_init(&shader->constantsF);
2796 list_init(&shader->constantsB);
2797 list_init(&shader->constantsI);
2798 shader->lconst_inf_or_nan = FALSE;
2799 list_init(&shader->reg_maps.indexable_temps);
2800 list_init(&shader->shader_list_entry);
2801}
2802
2804 const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
2805{
2806 HRESULT hr;
2807
2808 shader_init(shader, device, parent, parent_ops);
2809
2811 WINED3D_SHADER_TYPE_VERTEX, NULL, device->adapter->d3d_info.limits.vs_uniform_count)))
2812 {
2814 return hr;
2815 }
2816
2817 return WINED3D_OK;
2818}
2819
2821 const struct wined3d_shader_desc *desc, const struct wined3d_stream_output_desc *so_desc,
2822 void *parent, const struct wined3d_parent_ops *parent_ops)
2823{
2824 HRESULT hr;
2825
2826 shader_init(shader, device, parent, parent_ops);
2827
2829 goto fail;
2830
2831 return WINED3D_OK;
2832
2833fail:
2835 return hr;
2836}
2837
2839 struct ds_compile_args *args, const struct wined3d_context *context)
2840{
2841 const struct wined3d_shader *geometry_shader = state->shader[WINED3D_SHADER_TYPE_GEOMETRY];
2842 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
2843 const struct wined3d_shader *hull_shader = state->shader[WINED3D_SHADER_TYPE_HULL];
2844
2845 args->tessellator_output_primitive = hull_shader->u.hs.tessellator_output_primitive;
2846 args->tessellator_partitioning = hull_shader->u.hs.tessellator_partitioning;
2847
2848 args->output_count = geometry_shader ? geometry_shader->limits->packed_input
2849 : pixel_shader ? pixel_shader->limits->packed_input : shader->limits->packed_output;
2850 args->next_shader_type = geometry_shader ? WINED3D_SHADER_TYPE_GEOMETRY : WINED3D_SHADER_TYPE_PIXEL;
2851
2852 init_interpolation_compile_args(args->interpolation_mode,
2853 args->next_shader_type == WINED3D_SHADER_TYPE_PIXEL ? pixel_shader : NULL, context->d3d_info);
2854
2855 args->padding = 0;
2856}
2857
2859 struct gs_compile_args *args, const struct wined3d_context *context)
2860{
2861 const struct wined3d_shader *pixel_shader = state->shader[WINED3D_SHADER_TYPE_PIXEL];
2862
2863 args->output_count = pixel_shader ? pixel_shader->limits->packed_input : shader->limits->packed_output;
2864
2865 if (!(args->primitive_type = shader->u.gs.input_type))
2866 args->primitive_type = state->primitive_type;
2867
2868 init_interpolation_compile_args(args->interpolation_mode, pixel_shader, context->d3d_info);
2869}
2870
2872 BOOL position_transformed, struct ps_compile_args *args, const struct wined3d_context *context)
2873{
2874 const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX];
2875 const struct wined3d_d3d_info *d3d_info = context->d3d_info;
2877 struct wined3d_texture *texture;
2878 unsigned int i;
2879
2880 memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
2881 if (!d3d_info->srgb_write_control && needs_srgb_write(d3d_info, state, &state->fb))
2882 {
2883 static unsigned int warned = 0;
2884
2885 args->srgb_correction = 1;
2886 if (state->blend_state && state->blend_state->desc.rt[0].enable && !warned++)
2887 WARN("Blending into a sRGB render target with no GL_ARB_framebuffer_sRGB "
2888 "support, expect rendering artifacts.\n");
2889 }
2890
2891 if (shader->reg_maps.shader_version.major == 1
2892 && shader->reg_maps.shader_version.minor <= 3)
2893 {
2894 for (i = 0; i < shader->limits->sampler; ++i)
2895 {
2897
2899 {
2900 uint32_t tex_transform = flags & ~WINED3D_TTFF_PROJECTED;
2901
2902 if (!vs || vs->is_ffp_vs)
2903 {
2904 enum wined3d_shader_resource_type resource_type = shader->reg_maps.resource_info[i].type;
2905 unsigned int j;
2906 unsigned int index = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
2907 uint32_t max_valid = WINED3D_TTFF_COUNT4;
2908
2909 for (j = 0; j < state->vertex_declaration->element_count; ++j)
2910 {
2912 &state->vertex_declaration->elements[j];
2913
2915 && element->usage_idx == index)
2916 {
2917 max_valid = element->format->component_count;
2918 break;
2919 }
2920 }
2921 if (!tex_transform || tex_transform > max_valid)
2922 {
2923 WARN("Fixing up projected texture transform flags from %#x to %#x.\n",
2924 tex_transform, max_valid);
2925 tex_transform = max_valid;
2926 }
2927 if ((resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_1D && tex_transform > WINED3D_TTFF_COUNT1)
2928 || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2D
2929 && tex_transform > WINED3D_TTFF_COUNT2)
2930 || (resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_3D
2931 && tex_transform > WINED3D_TTFF_COUNT3))
2932 tex_transform |= WINED3D_PSARGS_PROJECTED;
2933 else
2934 {
2935 WARN("Application requested projected texture with unsuitable texture coordinates.\n");
2936 WARN("(texture unit %u, transform flags %#x, sampler type %u).\n",
2937 i, tex_transform, resource_type);
2938 }
2939 }
2940 else
2942
2943 args->tex_transform |= tex_transform << i * WINED3D_PSARGS_TEXTRANSFORM_SHIFT;
2944 }
2945 }
2946 }
2947 if (shader->reg_maps.shader_version.major == 1
2948 && shader->reg_maps.shader_version.minor <= 4)
2949 {
2950 for (i = 0; i < shader->limits->sampler; ++i)
2951 {
2953
2954 if (!shader->reg_maps.resource_info[i].type)
2955 continue;
2956
2957 /* Treat unbound textures as 2D. The dummy texture will provide
2958 * the proper sample value. The tex_types bitmap defaults to
2959 * 2D because of the memset. */
2960 if (!(view = state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]))
2961 continue;
2962 texture = texture_from_resource(view->resource);
2963
2964 switch (texture->resource.type)
2965 {
2966 case WINED3D_RTYPE_NONE:
2969 assert(0);
2970
2972 if (texture->resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP)
2974 break;
2975
2978 break;
2979 }
2980
2981 args->tex_types |= (type << (i * WINED3D_PSARGS_TEXTYPE_SHIFT));
2982 }
2983 }
2984 else if (shader->reg_maps.shader_version.major <= 3)
2985 {
2986 for (i = 0; i < shader->limits->sampler; ++i)
2987 {
2988 enum wined3d_shader_resource_type resource_type;
2989 enum wined3d_shader_tex_types tex_type;
2990
2991 if (!(resource_type = shader->reg_maps.resource_info[i].type))
2992 continue;
2993
2994 switch (resource_type)
2995 {
2997 tex_type = WINED3D_SHADER_TEX_3D;
2998 break;
3000 tex_type = WINED3D_SHADER_TEX_CUBE;
3001 break;
3002 default:
3003 tex_type = WINED3D_SHADER_TEX_2D;
3004 break;
3005 }
3006
3007 if ((view = state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]))
3008 {
3009 texture = texture_from_resource(view->resource);
3010 /* Star Wars: The Old Republic uses mismatched samplers for rendering water. */
3011 if (texture->resource.type == WINED3D_RTYPE_TEXTURE_2D
3012 && resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_3D
3013 && !(texture->resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP))
3014 tex_type = WINED3D_SHADER_TEX_2D;
3015 else if (texture->resource.type == WINED3D_RTYPE_TEXTURE_3D
3016 && resource_type == WINED3D_SHADER_RESOURCE_TEXTURE_2D)
3017 tex_type = WINED3D_SHADER_TEX_3D;
3018 }
3019 args->tex_types |= tex_type << i * WINED3D_PSARGS_TEXTYPE_SHIFT;
3020 }
3021 }
3022
3023 if (shader->reg_maps.shader_version.major >= 4)
3024 {
3025 /* In SM4+ we use dcl_sampler in order to determine if we should use shadow sampler. */
3026 args->shadow = 0;
3027 for (i = 0 ; i < WINED3D_MAX_FRAGMENT_SAMPLERS; ++i)
3028 args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
3029 }
3030 else
3031 {
3032 for (i = 0; i < WINED3D_MAX_FRAGMENT_SAMPLERS; ++i)
3033 {
3034 if (!shader->reg_maps.resource_info[i].type)
3035 continue;
3036
3037 if (!(view = state->shader_resource_view[WINED3D_SHADER_TYPE_PIXEL][i]))
3038 {
3039 args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
3040 continue;
3041 }
3042 texture = texture_from_resource(view->resource);
3043
3044 if (can_use_texture_swizzle(d3d_info, texture->resource.format))
3045 args->color_fixup[i] = COLOR_FIXUP_IDENTITY;
3046 else
3047 args->color_fixup[i] = texture->resource.format->color_fixup;
3048
3049 if (texture->resource.format_caps & WINED3D_FORMAT_CAP_SHADOW)
3050 args->shadow |= 1u << i;
3051 }
3052 }
3053
3054 if (shader->reg_maps.shader_version.major >= 3)
3055 {
3056 if (position_transformed)
3057 args->vp_mode = WINED3D_VP_MODE_NONE;
3058 else if (use_vs(state))
3059 args->vp_mode = WINED3D_VP_MODE_SHADER;
3060 else
3061 args->vp_mode = WINED3D_VP_MODE_FF;
3063 }
3064 else
3065 {
3066 args->vp_mode = WINED3D_VP_MODE_SHADER;
3067 if (state->render_states[WINED3D_RS_FOGENABLE])
3068 {
3069 switch (state->render_states[WINED3D_RS_FOGTABLEMODE])
3070 {
3071 case WINED3D_FOG_NONE:
3073 case WINED3D_FOG_EXP: args->fog = WINED3D_FFP_PS_FOG_EXP; break;
3074 case WINED3D_FOG_EXP2: args->fog = WINED3D_FFP_PS_FOG_EXP2; break;
3075 }
3076 }
3077 else
3078 {
3080 }
3081 }
3082
3083 if (!d3d_info->full_ffp_varyings)
3084 {
3085 const struct wined3d_shader *vs = state->shader[WINED3D_SHADER_TYPE_VERTEX];
3086
3087 args->texcoords_initialized = 0;
3088 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
3089 {
3090 if (vs)
3091 {
3092 if (state->shader[WINED3D_SHADER_TYPE_VERTEX]->reg_maps.output_registers & (1u << i))
3093 args->texcoords_initialized |= 1u << i;
3094 }
3095 else
3096 {
3097 const struct wined3d_stream_info *si = &context->stream_info;
3098 unsigned int coord_idx = state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX];
3099
3100 if ((state->texture_states[i][WINED3D_TSS_TEXCOORD_INDEX] >> WINED3D_FFP_TCI_SHIFT)
3102 || (coord_idx < WINED3D_MAX_FFP_TEXTURES && (si->use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx)))))
3103 args->texcoords_initialized |= 1u << i;
3104 }
3105 }
3106 }
3107 else
3108 {
3109 args->texcoords_initialized = wined3d_mask_from_size(WINED3D_MAX_FFP_TEXTURES);
3110 }
3111
3112 args->pointsprite = state->render_states[WINED3D_RS_POINTSPRITEENABLE]
3113 && state->primitive_type == WINED3D_PT_POINTLIST;
3114
3115 if (d3d_info->ffp_alpha_test)
3116 args->alpha_test_func = WINED3D_CMP_ALWAYS - 1;
3117 else
3118 args->alpha_test_func = (state->render_states[WINED3D_RS_ALPHATESTENABLE]
3120 : WINED3D_CMP_ALWAYS) - 1;
3121
3122 if (d3d_info->emulated_flatshading)
3123 args->flatshading = state->render_states[WINED3D_RS_SHADEMODE] == WINED3D_SHADE_FLAT;
3124
3125 for (i = 0; i < ARRAY_SIZE(state->fb.render_targets); ++i)
3126 {
3127 struct wined3d_rendertarget_view *rtv = state->fb.render_targets[i];
3128 if (rtv && rtv->format->id == WINED3DFMT_A8_UNORM && !is_identity_fixup(rtv->format->color_fixup))
3129 args->rt_alpha_swizzle |= 1u << i;
3130 }
3131
3132 args->dual_source_blend = state->blend_state && state->blend_state->dual_source;
3133}
3134
3136 const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
3137{
3138 const struct wined3d_d3d_info *d3d_info = &device->adapter->d3d_info;
3139 HRESULT hr;
3140
3141 shader_init(shader, device, parent, parent_ops);
3142
3144 WINED3D_SHADER_TYPE_PIXEL, NULL, d3d_info->limits.ps_uniform_count)))
3145 {
3147 return hr;
3148 }
3149
3150 return WINED3D_OK;
3151}
3152
3154 unsigned int resource_idx, DWORD tex_types)
3155{
3156 static enum wined3d_shader_resource_type shader_resource_type_from_shader_tex_types[] =
3157 {
3158 WINED3D_SHADER_RESOURCE_TEXTURE_2D, /* WINED3D_SHADER_TEX_2D */
3159 WINED3D_SHADER_RESOURCE_TEXTURE_3D, /* WINED3D_SHADER_TEX_3D */
3160 WINED3D_SHADER_RESOURCE_TEXTURE_CUBE, /* WINED3D_SHADER_TEX_CUBE */
3161 };
3162
3163 unsigned int idx;
3164
3165 if (reg_maps->shader_version.major > 3)
3166 return reg_maps->resource_info[resource_idx].type;
3167
3168 if (!reg_maps->resource_info[resource_idx].type)
3169 return 0;
3170
3171 idx = (tex_types >> resource_idx * WINED3D_PSARGS_TEXTYPE_SHIFT) & WINED3D_PSARGS_TEXTYPE_MASK;
3172 assert(idx < ARRAY_SIZE(shader_resource_type_from_shader_tex_types));
3173 return shader_resource_type_from_shader_tex_types[idx];
3174}
3175
3177 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
3178{
3179 struct wined3d_shader *object;
3180 HRESULT hr;
3181
3182 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3184
3185 if (!(object = calloc(1, sizeof(*object))))
3186 return E_OUTOFMEMORY;
3187
3189
3191 {
3192 shader_cleanup(object);
3193 free(object);
3194 return hr;
3195 }
3196
3198
3199 TRACE("Created compute shader %p.\n", object);
3200 *shader = object;
3201
3202 return WINED3D_OK;
3203}
3204
3206 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
3207{
3208 struct wined3d_shader *object;
3209 HRESULT hr;
3210
3211 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3213
3214 if (!(object = calloc(1, sizeof(*object))))
3215 return E_OUTOFMEMORY;
3216
3218
3220 {
3221 shader_cleanup(object);
3222 free(object);
3223 return hr;
3224 }
3225
3227
3228 TRACE("Created domain shader %p.\n", object);
3229 *shader = object;
3230
3231 return WINED3D_OK;
3232}
3233
3235 const struct wined3d_stream_output_desc *so_desc, void *parent,
3236 const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
3237{
3238 struct wined3d_shader *object;
3239 HRESULT hr;
3240
3241 TRACE("device %p, desc %p, so_desc %p, parent %p, parent_ops %p, shader %p.\n",
3242 device, desc, so_desc, parent, parent_ops, shader);
3243
3244 if (!(object = calloc(1, sizeof(*object))))
3245 return E_OUTOFMEMORY;
3246
3247 if (FAILED(hr = geometry_shader_init(object, device, desc, so_desc, parent, parent_ops)))
3248 {
3249 WARN("Failed to initialize geometry shader, hr %#lx.\n", hr);
3250 free(object);
3251 return hr;
3252 }
3253
3255
3256 TRACE("Created geometry shader %p.\n", object);
3257 *shader = object;
3258
3259 return WINED3D_OK;
3260}
3261
3263 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
3264{
3265 struct wined3d_shader *object;
3266 HRESULT hr;
3267
3268 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3270
3271 if (!(object = calloc(1, sizeof(*object))))
3272 return E_OUTOFMEMORY;
3273
3275
3277 {
3278 shader_cleanup(object);
3279 free(object);
3280 return hr;
3281 }
3282
3284
3285 TRACE("Created hull shader %p.\n", object);
3286 *shader = object;
3287
3288 return WINED3D_OK;
3289}
3290
3292 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
3293{
3294 struct wined3d_shader *object;
3295 HRESULT hr;
3296
3297 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3299
3300 if (!(object = calloc(1, sizeof(*object))))
3301 return E_OUTOFMEMORY;
3302
3304 {
3305 WARN("Failed to initialize pixel shader, hr %#lx.\n", hr);
3306 free(object);
3307 return hr;
3308 }
3309
3311
3312 TRACE("Created pixel shader %p.\n", object);
3313 *shader = object;
3314
3315 return WINED3D_OK;
3316}
3317
3319 void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
3320{
3321 struct wined3d_shader *object;
3322 HRESULT hr;
3323
3324 TRACE("device %p, desc %p, parent %p, parent_ops %p, shader %p.\n",
3326
3327 if (!(object = calloc(1, sizeof(*object))))
3328 return E_OUTOFMEMORY;
3329
3331 {
3332 WARN("Failed to initialize vertex shader, hr %#lx.\n", hr);
3333 free(object);
3334 return hr;
3335 }
3336
3338
3339 TRACE("Created vertex shader %p.\n", object);
3340 *shader = object;
3341
3342 return WINED3D_OK;
3343}
3344
3346 const struct wined3d_ffp_vs_settings *settings, struct wined3d_shader **shader)
3347{
3348 struct wined3d_shader *object;
3349
3350 if (!(object = calloc(1, sizeof(*object))))
3351 return E_OUTOFMEMORY;
3352
3354 object->is_ffp_vs = true;
3355 if (!(object->byte_code = malloc(sizeof(*settings))))
3356 {
3357 free(object);
3358 return E_OUTOFMEMORY;
3359 }
3360 memcpy(object->byte_code, settings, sizeof(*settings));
3361
3363
3364 TRACE("Created FFP vertex shader %p.\n", object);
3365 *shader = object;
3366
3367 return WINED3D_OK;
3368}
3369
3371 const struct ffp_frag_settings *settings, struct wined3d_shader **shader)
3372{
3373 struct wined3d_shader *object;
3374
3375 if (!(object = calloc(1, sizeof(*object))))
3376 return E_OUTOFMEMORY;
3377
3379 object->is_ffp_ps = true;
3380 if (!(object->byte_code = malloc(sizeof(*settings))))
3381 {
3382 free(object);
3383 return E_OUTOFMEMORY;
3384 }
3385 memcpy(object->byte_code, settings, sizeof(*settings));
3386
3388
3389 TRACE("Created FFP pixel shader %p.\n", object);
3390 *shader = object;
3391
3392 return WINED3D_OK;
3393}
struct mke2fs_defaults settings[]
#define vsnprintf
Definition: acwin.h:108
static int state
Definition: maze.c:121
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define U(x)
Definition: wordpad.c:45
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
Definition: list.h:39
list(size_type __n, const_reference __val=_STLP_DEFAULT_CONSTRUCTED(value_type), const allocator_type &__a=allocator_type())
Definition: _list.h:306
Definition: _map.h:48
_STLP_TEMPLATE_FOR_CONT_EXT size_type count(const _KT &__x) const
Definition: _map.h:214
size_type size() const
Definition: _map.h:172
void wined3d_cs_destroy_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2299
void wined3d_cs_init_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2304
BYTE usage_idx
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define realloc
Definition: debug_ros.c:6
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT32 uint32_t
Definition: types.h:75
UINT64 uint64_t
Definition: types.h:77
static HRESULT shader_calculate_clip_or_cull_distance_mask(const struct wined3d_shader_signature_element *e, unsigned int *mask)
Definition: shader.c:941
void string_buffer_list_cleanup(struct wined3d_string_buffer_list *list)
Definition: shader.c:544
HRESULT CDECL wined3d_shader_create_gs(struct wined3d_device *device, const struct wined3d_shader_desc *desc, const struct wined3d_stream_output_desc *so_desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:3234
static void shader_none_get_caps(const struct wined3d_adapter *adapter, struct shader_caps *caps)
Definition: shader.c:2041
static void shader_signature_from_usage(struct wined3d_shader_signature_element *e, enum wined3d_decl_usage usage, UINT usage_idx, UINT reg_idx, DWORD write_mask)
Definition: shader.c:383
void string_buffer_clear(struct wined3d_string_buffer *buffer)
Definition: shader.c:411
static void shader_none_apply_compute_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader.c:1959
static void init_interpolation_compile_args(uint32_t *interpolation_args, const struct wined3d_shader *pixel_shader, const struct wined3d_d3d_info *d3d_info)
Definition: shader.c:2675
HRESULT CDECL wined3d_shader_create_vs(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:3318
static HRESULT vertex_shader_init(struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:2803
static void wined3d_insert_interpolation_mode(uint32_t *packed_interpolation_mode, unsigned int register_idx, enum wined3d_shader_interpolation_mode mode)
Definition: shader.c:958
BOOL shader_match_semantic(const char *semantic_name, enum wined3d_decl_usage usage)
Definition: shader.c:366
void *CDECL wined3d_shader_get_parent(const struct wined3d_shader *shader)
Definition: shader.c:2605
static void shader_none_free_context_data(struct wined3d_context *context)
Definition: shader.c:1964
ULONG CDECL wined3d_shader_incref(struct wined3d_shader *shader)
Definition: shader.c:2535
void find_ds_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, struct ds_compile_args *args, const struct wined3d_context *context)
Definition: shader.c:2838
static uint64_t shader_none_shader_compile(struct wined3d_context *context, const struct wined3d_shader_desc *shader_desc, enum wined3d_shader_type shader_type)
Definition: shader.c:2054
BOOL shader_get_stream_output_register_info(const struct wined3d_shader *shader, const struct wined3d_stream_output_element *so_element, unsigned int *register_idx, unsigned int *component_idx)
Definition: shader.c:2117
static HRESULT shader_set_function(struct wined3d_shader *shader, const struct wined3d_shader_desc *desc, enum wined3d_shader_type type, const struct wined3d_stream_output_desc *so_desc, unsigned int float_const_count)
Definition: shader.c:2319
const struct wined3d_shader_backend_ops none_shader_backend
Definition: shader.c:2060
HRESULT wined3d_shader_create_ffp_vs(struct wined3d_device *device, const struct wined3d_ffp_vs_settings *settings, struct wined3d_shader **shader)
Definition: shader.c:3345
struct wined3d_string_buffer * string_buffer_get(struct wined3d_string_buffer_list *list)
Definition: shader.c:484
HRESULT CDECL wined3d_shader_create_ps(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:3291
static void shader_none_precompile(void *shader_priv, struct wined3d_shader *shader)
Definition: shader.c:1958
static const char *const shader_opcode_names[]
Definition: shader.c:40
static const struct wined3d_shader_frontend * shader_select_frontend(enum vkd3d_shader_source_type source_type)
Definition: shader.c:395
static void shader_none_free(struct wined3d_device *device, struct wined3d_context *context)
Definition: shader.c:2027
static void shader_delete_constant_list(struct list *clist)
Definition: shader.c:556
static HRESULT geometry_shader_init_so_desc(struct wined3d_geometry_shader *gs, struct wined3d_device *device, const struct wined3d_stream_output_desc *so_desc)
Definition: shader.c:2139
HRESULT CDECL wined3d_shader_get_byte_code(const struct wined3d_shader *shader, void *byte_code, UINT *byte_code_size)
Definition: shader.c:2612
bool vshader_get_input(const struct wined3d_shader *shader, uint8_t usage_req, uint8_t usage_idx_req, unsigned int *regnum)
Definition: shader.c:2766
void find_gs_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, struct gs_compile_args *args, const struct wined3d_context *context)
Definition: shader.c:2858
void find_ps_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, BOOL position_transformed, struct ps_compile_args *args, const struct wined3d_context *context)
Definition: shader.c:2871
static void shader_set_limits(struct wined3d_shader *shader)
Definition: shader.c:565
static enum wined3d_sysval_semantic shader_sysval_semantic_from_usage(enum wined3d_decl_usage usage)
Definition: shader.c:355
HRESULT CDECL wined3d_shader_set_local_constants_float(struct wined3d_shader *shader, UINT start_idx, const float *src_data, UINT count)
Definition: shader.c:2637
static HRESULT geometry_shader_init_stream_output(struct wined3d_shader *shader, const struct wined3d_stream_output_desc *so_desc)
Definition: shader.c:2194
void string_buffer_free(struct wined3d_string_buffer *buffer)
Definition: shader.c:430
HRESULT wined3d_shader_create_ffp_ps(struct wined3d_device *device, const struct ffp_frag_settings *settings, struct wined3d_shader **shader)
Definition: shader.c:3370
static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param)
Definition: shader.c:839
ULONG CDECL wined3d_shader_decref(struct wined3d_shader *shader)
Definition: shader.c:2588
void find_vs_compile_args(const struct wined3d_state *state, const struct wined3d_shader *shader, struct vs_compile_args *args, const struct wined3d_context *context)
Definition: shader.c:2689
enum vkd3d_shader_visibility vkd3d_shader_visibility_from_wined3d(enum wined3d_shader_type shader_type)
Definition: shader.c:309
static const char *const semantic_names[]
Definition: shader.c:283
static HRESULT shader_get_registers_used(struct wined3d_shader *shader, DWORD constf_size)
Definition: shader.c:1003
static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e, const struct wined3d_shader_semantic *s)
Definition: shader.c:371
void string_buffer_sprintf(struct wined3d_string_buffer *buffer, const char *format,...)
Definition: shader.c:515
static void shader_none_destroy(struct wined3d_shader *shader)
Definition: shader.c:1963
static int string_buffer_vsprintf(struct wined3d_string_buffer *buffer, const char *format, va_list args)
Definition: shader.c:507
BOOL string_buffer_init(struct wined3d_string_buffer *buffer)
Definition: shader.c:417
static unsigned int shader_max_version_from_feature_level(enum wined3d_feature_level level)
Definition: shader.c:2080
int shader_addline(struct wined3d_string_buffer *buffer, const char *format,...)
Definition: shader.c:467
static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins)
Definition: shader.c:1957
HRESULT CDECL wined3d_shader_create_hs(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:3262
HRESULT CDECL wined3d_shader_create_ds(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:3205
static HRESULT shader_reg_maps_add_tgsm(struct wined3d_shader_reg_maps *reg_maps, unsigned int register_idx, unsigned int size, unsigned int stride)
Definition: shader.c:859
int shader_vaddline(struct wined3d_string_buffer *buffer, const char *format, va_list args)
Definition: shader.c:453
static struct wined3d_shader_signature_element * shader_find_signature_element(const struct wined3d_shader_signature *s, unsigned int stream_idx, const char *semantic_name, unsigned int semantic_idx)
Definition: shader.c:2100
static void shader_none_apply_draw_state(void *shader_priv, struct wined3d_context *context, const struct wined3d_state *state)
Definition: shader.c:1968
HRESULT CDECL wined3d_shader_create_cs(struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_shader **shader)
Definition: shader.c:3176
static HRESULT geometry_shader_init(struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, const struct wined3d_stream_output_desc *so_desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:2820
BOOL string_buffer_resize(struct wined3d_string_buffer *buffer, int rc)
Definition: shader.c:435
static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
Definition: shader.c:2047
static HRESULT shader_record_shader_phase(struct wined3d_shader *shader, struct wined3d_shader_phase **current_phase, const struct wined3d_shader_instruction *ins, const DWORD *current_instruction_ptr, const DWORD *previous_instruction_ptr)
Definition: shader.c:886
static HRESULT shader_scan_output_signature(struct wined3d_shader *shader)
Definition: shader.c:968
static void shader_cleanup_reg_maps(struct wined3d_shader_reg_maps *reg_maps)
Definition: shader.c:1849
static HRESULT pixel_shader_init(struct wined3d_shader *shader, struct wined3d_device *device, const struct wined3d_shader_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:3135
static void shader_none_update_float_vertex_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader.c:1961
static void shader_record_sample(struct wined3d_shader_reg_maps *reg_maps, unsigned int resource_idx, unsigned int sampler_idx, unsigned int bind_idx)
Definition: shader.c:794
static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, const struct wined3d_fragment_pipe_ops *fragment_pipe)
Definition: shader.c:1993
static enum wined3d_decl_usage shader_usage_from_semantic_name(const char *name)
Definition: shader.c:342
const char * debug_d3dshaderinstructionhandler(enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx)
Definition: shader.c:301
static BOOL shader_none_allocate_context_data(struct wined3d_context *context)
Definition: shader.c:2036
void string_buffer_release(struct wined3d_string_buffer_list *list, struct wined3d_string_buffer *buffer)
Definition: shader.c:532
static BOOL shader_record_register_usage(struct wined3d_shader *shader, struct wined3d_shader_reg_maps *reg_maps, const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type, unsigned int constf_size)
Definition: shader.c:670
void string_buffer_list_init(struct wined3d_string_buffer_list *list)
Definition: shader.c:539
static void shader_init(struct wined3d_shader *shader, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: shader.c:2786
enum wined3d_shader_resource_type pixelshader_get_resource_type(const struct wined3d_shader_reg_maps *reg_maps, unsigned int resource_idx, DWORD tex_types)
Definition: shader.c:3153
static const char * shader_semantic_name_from_usage(enum wined3d_decl_usage usage)
Definition: shader.c:331
static void shader_none_update_float_pixel_constants(struct wined3d_device *device, UINT start, UINT count)
Definition: shader.c:1962
static void shader_none_disable(void *shader_priv, struct wined3d_context *context)
Definition: shader.c:1978
static void shader_cleanup(struct wined3d_shader *shader)
Definition: shader.c:1927
static void shader_trace(const void *code, size_t size, enum vkd3d_shader_source_type source_type)
Definition: shader.c:2271
unsigned int shader_find_free_input_register(const struct wined3d_shader_reg_maps *reg_maps, unsigned int max)
Definition: shader.c:1863
static void shader_none_init_context_state(struct wined3d_context *context)
Definition: shader.c:1965
const struct wined3d_vec4 wined3d_srgb_const[]
Definition: shader.c:32
static void wined3d_shader_destroy_object(void *object)
Definition: shader.c:2580
static void wined3d_shader_init_object(void *object)
Definition: shader.c:2544
static BOOL match_usage(BYTE usage1, BYTE usage_idx1, BYTE usage2, BYTE usage_idx2)
Definition: shader.c:2752
HRESULT shader_generate_code(const struct wined3d_shader *shader, struct wined3d_string_buffer *buffer, const struct wined3d_shader_reg_maps *reg_maps, void *backend_ctx, const DWORD *start, const DWORD *end)
Definition: shader.c:1873
unsigned int idx
Definition: utils.c:40
const char * debug_shader_type(enum wined3d_shader_type type)
Definition: utils.c:5313
BOOL wined3d_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
Definition: utils.c:6740
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
#define CDECL
Definition: compat.h:29
#define TRACE_ON(x)
Definition: compat.h:75
#define stricmp(_String1, _String2)
Definition: compat.h:24
static const WCHAR version[]
Definition: asmname.c:66
#define assert(_expr)
Definition: assert.h:32
#define isinf(x)
Definition: math.h:359
#define isnan(x)
Definition: math.h:360
#define va_end(v)
Definition: stdarg.h:28
#define va_start(v, l)
Definition: stdarg.h:26
unsigned char uint8_t
Definition: stdint.h:33
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
char * va_list
Definition: vadefs.h:50
return ret
Definition: mutex.c:147
r parent
Definition: btrfs.c:3010
size_t const new_size
Definition: expand.cpp:66
bool ffp_hlsl_compile_ps(const struct ffp_frag_settings *settings, struct wined3d_shader_desc *shader_desc)
Definition: ffp_hlsl.c:971
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
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
return adapter
GLuint start
Definition: gl.h:1545
GLint level
Definition: gl.h:1546
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLuint GLuint end
Definition: gl.h:1545
GLdouble n
Definition: glext.h:7729
GLenum GLuint texture
Definition: glext.h:6295
GLsizei stride
Definition: glext.h:5848
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLuint shader
Definition: glext.h:6030
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLenum mode
Definition: glext.h:6217
GLbitfield flags
Definition: glext.h:7161
GLfloat param
Definition: glext.h:5796
GLenum GLenum GLenum input
Definition: glext.h:9031
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
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
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 * u
Definition: glfuncs.h:240
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 GLint GLint j
Definition: glfuncs.h:250
unsigned int UINT
Definition: sysinfo.c:13
static int reg
Definition: i386-dis.c:1290
#define gs
Definition: i386-dis.c:445
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
unsigned min_version
Definition: lex.c:39
#define e
Definition: ke_i.h:82
if(dx< 0)
Definition: linetemp.h:194
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
static SYSTEM_INFO si
Definition: virtual.c:39
static vector_t * vs
Definition: server.c:146
static float(__cdecl *square_half_float)(float x
#define min(a, b)
Definition: monoChain.cc:55
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define calloc
Definition: rosglue.h:14
#define FIXME_ON(ch)
Definition: debug.h:418
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
#define wine_rb_entry
Definition: rbtree.h:404
#define WINE_RB_ENTRY_VALUE
Definition: rbtree.h:414
#define wine_rb_put
Definition: rbtree.h:410
#define wine_rb_get
Definition: rbtree.h:409
#define memset(x, y, z)
Definition: compat.h:39
#define args
Definition: format.c:66
const struct wined3d_shader_frontend sm1_shader_frontend
Definition: shader_sm1.c:804
const struct wined3d_shader_frontend sm4_shader_frontend
Definition: shader_sm4.c:1831
HRESULT wined3d_shader_extract_from_dxbc(struct wined3d_shader *shader, unsigned int max_shader_version, enum vkd3d_shader_source_type *source_type)
Definition: shader_sm4.c:2085
#define TRACE(s)
Definition: solgame.cpp:4
Definition: match.c:390
Definition: inflate.c:139
Definition: http.c:7252
Definition: devices.h:37
Definition: parser.c:49
Definition: list.h:15
Definition: name.c:39
const struct wined3d_vertex_pipe_ops * vertex_pipe
Definition: shader.c:1953
const struct wined3d_fragment_pipe_ops * fragment_pipe
Definition: shader.c:1954
const void * code
Definition: vkd3d_shader.h:413
uint32_t full_ffp_varyings
struct wined3d_d3d_limits limits
uint32_t emulated_flatshading
uint32_t shader_output_interpolation
uint32_t srgb_write_control
const struct wined3d_parent_ops * parent_ops
const struct wined3d_format * format
const struct wined3d_shader_reg_maps * reg_maps
struct wined3d_shader_tex_mx * tex_mx
const DWORD * byte_code
Definition: wined3d.h:2105
size_t byte_code_size
Definition: wined3d.h:2106
void(* shader_read_header)(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
BOOL(* shader_is_end)(void *data, const DWORD **ptr)
void *(* shader_init)(const DWORD *byte_code, size_t byte_code_size, const struct wined3d_shader_signature *output_signature)
void(* shader_free)(void *data)
void(* shader_read_instruction)(void *data, const DWORD **ptr, struct wined3d_shader_instruction *ins)
struct wined3d_shader_primitive_type primitive_type
struct wined3d_shader_tgsm_structured tgsm_structured
enum wined3d_tessellator_partitioning tessellator_partitioning
const struct wined3d_shader_src_param * src
union wined3d_shader_instruction::@348 declaration
struct wined3d_shader_semantic semantic
const struct wined3d_shader_dst_param * dst
const struct wined3d_shader_src_param * predicate
enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx
struct wined3d_shader_indexable_temp indexable_temp
struct wined3d_shader_structured_resource structured_resource
enum wined3d_tessellator_output_primitive tessellator_output_primitive
enum wined3d_tessellator_domain tessellator_domain
struct wined3d_shader_tgsm_raw tgsm_raw
const struct wined3d_shader_context * ctx
const struct wined3d_shader_immediate_constant_buffer * icb
struct wined3d_shader_thread_group_size thread_group_size
unsigned int instance_count
unsigned int temporary_count
UINT cb_sizes[WINED3D_MAX_CBS]
struct wined3d_shader_version shader_version
DWORD texcoord_mask[MAX_REG_TEXCRD]
union wined3d_shader_reg_maps::@346 u
struct wined3d_shader_tgsm * tgsm
const struct wined3d_shader_immediate_constant_buffer * icb
struct wined3d_shader_sampler_map sampler_map
BYTE output_registers_mask[MAX_REG_OUTPUT]
uint32_t resource_map[WINED3D_BITMAP_SIZE(MAX_SHADER_RESOURCE_VIEWS)]
struct wined3d_shader_resource_info resource_info[MAX_SHADER_RESOURCE_VIEWS]
struct wined3d_shader_resource_info uav_resource_info[MAX_UNORDERED_ACCESS_VIEWS]
struct wined3d_shader_sampler_map_entry * entries
struct wined3d_shader_dst_param reg
enum wined3d_decl_usage usage
enum wined3d_data_type resource_data_type
enum wined3d_shader_resource_type resource_type
struct wined3d_shader_signature_element * elements
enum wined3d_shader_type type
union wined3d_shader::@358 u
const struct wined3d_parent_ops * parent_ops
struct wined3d_pixel_shader ps
const struct wined3d_shader_limits * limits
struct wined3d_shader_reg_maps reg_maps
struct wined3d_hull_shader hs
unsigned int element_count
Definition: wined3d.h:2122
const struct wined3d_stream_output_element * elements
Definition: wined3d.h:2121
#define max(a, b)
Definition: svc.c:63
#define LIST_ENTRY(type)
Definition: queue.h:175
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint32_t ULONG
Definition: typedefs.h:59
Definition: pdh_main.c:64
@ VKD3D_SHADER_COMPILE_OPTION_API_VERSION
Definition: vkd3d_shader.h:279
VKD3D_SHADER_API void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code)
vkd3d_shader_source_type
@ VKD3D_SHADER_SOURCE_D3D_BYTECODE
@ VKD3D_SHADER_SOURCE_DXBC_TPF
@ VKD3D_SHADER_LOG_WARNING
@ VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO
Definition: vkd3d_shader.h:68
vkd3d_shader_visibility
Definition: vkd3d_shader.h:383
@ VKD3D_SHADER_VISIBILITY_DOMAIN
Definition: vkd3d_shader.h:391
@ VKD3D_SHADER_VISIBILITY_COMPUTE
Definition: vkd3d_shader.h:398
@ VKD3D_SHADER_VISIBILITY_PIXEL
Definition: vkd3d_shader.h:395
@ VKD3D_SHADER_VISIBILITY_ALL
Definition: vkd3d_shader.h:385
@ VKD3D_SHADER_VISIBILITY_GEOMETRY
Definition: vkd3d_shader.h:393
@ VKD3D_SHADER_VISIBILITY_VERTEX
Definition: vkd3d_shader.h:387
@ VKD3D_SHADER_VISIBILITY_HULL
Definition: vkd3d_shader.h:389
@ VKD3D_SHADER_API_VERSION_1_6
Definition: vkd3d_shader.h:51
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_ASM
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
const struct wined3d_parent_ops wined3d_null_parent_ops
Definition: directx.c:3472
@ WINED3D_SHADE_FLAT
Definition: wined3d.h:488
static unsigned int wined3d_log2i(unsigned int x)
Definition: wined3d.h:2952
@ WINED3D_FOG_LINEAR
Definition: wined3d.h:483
@ WINED3D_FOG_EXP
Definition: wined3d.h:481
@ WINED3D_FOG_NONE
Definition: wined3d.h:480
@ WINED3D_FOG_EXP2
Definition: wined3d.h:482
wined3d_decl_usage
Definition: wined3d.h:806
@ WINED3D_DECL_USAGE_PSIZE
Definition: wined3d.h:811
@ WINED3D_DECL_USAGE_POSITION
Definition: wined3d.h:807
@ WINED3D_DECL_USAGE_COLOR
Definition: wined3d.h:817
@ WINED3D_DECL_USAGE_POSITIONT
Definition: wined3d.h:816
@ WINED3D_DECL_USAGE_TEXCOORD
Definition: wined3d.h:812
@ WINED3D_DECL_USAGE_FOG
Definition: wined3d.h:818
@ WINED3D_RS_SHADEMODE
Definition: wined3d.h:295
@ WINED3D_RS_FOGTABLEMODE
Definition: wined3d.h:318
@ WINED3D_RS_CLIPPLANEENABLE
Definition: wined3d.h:360
@ WINED3D_RS_FOGENABLE
Definition: wined3d.h:311
@ WINED3D_RS_POINTSPRITEENABLE
Definition: wined3d.h:364
@ WINED3D_RS_CLIPPING
Definition: wined3d.h:346
@ WINED3D_RS_ALPHATESTENABLE
Definition: wined3d.h:301
@ WINED3D_RS_ALPHAFUNC
Definition: wined3d.h:308
@ WINED3D_PT_POINTLIST
Definition: wined3d.h:76
static int wined3d_bit_scan(unsigned int *x)
Definition: wined3d.h:2982
#define WINED3D_OK
Definition: wined3d.h:33
#define WINED3DUSAGE_LEGACY_CUBEMAP
Definition: wined3d.h:934
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
@ WINED3D_RTYPE_TEXTURE_1D
Definition: wined3d.h:719
@ WINED3D_RTYPE_NONE
Definition: wined3d.h:717
@ WINED3D_RTYPE_BUFFER
Definition: wined3d.h:718
@ WINED3D_RTYPE_TEXTURE_3D
Definition: wined3d.h:721
#define WINED3D_VIEW_BUFFER_RAW
Definition: wined3d.h:1579
#define WINED3D_MAX_FRAGMENT_SAMPLERS
Definition: wined3d.h:1598
@ WINED3D_TSS_TEXCOORD_INDEX
Definition: wined3d.h:604
@ WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS
Definition: wined3d.h:607
@ WINED3DFMT_A8_UNORM
Definition: wined3d.h:222
@ WINED3D_CMP_ALWAYS
Definition: wined3d.h:468
wined3d_feature_level
Definition: wined3d.h:98
@ WINED3D_FEATURE_LEVEL_11
Definition: wined3d.h:109
@ WINED3D_FEATURE_LEVEL_10_1
Definition: wined3d.h:108
@ WINED3D_FEATURE_LEVEL_9_3
Definition: wined3d.h:106
@ WINED3D_FEATURE_LEVEL_10
Definition: wined3d.h:107
@ WINED3D_FEATURE_LEVEL_11_1
Definition: wined3d.h:110
@ WINED3D_FEATURE_LEVEL_9_1
Definition: wined3d.h:104
@ WINED3D_FEATURE_LEVEL_9_2
Definition: wined3d.h:105
#define WINED3D_MAX_CLIP_DISTANCES
Definition: wined3d.h:1601
@ WINED3D_TTFF_COUNT2
Definition: wined3d.h:620
@ WINED3D_TTFF_COUNT4
Definition: wined3d.h:622
@ WINED3D_TTFF_COUNT3
Definition: wined3d.h:621
@ WINED3D_TTFF_COUNT1
Definition: wined3d.h:619
@ WINED3D_TTFF_PROJECTED
Definition: wined3d.h:623
wined3d_shader_type
Definition: wined3d.h:840
@ WINED3D_SHADER_TYPE_HULL
Definition: wined3d.h:844
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_GEOMETRY
Definition: wined3d.h:843
@ WINED3D_SHADER_TYPE_DOMAIN
Definition: wined3d.h:845
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842
@ WINED3D_TS_PROJECTION
Definition: wined3d.h:668
#define WINED3DERR_INVALIDCALL
Definition: wined3d.h:44
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
void WINAPI wined3d_mutex_unlock(void)
Definition: wined3d_main.c:544
void WINAPI wined3d_mutex_lock(void)
Definition: wined3d_main.c:539
#define WINED3DSP_WRITEMASK_ALL
@ WINED3D_TYPE_FLOAT
#define MAX_REG_OUTPUT
#define WINED3DSP_WRITEMASK_0
@ WINED3D_DATA_UINT
@ WINED3D_DATA_FLOAT
wined3d_shader_interpolation_mode
@ WINED3DSIM_LINEAR_NOPERSPECTIVE_SAMPLE
WINED3D_SHADER_INSTRUCTION_HANDLER
@ WINED3DSIH_DSX_COARSE
@ WINED3DSIH_DCL_TESSELLATOR_PARTITIONING
@ WINED3DSIH_DCL_TEMPS
@ WINED3DSIH_GATHER4_PO_C
@ WINED3DSIH_ATOMIC_XOR
@ WINED3DSIH_DSX_FINE
@ WINED3DSIH_DCL_OUTPUT
@ WINED3DSIH_M3x3
@ WINED3DSIH_IMM_ATOMIC_XOR
@ WINED3DSIH_TEXREG2RGB
@ WINED3DSIH_TEXLDL
@ WINED3DSIH_DEFI
@ WINED3DSIH_SAMPLE_B
@ WINED3DSIH_DCL_CONSTANT_BUFFER
@ WINED3DSIH_TEXREG2AR
@ WINED3DSIH_TEXREG2GB
@ WINED3DSIH_LOOP
@ WINED3DSIH_DSY_COARSE
@ WINED3DSIH_M3x4
@ WINED3DSIH_SAMPLE_LOD
@ WINED3DSIH_LD
@ WINED3DSIH_TEXM3x3TEX
@ WINED3DSIH_SAMPLE_GRAD
@ WINED3DSIH_ATOMIC_AND
@ WINED3DSIH_TEXM3x3VSPEC
@ WINED3DSIH_LD2DMS
@ WINED3DSIH_SAMPLE
@ WINED3DSIH_MOV
@ WINED3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER
@ WINED3DSIH_NRM
@ WINED3DSIH_DCL_THREAD_GROUP
@ WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE
@ WINED3DSIH_LD_RAW
@ WINED3DSIH_GATHER4
@ WINED3DSIH_HS_CONTROL_POINT_PHASE
@ WINED3DSIH_DEFB
@ WINED3DSIH_LD_STRUCTURED
@ WINED3DSIH_IMM_ATOMIC_AND
@ WINED3DSIH_TEXM3x2TEX
@ WINED3DSIH_IMM_ATOMIC_CONSUME
@ WINED3DSIH_HS_FORK_PHASE
@ WINED3DSIH_SAMPLE_INFO
@ WINED3DSIH_DSX
@ WINED3DSIH_DCL
@ WINED3DSIH_DCL_VERTICES_OUT
@ WINED3DSIH_CALL
@ WINED3DSIH_HS_JOIN_PHASE
@ WINED3DSIH_ENDREP
@ WINED3DSIH_BEM
@ WINED3DSIH_TEXDP3TEX
@ WINED3DSIH_TEXBEML
@ WINED3DSIH_DCL_OUTPUT_TOPOLOGY
@ WINED3DSIH_TEXM3x3SPEC
@ WINED3DSIH_DCL_SAMPLER
@ WINED3DSIH_TEXBEM
@ WINED3DSIH_DCL_GS_INSTANCES
@ WINED3DSIH_DCL_TGSM_RAW
@ WINED3DSIH_M3x2
@ WINED3DSIH_DCL_UAV_TYPED
@ WINED3DSIH_TEXLDD
@ WINED3DSIH_TABLE_SIZE
@ WINED3DSIH_REP
@ WINED3DSIH_IFC
@ WINED3DSIH_SAMPLE_C_LZ
@ WINED3DSIH_ENDLOOP
@ WINED3DSIH_DSY
@ WINED3DSIH_MOVA
@ WINED3DSIH_DCL_INPUT_PS
@ WINED3DSIH_GATHER4_C
@ WINED3DSIH_LD_UAV_TYPED
@ WINED3DSIH_DEF
@ WINED3DSIH_GATHER4_PO
@ WINED3DSIH_DCL_UAV_STRUCTURED
@ WINED3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT
@ WINED3DSIH_DCL_GLOBAL_FLAGS
@ WINED3DSIH_POW
@ WINED3DSIH_M4x3
@ WINED3DSIH_BUFINFO
@ WINED3DSIH_IMM_ATOMIC_ALLOC
@ WINED3DSIH_TEX
@ WINED3DSIH_DCL_TESSELLATOR_DOMAIN
@ WINED3DSIH_LABEL
@ WINED3DSIH_RESINFO
@ WINED3DSIH_DCL_TGSM_STRUCTURED
@ WINED3DSIH_M4x4
@ WINED3DSIH_SAMPLE_C
@ WINED3DSIH_DCL_UAV_RAW
@ WINED3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT
@ WINED3DSIH_DCL_INDEXABLE_TEMP
@ WINED3DSIH_DCL_RESOURCE_RAW
@ WINED3DSIH_DCL_INPUT_PRIMITIVE
@ WINED3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT
@ WINED3DSIH_DSY_FINE
@ WINED3DSIH_DCL_RESOURCE_STRUCTURED
#define WINED3D_MAX_CBS
#define WINED3D_PSARGS_PROJECTED
@ WINED3D_FFP_TEXCOORD0
#define WINED3DSI_SAMPLER_COMPARISON_MODE
#define WINED3D_FFP_TCI_SHIFT
#define WINED3D_PACKED_INTERPOLATION_BIT_COUNT
#define WINED3D_PSARGS_TEXTYPE_MASK
@ WINED3D_VP_MODE_NONE
@ WINED3D_VP_MODE_FF
@ WINED3D_VP_MODE_SHADER
static BOOL use_vs(const struct wined3d_state *state)
#define WINED3D_FORMAT_CAP_SHADOW
#define WINED3D_PSARGS_TEXTRANSFORM_SHIFT
#define MAX_REG_INPUT
wined3d_sysval_semantic
@ WINED3D_SV_CULL_DISTANCE
@ WINED3D_SV_CLIP_DISTANCE
@ WINED3D_SV_VIEWPORT_ARRAY_INDEX
@ WINED3D_SV_IS_FRONT_FACE
@ WINED3D_SV_POSITION
#define MAX_UNORDERED_ACCESS_VIEWS
#define WINED3D_FFP_TCI_MASK
wined3d_shader_resource_type
@ WINED3D_SHADER_RESOURCE_BUFFER
@ WINED3D_SHADER_RESOURCE_TEXTURE_3D
@ WINED3D_SHADER_RESOURCE_TEXTURE_2D
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS
@ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE
@ WINED3D_SHADER_RESOURCE_TEXTURE_1D
#define WINED3D_SAMPLER_DEFAULT
static enum wined3d_cmp_func wined3d_sanitize_cmp_func(enum wined3d_cmp_func func)
@ VS_FOG_COORD
@ VS_FOG_W
@ VS_FOG_Z
static BOOL can_use_texture_swizzle(const struct wined3d_d3d_info *d3d_info, const struct wined3d_format *format)
static uint32_t wined3d_mask_from_size(unsigned int size)
#define WINED3D_SHADER_VERSION(major, minor)
static const char * wined3d_get_line(const char **ptr, const char *end)
static const struct color_fixup_desc COLOR_FIXUP_IDENTITY
static BOOL wined3d_bitmap_set(uint32_t *map, unsigned int idx)
static void wined3d_insert_bits(uint32_t *bitstream, unsigned int offset, unsigned int count, DWORD bits)
static BOOL is_identity_fixup(struct color_fixup_desc fixup)
@ WINED3DSPR_CONSTBOOL
@ WINED3DSPR_RESOURCE
@ WINED3DSPR_COLOROUT
@ WINED3DSPR_CONST
@ WINED3DSPR_OUTCONTROLPOINT
@ WINED3DSPR_CONSTINT
@ WINED3DSPR_ATTROUT
@ WINED3DSPR_STENCILREF
@ WINED3DSPR_DEPTHOUTGE
@ WINED3DSPR_UAV
@ WINED3DSPR_SAMPLER
@ WINED3DSPR_RASTOUT
@ WINED3DSPR_OUTPUT
@ WINED3DSPR_INPUT
@ WINED3DSPR_SAMPLEMASK
@ WINED3DSPR_TEMP
@ WINED3DSPR_DEPTHOUT
@ WINED3DSPR_TEXCRDOUT
@ WINED3DSPR_TEXTURE
@ WINED3DSPR_DEPTHOUTLE
@ WINED3DSPR_MISCTYPE
#define WINED3D_PSARGS_TEXTYPE_SHIFT
#define WINED3DSP_NOSWIZZLE
static BOOL needs_srgb_write(const struct wined3d_d3d_info *d3d_info, const struct wined3d_state *state, const struct wined3d_fb_state *fb)
@ WINED3DSGF_FORCE_EARLY_DEPTH_STENCIL
wined3d_shader_tex_types
@ WINED3D_SHADER_TEX_3D
@ WINED3D_SHADER_TEX_2D
@ WINED3D_SHADER_TEX_CUBE
#define MAX_ATTRIBS
@ WINED3D_FFP_PS_FOG_EXP
@ WINED3D_FFP_PS_FOG_OFF
@ WINED3D_FFP_PS_FOG_EXP2
@ WINED3D_FFP_PS_FOG_LINEAR
#define MAX_TGSM_REGISTERS
static unsigned int wined3d_popcount(unsigned int x)
static struct wined3d_texture * texture_from_resource(struct wined3d_resource *resource)
#define WINED3DSP_WRITEMASK_1
unsigned char BYTE
Definition: xxhash.c:193