ReactOS 0.4.17-dev-934-g091855f
d3dbc.c
Go to the documentation of this file.
1/*
2 * d3dbc (Direct3D shader models 1-3 bytecode) support
3 *
4 * Copyright 2002-2003 Jason Edmeades
5 * Copyright 2002-2003 Raphael Junqueira
6 * Copyright 2004 Christian Costa
7 * Copyright 2005 Oliver Stieber
8 * Copyright 2006 Ivan Gyurdiev
9 * Copyright 2007-2008 Stefan Dösinger for CodeWeavers
10 * Copyright 2009, 2021 Henri Verbeet for CodeWeavers
11 * Copyright 2019-2020 Zebediah Figura for CodeWeavers
12 *
13 * This library is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
17 *
18 * This library is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
22 *
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with this library; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 */
27
28#include "hlsl.h"
29
30#define VKD3D_SM1_VS 0xfffeu
31#define VKD3D_SM1_PS 0xffffu
32
33#define VKD3D_SM1_DCL_USAGE_SHIFT 0u
34#define VKD3D_SM1_DCL_USAGE_MASK (0xfu << VKD3D_SM1_DCL_USAGE_SHIFT)
35#define VKD3D_SM1_DCL_USAGE_INDEX_SHIFT 16u
36#define VKD3D_SM1_DCL_USAGE_INDEX_MASK (0xfu << VKD3D_SM1_DCL_USAGE_INDEX_SHIFT)
37
38#define VKD3D_SM1_RESOURCE_TYPE_SHIFT 27u
39#define VKD3D_SM1_RESOURCE_TYPE_MASK (0xfu << VKD3D_SM1_RESOURCE_TYPE_SHIFT)
40
41#define VKD3D_SM1_OPCODE_MASK 0x0000ffffu
42
43#define VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT 16u
44#define VKD3D_SM1_INSTRUCTION_FLAGS_MASK (0xffu << VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT)
45
46#define VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT 24u
47#define VKD3D_SM1_INSTRUCTION_LENGTH_MASK (0xfu << VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT)
48
49#define VKD3D_SM1_COISSUE (0x1u << 30u)
50
51#define VKD3D_SM1_COMMENT_SIZE_SHIFT 16u
52#define VKD3D_SM1_COMMENT_SIZE_MASK (0x7fffu << VKD3D_SM1_COMMENT_SIZE_SHIFT)
53
54#define VKD3D_SM1_INSTRUCTION_PREDICATED (0x1u << 28u)
55
56#define VKD3D_SM1_INSTRUCTION_PARAMETER (0x1u << 31u)
57
58#define VKD3D_SM1_REGISTER_NUMBER_MASK 0x000007ffu
59
60#define VKD3D_SM1_REGISTER_TYPE_SHIFT 28u
61#define VKD3D_SM1_REGISTER_TYPE_MASK (0x7u << VKD3D_SM1_REGISTER_TYPE_SHIFT)
62#define VKD3D_SM1_REGISTER_TYPE_SHIFT2 8u
63#define VKD3D_SM1_REGISTER_TYPE_MASK2 (0x18u << VKD3D_SM1_REGISTER_TYPE_SHIFT2)
64
65#define VKD3D_SM1_ADDRESS_MODE_SHIFT 13u
66#define VKD3D_SM1_ADDRESS_MODE_MASK (0x1u << VKD3D_SM1_ADDRESS_MODE_SHIFT)
67
68#define VKD3D_SM1_DST_MODIFIER_SHIFT 20u
69#define VKD3D_SM1_DST_MODIFIER_MASK (0xfu << VKD3D_SM1_DST_MODIFIER_SHIFT)
70
71#define VKD3D_SM1_DSTSHIFT_SHIFT 24u
72#define VKD3D_SM1_DSTSHIFT_MASK (0xfu << VKD3D_SM1_DSTSHIFT_SHIFT)
73
74#define VKD3D_SM1_WRITEMASK_SHIFT 16u
75#define VKD3D_SM1_WRITEMASK_MASK (0xfu << VKD3D_SM1_WRITEMASK_SHIFT)
76
77#define VKD3D_SM1_SWIZZLE_SHIFT 16u
78#define VKD3D_SM1_SWIZZLE_MASK (0xffu << VKD3D_SM1_SWIZZLE_SHIFT)
79#define VKD3D_SM1_SWIZZLE_DEFAULT (0u | (1u << 2) | (2u << 4) | (3u << 6))
80
81#define VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx) (2u * (idx))
82#define VKD3D_SM1_SWIZZLE_COMPONENT_MASK(idx) (0x3u << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx))
83
84#define VKD3D_SM1_SRC_MODIFIER_SHIFT 24u
85#define VKD3D_SM1_SRC_MODIFIER_MASK (0xfu << VKD3D_SM1_SRC_MODIFIER_SHIFT)
86
87#define VKD3D_SM1_END 0x0000ffffu
88
89#define VKD3D_SM1_VERSION_MAJOR(version) (((version) >> 8u) & 0xffu)
90#define VKD3D_SM1_VERSION_MINOR(version) (((version) >> 0u) & 0xffu)
91
93{
96};
97
99{
105};
106
108{
111};
112
114{
164
198
202};
203
205{
207 unsigned int dst_count;
208 unsigned int src_count;
210 struct
211 {
212 unsigned int major, minor;
214};
215
217{
219 const uint32_t *start, *end, *ptr;
220 bool abort;
221
223
224 struct
225 {
226#define MAX_CONSTANT_COUNT 8192
230};
231
232/* This table is not order or position dependent. */
234{
235 /* Arithmetic */
238 {VKD3D_SM1_OP_MOVA, 1, 1, VKD3DSIH_MOVA, {2, 0}, {~0u, ~0u}},
262 {VKD3D_SM1_OP_SGN, 1, 3, VKD3DSIH_SGN, {2, 0}, { 2, 1}},
263 {VKD3D_SM1_OP_SGN, 1, 1, VKD3DSIH_SGN, {3, 0}, {~0u, ~0u}},
265 {VKD3D_SM1_OP_SINCOS, 1, 3, VKD3DSIH_SINCOS, {2, 0}, { 2, 1}},
266 {VKD3D_SM1_OP_SINCOS, 1, 1, VKD3DSIH_SINCOS, {3, 0}, {~0u, ~0u}},
267 /* Matrix */
273 /* Declarations */
275 /* Constant definitions */
279 /* Control flow */
280 {VKD3D_SM1_OP_REP, 0, 1, VKD3DSIH_REP, {2, 0}, {~0u, ~0u}},
281 {VKD3D_SM1_OP_ENDREP, 0, 0, VKD3DSIH_ENDREP, {2, 0}, {~0u, ~0u}},
282 {VKD3D_SM1_OP_IF, 0, 1, VKD3DSIH_IF, {2, 0}, {~0u, ~0u}},
283 {VKD3D_SM1_OP_IFC, 0, 2, VKD3DSIH_IFC, {2, 1}, {~0u, ~0u}},
284 {VKD3D_SM1_OP_ELSE, 0, 0, VKD3DSIH_ELSE, {2, 0}, {~0u, ~0u}},
285 {VKD3D_SM1_OP_ENDIF, 0, 0, VKD3DSIH_ENDIF, {2, 0}, {~0u, ~0u}},
286 {VKD3D_SM1_OP_BREAK, 0, 0, VKD3DSIH_BREAK, {2, 1}, {~0u, ~0u}},
287 {VKD3D_SM1_OP_BREAKC, 0, 2, VKD3DSIH_BREAKC, {2, 1}, {~0u, ~0u}},
289 {VKD3D_SM1_OP_CALL, 0, 1, VKD3DSIH_CALL, {2, 0}, {~0u, ~0u}},
290 {VKD3D_SM1_OP_CALLNZ, 0, 2, VKD3DSIH_CALLNZ, {2, 0}, {~0u, ~0u}},
291 {VKD3D_SM1_OP_LOOP, 0, 2, VKD3DSIH_LOOP, {2, 0}, {~0u, ~0u}},
292 {VKD3D_SM1_OP_RET, 0, 0, VKD3DSIH_RET, {2, 0}, {~0u, ~0u}},
293 {VKD3D_SM1_OP_ENDLOOP, 0, 0, VKD3DSIH_ENDLOOP, {2, 0}, {~0u, ~0u}},
294 {VKD3D_SM1_OP_LABEL, 0, 1, VKD3DSIH_LABEL, {2, 0}, {~0u, ~0u}},
295
297 {VKD3D_SM1_OP_TEXLDL, 1, 2, VKD3DSIH_TEXLDL, {3, 0}, {~0u, ~0u}},
298 {0, 0, 0, VKD3DSIH_INVALID},
299};
300
302{
303 /* Arithmetic */
326 {VKD3D_SM1_OP_CND, 1, 3, VKD3DSIH_CND, {1, 0}, { 1, 4}},
327 {VKD3D_SM1_OP_CMP, 1, 3, VKD3DSIH_CMP, {1, 2}, { 3, 0}},
331 {VKD3D_SM1_OP_SINCOS, 1, 3, VKD3DSIH_SINCOS, {2, 0}, { 2, 1}},
332 {VKD3D_SM1_OP_SINCOS, 1, 1, VKD3DSIH_SINCOS, {3, 0}, {~0u, ~0u}},
333 {VKD3D_SM1_OP_DP2ADD, 1, 3, VKD3DSIH_DP2ADD, {2, 0}, {~0u, ~0u}},
334 /* Matrix */
340 /* Declarations */
342 /* Constant definitions */
346 /* Control flow */
347 {VKD3D_SM1_OP_REP, 0, 1, VKD3DSIH_REP, {2, 1}, {~0u, ~0u}},
348 {VKD3D_SM1_OP_ENDREP, 0, 0, VKD3DSIH_ENDREP, {2, 1}, {~0u, ~0u}},
349 {VKD3D_SM1_OP_IF, 0, 1, VKD3DSIH_IF, {2, 1}, {~0u, ~0u}},
350 {VKD3D_SM1_OP_IFC, 0, 2, VKD3DSIH_IFC, {2, 1}, {~0u, ~0u}},
351 {VKD3D_SM1_OP_ELSE, 0, 0, VKD3DSIH_ELSE, {2, 1}, {~0u, ~0u}},
352 {VKD3D_SM1_OP_ENDIF, 0, 0, VKD3DSIH_ENDIF, {2, 1}, {~0u, ~0u}},
353 {VKD3D_SM1_OP_BREAK, 0, 0, VKD3DSIH_BREAK, {2, 1}, {~0u, ~0u}},
354 {VKD3D_SM1_OP_BREAKC, 0, 2, VKD3DSIH_BREAKC, {2, 1}, {~0u, ~0u}},
356 {VKD3D_SM1_OP_CALL, 0, 1, VKD3DSIH_CALL, {2, 1}, {~0u, ~0u}},
357 {VKD3D_SM1_OP_CALLNZ, 0, 2, VKD3DSIH_CALLNZ, {2, 1}, {~0u, ~0u}},
358 {VKD3D_SM1_OP_LOOP, 0, 2, VKD3DSIH_LOOP, {3, 0}, {~0u, ~0u}},
359 {VKD3D_SM1_OP_RET, 0, 0, VKD3DSIH_RET, {2, 1}, {~0u, ~0u}},
360 {VKD3D_SM1_OP_ENDLOOP, 0, 0, VKD3DSIH_ENDLOOP, {3, 0}, {~0u, ~0u}},
361 {VKD3D_SM1_OP_LABEL, 0, 1, VKD3DSIH_LABEL, {2, 1}, {~0u, ~0u}},
362 /* Texture */
363 {VKD3D_SM1_OP_TEXCOORD, 1, 0, VKD3DSIH_TEXCOORD, {0, 0}, { 1, 3}},
364 {VKD3D_SM1_OP_TEXCOORD, 1, 1, VKD3DSIH_TEXCOORD, {1 ,4}, { 1, 4}},
365 {VKD3D_SM1_OP_TEXKILL, 1, 0, VKD3DSIH_TEXKILL, {1 ,0}, { 3, 0}},
366 {VKD3D_SM1_OP_TEX, 1, 0, VKD3DSIH_TEX, {0, 0}, { 1, 3}},
367 {VKD3D_SM1_OP_TEX, 1, 1, VKD3DSIH_TEX, {1, 4}, { 1, 4}},
368 {VKD3D_SM1_OP_TEX, 1, 2, VKD3DSIH_TEX, {2, 0}, {~0u, ~0u}},
369 {VKD3D_SM1_OP_TEXBEM, 1, 1, VKD3DSIH_TEXBEM, {0, 0}, { 1, 3}},
370 {VKD3D_SM1_OP_TEXBEML, 1, 1, VKD3DSIH_TEXBEML, {1, 0}, { 1, 3}},
371 {VKD3D_SM1_OP_TEXREG2AR, 1, 1, VKD3DSIH_TEXREG2AR, {1, 0}, { 1, 3}},
372 {VKD3D_SM1_OP_TEXREG2GB, 1, 1, VKD3DSIH_TEXREG2GB, {1, 0}, { 1, 3}},
373 {VKD3D_SM1_OP_TEXREG2RGB, 1, 1, VKD3DSIH_TEXREG2RGB, {1, 2}, { 1, 3}},
374 {VKD3D_SM1_OP_TEXM3x2PAD, 1, 1, VKD3DSIH_TEXM3x2PAD, {1, 0}, { 1, 3}},
375 {VKD3D_SM1_OP_TEXM3x2TEX, 1, 1, VKD3DSIH_TEXM3x2TEX, {1, 0}, { 1, 3}},
376 {VKD3D_SM1_OP_TEXM3x3PAD, 1, 1, VKD3DSIH_TEXM3x3PAD, {1, 0}, { 1, 3}},
377 {VKD3D_SM1_OP_TEXM3x3DIFF, 1, 1, VKD3DSIH_TEXM3x3DIFF, {0, 0}, { 0, 0}},
378 {VKD3D_SM1_OP_TEXM3x3SPEC, 1, 2, VKD3DSIH_TEXM3x3SPEC, {1, 0}, { 1, 3}},
379 {VKD3D_SM1_OP_TEXM3x3VSPEC, 1, 1, VKD3DSIH_TEXM3x3VSPEC, {1, 0}, { 1, 3}},
380 {VKD3D_SM1_OP_TEXM3x3TEX, 1, 1, VKD3DSIH_TEXM3x3TEX, {1, 0}, { 1, 3}},
381 {VKD3D_SM1_OP_TEXDP3TEX, 1, 1, VKD3DSIH_TEXDP3TEX, {1, 2}, { 1, 3}},
382 {VKD3D_SM1_OP_TEXM3x2DEPTH, 1, 1, VKD3DSIH_TEXM3x2DEPTH, {1, 3}, { 1, 3}},
383 {VKD3D_SM1_OP_TEXDP3, 1, 1, VKD3DSIH_TEXDP3, {1, 2}, { 1, 3}},
384 {VKD3D_SM1_OP_TEXM3x3, 1, 1, VKD3DSIH_TEXM3x3, {1, 2}, { 1, 3}},
385 {VKD3D_SM1_OP_TEXDEPTH, 1, 0, VKD3DSIH_TEXDEPTH, {1, 4}, { 1, 4}},
386 {VKD3D_SM1_OP_BEM, 1, 2, VKD3DSIH_BEM, {1, 4}, { 1, 4}},
387 {VKD3D_SM1_OP_DSX, 1, 1, VKD3DSIH_DSX, {2, 1}, {~0u, ~0u}},
388 {VKD3D_SM1_OP_DSY, 1, 1, VKD3DSIH_DSY, {2, 1}, {~0u, ~0u}},
389 {VKD3D_SM1_OP_TEXLDD, 1, 4, VKD3DSIH_TEXLDD, {2, 1}, {~0u, ~0u}},
391 {VKD3D_SM1_OP_TEXLDL, 1, 2, VKD3DSIH_TEXLDL, {3, 0}, {~0u, ~0u}},
393 {0, 0, 0, VKD3DSIH_INVALID},
394};
395
397{
398 /* VKD3D_SM1_RESOURCE_UNKNOWN */ VKD3D_SHADER_RESOURCE_NONE,
399 /* VKD3D_SM1_RESOURCE_TEXTURE_1D */ VKD3D_SHADER_RESOURCE_TEXTURE_1D,
400 /* VKD3D_SM1_RESOURCE_TEXTURE_2D */ VKD3D_SHADER_RESOURCE_TEXTURE_2D,
401 /* VKD3D_SM1_RESOURCE_TEXTURE_CUBE */ VKD3D_SHADER_RESOURCE_TEXTURE_CUBE,
402 /* VKD3D_SM1_RESOURCE_TEXTURE_3D */ VKD3D_SHADER_RESOURCE_TEXTURE_3D,
403};
404
406{
407 return *(*ptr)++;
408}
409
411{
412 enum vkd3d_sm1_address_mode_type address_mode;
413
415
416 return address_mode == VKD3D_SM1_ADDRESS_MODE_RELATIVE;
417}
418
420 const struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_sm1_opcode opcode)
421{
422 const struct vkd3d_shader_version *version = &sm1->p.program->shader_version;
423 const struct vkd3d_sm1_opcode_info *info;
424 unsigned int i = 0;
425
426 for (;;)
427 {
428 info = &sm1->opcode_table[i++];
429 if (info->vkd3d_opcode == VKD3DSIH_INVALID)
430 return NULL;
431
432 if (opcode == info->sm1_opcode
433 && vkd3d_shader_ver_ge(version, info->min_version.major, info->min_version.minor)
434 && (vkd3d_shader_ver_le(version, info->max_version.major, info->max_version.minor)
435 || !info->max_version.major))
436 return info;
437 }
438}
439
440static unsigned int shader_sm1_get_swizzle_component(uint32_t swizzle, unsigned int idx)
441{
443}
444
446{
451}
452
453/* D3DBC doesn't have the concept of index count. All registers implicitly have
454 * exactly one index. However for some register types the index doesn't make
455 * sense, so we remove it. */
457{
458 switch (reg_type)
459 {
461 return 0;
462
463 default:
464 return 1;
465 }
466}
467
470{
473 unsigned int idx_count = idx_count_from_reg_type(reg_type);
474
477 src->reg.non_uniform = false;
478 if (idx_count == 1)
479 {
480 src->reg.idx[0].offset = param & VKD3D_SM1_REGISTER_NUMBER_MASK;
481 src->reg.idx[0].rel_addr = rel_addr;
482 }
483 if (src->reg.type == VKD3DSPR_SAMPLER)
484 src->reg.dimension = VSIR_DIMENSION_NONE;
485 else if (src->reg.type == VKD3DSPR_DEPTHOUT)
486 src->reg.dimension = VSIR_DIMENSION_SCALAR;
487 else
488 src->reg.dimension = VSIR_DIMENSION_VEC4;
491}
492
495{
498 unsigned int idx_count = idx_count_from_reg_type(reg_type);
499
502 dst->reg.non_uniform = false;
503 if (idx_count == 1)
504 {
505 dst->reg.idx[0].offset = param & VKD3D_SM1_REGISTER_NUMBER_MASK;
506 dst->reg.idx[0].rel_addr = rel_addr;
507 }
508 if (dst->reg.type == VKD3DSPR_SAMPLER)
509 dst->reg.dimension = VSIR_DIMENSION_NONE;
510 else if (dst->reg.type == VKD3DSPR_DEPTHOUT)
511 dst->reg.dimension = VSIR_DIMENSION_SCALAR;
512 else
513 dst->reg.dimension = VSIR_DIMENSION_VEC4;
516
517 switch (dst->reg.dimension)
518 {
520 dst->write_mask = VKD3DSP_WRITEMASK_0;
521 break;
522
525 break;
526
527 default:
528 dst->write_mask = 0;
529 break;
530 }
531}
532
534 const char *semantic_name, unsigned int semantic_index)
535{
536 struct signature_element *e = signature->elements;
537 unsigned int i;
538
539 for (i = 0; i < signature->element_count; ++i)
540 {
543 return &e[i];
544 }
545
546 return NULL;
547}
548
550 const struct shader_signature *signature, unsigned int register_index)
551{
552 struct signature_element *e = signature->elements;
553 unsigned int i;
554
555 for (i = 0; i < signature->element_count; ++i)
556 {
558 return &e[i];
559 }
560
561 return NULL;
562}
563
564/* Add missing bits to a mask to make it contiguous. */
565static unsigned int make_mask_contiguous(unsigned int mask)
566{
567 static const unsigned int table[] =
568 {
569 0x0, 0x1, 0x2, 0x3,
570 0x4, 0x7, 0x6, 0x7,
571 0x8, 0xf, 0xe, 0xf,
572 0xc, 0xf, 0xe, 0xf,
573 };
574
576 return table[mask];
577}
578
579static bool add_signature_element(struct vkd3d_shader_sm1_parser *sm1, bool output,
580 const char *name, unsigned int index, enum vkd3d_shader_sysval_semantic sysval,
581 unsigned int register_index, bool is_dcl, unsigned int mask)
582{
583 struct vsir_program *program = sm1->p.program;
586
587 if (output)
588 signature = &program->output_signature;
589 else
590 signature = &program->input_signature;
591
593 {
594 element->mask = make_mask_contiguous(element->mask | mask);
595 if (!is_dcl)
596 element->used_mask |= mask;
597 return true;
598 }
599
600 if (!vkd3d_array_reserve((void **)&signature->elements, &signature->elements_capacity,
601 signature->element_count + 1, sizeof(*signature->elements)))
602 return false;
603 element = &signature->elements[signature->element_count++];
604
605 memset(element, 0, sizeof(*element));
606 if (!(element->semantic_name = vkd3d_strdup(name)))
607 return false;
608 element->semantic_index = index;
609 element->sysval_semantic = sysval;
610 element->component_type = VKD3D_SHADER_COMPONENT_FLOAT;
611 element->register_index = register_index;
612 element->target_location = register_index;
613 element->register_count = 1;
615 element->used_mask = is_dcl ? 0 : mask;
616 if (program->shader_version.type == VKD3D_SHADER_TYPE_PIXEL && !output)
617 element->interpolation_mode = VKD3DSIM_LINEAR;
618
619 return true;
620}
621
622static void add_signature_mask(struct vkd3d_shader_sm1_parser *sm1, bool output,
623 unsigned int register_index, unsigned int mask)
624{
625 struct vsir_program *program = sm1->p.program;
628
629 if (output)
630 signature = &program->output_signature;
631 else
632 signature = &program->input_signature;
633
635 {
637 "%s register %u was used without being declared.", output ? "Output" : "Input", register_index);
638 return;
639 }
640
641 element->used_mask |= mask;
642}
643
645 const struct vkd3d_shader_register *reg, bool is_dcl, unsigned int mask)
646{
647 const struct vkd3d_shader_version *version = &sm1->p.program->shader_version;
648 unsigned int register_index = reg->idx_count > 0 ? reg->idx[0].offset : 0;
649
650 switch (reg->type)
651 {
652 case VKD3DSPR_TEMP:
653 if (version->type == VKD3D_SHADER_TYPE_PIXEL && version->major == 1 && !register_index)
654 return add_signature_element(sm1, true, "COLOR", 0, VKD3D_SHADER_SV_TARGET, 0, is_dcl, mask);
655 return true;
656
657 case VKD3DSPR_INPUT:
658 /* For vertex shaders or sm3 pixel shaders, we should have already
659 * had a DCL instruction. Otherwise, this is a colour input. */
660 if (version->type == VKD3D_SHADER_TYPE_VERTEX || version->major == 3)
661 {
662 add_signature_mask(sm1, false, register_index, mask);
663 return true;
664 }
665 return add_signature_element(sm1, false, "COLOR", register_index,
666 VKD3D_SHADER_SV_NONE, SM1_COLOR_REGISTER_OFFSET + register_index, is_dcl, mask);
667
668 case VKD3DSPR_TEXTURE:
669 /* For vertex shaders, this is ADDR. */
671 return true;
672 return add_signature_element(sm1, false, "TEXCOORD", register_index,
673 VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask);
674
675 case VKD3DSPR_OUTPUT:
677 {
678 /* For sm < 2 vertex shaders, this is TEXCRDOUT.
679 *
680 * For sm3 vertex shaders, this is OUTPUT, but we already
681 * should have had a DCL instruction. */
682 if (version->major == 3)
683 {
684 add_signature_mask(sm1, true, register_index, mask);
685 return true;
686 }
687 return add_signature_element(sm1, true, "TEXCOORD", register_index,
688 VKD3D_SHADER_SV_NONE, register_index, is_dcl, mask);
689 }
690 /* fall through */
691
692 case VKD3DSPR_ATTROUT:
693 return add_signature_element(sm1, true, "COLOR", register_index,
694 VKD3D_SHADER_SV_NONE, SM1_COLOR_REGISTER_OFFSET + register_index, is_dcl, mask);
695
697 return add_signature_element(sm1, true, "COLOR", register_index,
698 VKD3D_SHADER_SV_TARGET, register_index, is_dcl, mask);
699
701 return add_signature_element(sm1, true, "DEPTH", 0,
702 VKD3D_SHADER_SV_DEPTH, register_index, is_dcl, 0x1);
703
704 case VKD3DSPR_RASTOUT:
705 switch (register_index)
706 {
707 case 0:
708 return add_signature_element(sm1, true, "POSITION", 0,
710
711 case 1:
712 return add_signature_element(sm1, true, "FOG", 0,
713 VKD3D_SHADER_SV_NONE, SM1_RASTOUT_REGISTER_OFFSET + register_index, is_dcl, 0x1);
714
715 case 2:
716 return add_signature_element(sm1, true, "PSIZE", 0,
717 VKD3D_SHADER_SV_NONE, SM1_RASTOUT_REGISTER_OFFSET + register_index, is_dcl, 0x1);
718
719 default:
721 "Invalid rasterizer output index %u.", register_index);
722 return true;
723 }
724
726 switch (register_index)
727 {
728 case 0:
729 return add_signature_element(sm1, false, "VPOS", 0,
730 VKD3D_SHADER_SV_POSITION, register_index, is_dcl, mask);
731
732 case 1:
733 return add_signature_element(sm1, false, "VFACE", 0,
734 VKD3D_SHADER_SV_IS_FRONT_FACE, register_index, is_dcl, 0x1);
735
736 default:
738 "Invalid miscellaneous fragment input index %u.", register_index);
739 return true;
740 }
741
742 default:
743 return true;
744 }
745}
746
748 const struct vkd3d_shader_semantic *semantic)
749{
750 const struct vkd3d_shader_version *version = &sm1->p.program->shader_version;
751 const struct vkd3d_shader_register *reg = &semantic->resource.reg.reg;
753 unsigned int mask = semantic->resource.reg.write_mask;
754 bool output;
755
756 static const char sm1_semantic_names[][13] =
757 {
758 [VKD3D_DECL_USAGE_POSITION ] = "POSITION",
759 [VKD3D_DECL_USAGE_BLEND_WEIGHT ] = "BLENDWEIGHT",
760 [VKD3D_DECL_USAGE_BLEND_INDICES] = "BLENDINDICES",
761 [VKD3D_DECL_USAGE_NORMAL ] = "NORMAL",
762 [VKD3D_DECL_USAGE_PSIZE ] = "PSIZE",
763 [VKD3D_DECL_USAGE_TEXCOORD ] = "TEXCOORD",
764 [VKD3D_DECL_USAGE_TANGENT ] = "TANGENT",
765 [VKD3D_DECL_USAGE_BINORMAL ] = "BINORMAL",
766 [VKD3D_DECL_USAGE_TESS_FACTOR ] = "TESSFACTOR",
767 [VKD3D_DECL_USAGE_POSITIONT ] = "POSITIONT",
768 [VKD3D_DECL_USAGE_COLOR ] = "COLOR",
769 [VKD3D_DECL_USAGE_FOG ] = "FOG",
770 [VKD3D_DECL_USAGE_DEPTH ] = "DEPTH",
771 [VKD3D_DECL_USAGE_SAMPLE ] = "SAMPLE",
772 };
773
774 if (reg->type == VKD3DSPR_OUTPUT)
775 output = true;
776 else if (reg->type == VKD3DSPR_INPUT || reg->type == VKD3DSPR_TEXTURE)
777 output = false;
778 else /* vpos and vface don't have a semantic. */
779 return add_signature_element_from_register(sm1, reg, true, mask);
780
781 /* sm2 pixel shaders use DCL but don't provide a semantic. */
782 if (version->type == VKD3D_SHADER_TYPE_PIXEL && version->major == 2)
783 return add_signature_element_from_register(sm1, reg, true, mask);
784
785 /* With the exception of vertex POSITION output, none of these are system
786 * values. Pixel POSITION input is not equivalent to SV_Position; the closer
787 * equivalent is VPOS, which is not declared as a semantic. */
789 && output && semantic->usage == VKD3D_DECL_USAGE_POSITION)
791
792 return add_signature_element(sm1, output, sm1_semantic_names[semantic->usage],
793 semantic->usage_idx, sysval, reg->idx[0].offset, true, mask);
794}
795
798{
799 sm1->constants[set].count = max(sm1->constants[set].count, index + 1);
800 if (from_def)
801 {
802 /* d3d shaders have a maximum of 8192 constants; we should not overrun
803 * this array. */
804 VKD3D_ASSERT((index / 32) <= ARRAY_SIZE(sm1->constants[set].def_mask));
805 bitmap_set(sm1->constants[set].def_mask, index);
806 }
807}
808
810 const struct vkd3d_shader_register *reg, unsigned int mask, bool from_def)
811{
812 struct vsir_program *program = sm1->p.program;
813 uint32_t register_index = reg->idx[0].offset;
814
815 switch (reg->type)
816 {
817 case VKD3DSPR_TEMP:
818 program->temp_count = max(program->temp_count, register_index + 1);
819 break;
820
821 case VKD3DSPR_CONST:
823 break;
824
825 case VKD3DSPR_CONST2:
826 record_constant_register(sm1, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER, 2048 + register_index, from_def);
827 break;
828
829 case VKD3DSPR_CONST3:
830 record_constant_register(sm1, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER, 4096 + register_index, from_def);
831 break;
832
833 case VKD3DSPR_CONST4:
834 record_constant_register(sm1, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER, 6144 + register_index, from_def);
835 break;
836
839 break;
840
843 break;
844
845 default:
846 break;
847 }
848
850}
851
852/* Read a parameter token from the input stream, and possibly a relative
853 * addressing token. */
855 const uint32_t **ptr, uint32_t *token, uint32_t *addr_token)
856{
857 if (*ptr >= sm1->end)
858 {
860 "Attempted to read a parameter token, but no more tokens are remaining.");
861 sm1->abort = true;
862 *token = 0;
863 return;
864 }
865 *token = read_u32(ptr);
867 return;
868
869 /* PS >= 3.0 have relative addressing (with token)
870 * VS >= 2.0 have relative addressing (with token)
871 * VS >= 1.0 < 2.0 have relative addressing (without token)
872 * The version check below should work in general. */
873 if (sm1->p.program->shader_version.major < 2)
874 {
875 *addr_token = (1u << 31)
879 return;
880 }
881
882 if (*ptr >= sm1->end)
883 {
885 "Attempted to read an indirect addressing token, but no more tokens are remaining.");
886 sm1->abort = true;
887 *addr_token = 0;
888 return;
889 }
890 *addr_token = read_u32(ptr);
891}
892
893/* Skip the parameter tokens for an opcode. */
894static void shader_sm1_skip_opcode(const struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr,
895 const struct vkd3d_sm1_opcode_info *opcode_info, uint32_t opcode_token)
896{
897 unsigned int length;
898
899 /* Version 2.0+ shaders may contain address tokens, but fortunately they
900 * have a useful length mask - use it here. Version 1.x shaders contain no
901 * such tokens. */
902 if (sm1->p.program->shader_version.major >= 2)
903 {
905 *ptr += length;
906 return;
907 }
908
909 /* DCL instructions do not have sources or destinations, but they
910 * read two tokens to a semantic. See
911 * shader_sm1_read_semantic(). */
912 if (opcode_info->vkd3d_opcode == VKD3DSIH_DCL)
913 {
914 *ptr += 2;
915 }
916 /* Somewhat similarly, DEF and DEFI have a single source, but need to read
917 * four tokens for that source. See shader_sm1_read_immconst().
918 * Technically shader model 1 doesn't have integer registers or DEFI; we
919 * handle it here anyway because it's easy. */
920 else if (opcode_info->vkd3d_opcode == VKD3DSIH_DEF || opcode_info->vkd3d_opcode == VKD3DSIH_DEFI)
921 {
922 *ptr += 3;
923 }
924
925 *ptr += (opcode_info->dst_count + opcode_info->src_count);
926}
927
929 struct vkd3d_shader_src_param *src_param)
930{
931 struct vkd3d_shader_src_param *src_rel_addr = NULL;
932 uint32_t token, addr_token;
933
934 shader_sm1_read_param(sm1, ptr, &token, &addr_token);
936 {
937 if (!(src_rel_addr = vsir_program_get_src_params(sm1->p.program, 1)))
938 {
940 "Out of memory.");
941 sm1->abort = true;
942 return;
943 }
944 shader_sm1_parse_src_param(addr_token, NULL, src_rel_addr);
945 }
946 shader_sm1_parse_src_param(token, src_rel_addr, src_param);
947}
948
950 struct vkd3d_shader_dst_param *dst_param)
951{
952 struct vkd3d_shader_src_param *dst_rel_addr = NULL;
953 uint32_t token, addr_token;
954
955 shader_sm1_read_param(sm1, ptr, &token, &addr_token);
957 {
958 if (!(dst_rel_addr = vsir_program_get_src_params(sm1->p.program, 1)))
959 {
961 "Out of memory.");
962 sm1->abort = true;
963 return;
964 }
965 shader_sm1_parse_src_param(addr_token, NULL, dst_rel_addr);
966 }
967 shader_sm1_parse_dst_param(token, dst_rel_addr, dst_param);
968
969 if (dst_param->reg.type == VKD3DSPR_RASTOUT && dst_param->reg.idx[0].offset == VSIR_RASTOUT_POINT_SIZE)
970 sm1->p.program->has_point_size = true;
971}
972
974 const uint32_t **ptr, struct vkd3d_shader_semantic *semantic)
975{
976 enum vkd3d_sm1_resource_type resource_type;
978 uint32_t usage_token, dst_token;
979
980 if (*ptr >= sm1->end || sm1->end - *ptr < 2)
981 {
983 "Attempted to read a declaration instruction, but not enough tokens are remaining.");
984 sm1->abort = true;
985 return;
986 }
987
988 usage_token = read_u32(ptr);
989 dst_token = read_u32(ptr);
990
991 semantic->usage = (usage_token & VKD3D_SM1_DCL_USAGE_MASK) >> VKD3D_SM1_DCL_USAGE_SHIFT;
993 resource_type = (usage_token & VKD3D_SM1_RESOURCE_TYPE_MASK) >> VKD3D_SM1_RESOURCE_TYPE_SHIFT;
994 if (resource_type >= ARRAY_SIZE(resource_type_table))
995 {
997 "Invalid resource type %#x.", resource_type);
999 }
1000 else
1001 {
1002 semantic->resource_type = resource_type_table[resource_type];
1003 }
1004 semantic->resource_data_type[0] = VKD3D_DATA_FLOAT;
1005 semantic->resource_data_type[1] = VKD3D_DATA_FLOAT;
1006 semantic->resource_data_type[2] = VKD3D_DATA_FLOAT;
1007 semantic->resource_data_type[3] = VKD3D_DATA_FLOAT;
1008 shader_sm1_parse_dst_param(dst_token, NULL, &semantic->resource.reg);
1009 range = &semantic->resource.range;
1010 range->space = 0;
1011 range->first = range->last = semantic->resource.reg.reg.idx[0].offset;
1012
1014}
1015
1017 struct vkd3d_shader_src_param *src_param, enum vsir_dimension dimension, enum vkd3d_data_type data_type)
1018{
1019 unsigned int count = dimension == VSIR_DIMENSION_VEC4 ? 4 : 1;
1020
1021 if (*ptr >= sm1->end || sm1->end - *ptr < count)
1022 {
1024 "Attempted to read a constant definition, but not enough tokens are remaining. "
1025 "%zu token(s) available, %u required.", sm1->end - *ptr, count);
1026 sm1->abort = true;
1027 return;
1028 }
1029
1030 src_param->reg.type = VKD3DSPR_IMMCONST;
1031 src_param->reg.precision = VKD3D_SHADER_REGISTER_PRECISION_DEFAULT;
1032 src_param->reg.non_uniform = false;
1033 src_param->reg.data_type = data_type;
1034 src_param->reg.idx[0].offset = ~0u;
1035 src_param->reg.idx[0].rel_addr = NULL;
1036 src_param->reg.idx[1].offset = ~0u;
1037 src_param->reg.idx[1].rel_addr = NULL;
1038 src_param->reg.idx[2].offset = ~0u;
1039 src_param->reg.idx[2].rel_addr = NULL;
1040 src_param->reg.idx_count = 0;
1041 src_param->reg.dimension = dimension;
1042 memcpy(src_param->reg.u.immconst_u32, *ptr, count * sizeof(uint32_t));
1043 src_param->swizzle = VKD3D_SHADER_NO_SWIZZLE;
1044 src_param->modifiers = 0;
1045
1046 *ptr += count;
1047}
1048
1050{
1051 const uint32_t **ptr = &sm1->ptr;
1052 const char *comment;
1053 unsigned int size;
1054 size_t remaining;
1056
1057 if (*ptr >= sm1->end)
1058 return;
1059
1060 remaining = sm1->end - *ptr;
1061
1062 token = **ptr;
1064 {
1066
1067 if (size > --remaining)
1068 {
1070 "Encountered a %u token comment, but only %zu token(s) is/are remaining.",
1071 size, remaining);
1072 return;
1073 }
1074
1075 comment = (const char *)++(*ptr);
1076 remaining -= size;
1077 *ptr += size;
1078
1079 if (size > 1 && *(const uint32_t *)comment == TAG_TEXT)
1080 {
1081 const char *end = comment + size * sizeof(token);
1082 const char *p = comment + sizeof(token);
1083 const char *line;
1084
1085 TRACE("// TEXT\n");
1086 for (line = p; line < end; line = p)
1087 {
1088 if (!(p = memchr(line, '\n', end - line)))
1089 p = end;
1090 else
1091 ++p;
1092 TRACE("// %s\n", debugstr_an(line, p - line));
1093 }
1094 }
1095 else if (size)
1096 {
1097 TRACE("// %s\n", debugstr_an(comment, size * sizeof(token)));
1098 }
1099 else
1100 break;
1101
1102 if (!remaining)
1103 break;
1104 token = **ptr;
1105 }
1106}
1107
1109{
1110 if ((ins->opcode == VKD3DSIH_BREAKP || ins->opcode == VKD3DSIH_IF) && ins->flags)
1111 {
1113 "Ignoring unexpected instruction flags %#x.", ins->flags);
1114 ins->flags = 0;
1115 }
1116}
1117
1119{
1120 return (1u << vsir_swizzle_get_component(swizzle, 0))
1123 | (1u << vsir_swizzle_get_component(swizzle, 3));
1124}
1125
1127{
1128 struct vkd3d_shader_src_param *src_params, *predicate;
1129 const struct vkd3d_sm1_opcode_info *opcode_info;
1130 struct vsir_program *program = sm1->p.program;
1131 struct vkd3d_shader_dst_param *dst_param;
1132 const uint32_t **ptr = &sm1->ptr;
1133 uint32_t opcode_token;
1134 const uint32_t *p;
1135 bool predicated;
1136 unsigned int i;
1137
1139
1140 if (*ptr >= sm1->end)
1141 {
1142 WARN("End of byte-code, failed to read opcode.\n");
1143 goto fail;
1144 }
1145
1146 ++sm1->p.location.line;
1147 opcode_token = read_u32(ptr);
1148 if (!(opcode_info = shader_sm1_get_opcode_info(sm1, opcode_token & VKD3D_SM1_OPCODE_MASK)))
1149 {
1151 "Invalid opcode %#x (token 0x%08x, shader version %u.%u).",
1152 opcode_token & VKD3D_SM1_OPCODE_MASK, opcode_token,
1153 program->shader_version.major, program->shader_version.minor);
1154 goto fail;
1155 }
1156
1157 vsir_instruction_init(ins, &sm1->p.location, opcode_info->vkd3d_opcode);
1159 ins->coissue = opcode_token & VKD3D_SM1_COISSUE;
1160 ins->raw = false;
1161 ins->structured = false;
1162 predicated = !!(opcode_token & VKD3D_SM1_INSTRUCTION_PREDICATED);
1163 ins->predicate = predicate = predicated ? vsir_program_get_src_params(program, 1) : NULL;
1164 ins->dst_count = opcode_info->dst_count;
1165 ins->dst = dst_param = vsir_program_get_dst_params(program, ins->dst_count);
1166 ins->src_count = opcode_info->src_count;
1167 ins->src = src_params = vsir_program_get_src_params(program, ins->src_count);
1168 if ((!predicate && predicated) || (!src_params && ins->src_count) || (!dst_param && ins->dst_count))
1169 {
1171 goto fail;
1172 }
1173
1175 ins->resource_stride = 0;
1180 memset(&ins->texel_offset, 0, sizeof(ins->texel_offset));
1181
1182 p = *ptr;
1183 shader_sm1_skip_opcode(sm1, ptr, opcode_info, opcode_token);
1184 if (*ptr > sm1->end)
1185 {
1187 "The current instruction ends %zu token(s) past the end of the shader.",
1188 *ptr - sm1->end);
1189 goto fail;
1190 }
1191
1192 if (ins->opcode == VKD3DSIH_DCL)
1193 {
1195 }
1196 else if (ins->opcode == VKD3DSIH_DEF)
1197 {
1198 shader_sm1_read_dst_param(sm1, &p, dst_param);
1200 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true);
1201 }
1202 else if (ins->opcode == VKD3DSIH_DEFB)
1203 {
1204 shader_sm1_read_dst_param(sm1, &p, dst_param);
1206 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true);
1207 }
1208 else if (ins->opcode == VKD3DSIH_DEFI)
1209 {
1210 shader_sm1_read_dst_param(sm1, &p, dst_param);
1212 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, true);
1213 }
1214 else
1215 {
1216 /* Destination token */
1217 if (ins->dst_count)
1218 {
1219 shader_sm1_read_dst_param(sm1, &p, dst_param);
1220 shader_sm1_scan_register(sm1, &dst_param->reg, dst_param->write_mask, false);
1221 }
1222
1223 /* Predication token */
1224 if (ins->predicate)
1225 shader_sm1_read_src_param(sm1, &p, predicate);
1226
1227 /* Other source tokens */
1228 for (i = 0; i < ins->src_count; ++i)
1229 {
1230 shader_sm1_read_src_param(sm1, &p, &src_params[i]);
1231 shader_sm1_scan_register(sm1, &src_params[i].reg, mask_from_swizzle(src_params[i].swizzle), false);
1232 }
1233 }
1234
1235 if (sm1->abort)
1236 {
1237 sm1->abort = false;
1238 goto fail;
1239 }
1240
1242 return;
1243
1244fail:
1245 ins->opcode = VKD3DSIH_INVALID;
1246 *ptr = sm1->end;
1247}
1248
1250{
1251 const uint32_t **ptr = &sm1->ptr;
1252
1254
1255 if (*ptr >= sm1->end)
1256 return true;
1257
1258 if (**ptr == VKD3D_SM1_END)
1259 {
1260 ++(*ptr);
1261 return true;
1262 }
1263
1264 return false;
1265}
1266
1268 const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
1269{
1270 const struct vkd3d_shader_location location = {.source_name = compile_info->source_name};
1271 const uint32_t *code = compile_info->source.code;
1272 size_t code_size = compile_info->source.size;
1275 size_t token_count;
1276
1277 token_count = code_size / sizeof(*sm1->start);
1278
1279 if (token_count < 2)
1280 {
1282 "Invalid shader size %zu (token count %zu). At least 2 tokens are required.",
1283 code_size, token_count);
1285 }
1286
1287 TRACE("Version: 0x%08x.\n", code[0]);
1288
1289 shader_type = code[0] >> 16;
1292
1293 switch (shader_type)
1294 {
1295 case VKD3D_SM1_VS:
1298 break;
1299
1300 case VKD3D_SM1_PS:
1303 break;
1304
1305 default:
1307 "Invalid shader type %#x (token 0x%08x).", shader_type, code[0]);
1309 }
1310
1311 if (!vkd3d_shader_ver_le(&version, 3, 0))
1312 {
1314 "Invalid shader version %u.%u (token 0x%08x).", version.major, version.minor, code[0]);
1316 }
1317
1318 sm1->start = &code[1];
1319 sm1->end = &code[token_count];
1320
1321 /* Estimate instruction count to avoid reallocation in most shaders. */
1322 if (!vsir_program_init(program, compile_info, &version,
1323 code_size != ~(size_t)0 ? token_count / 4u + 4 : 16, VSIR_CF_STRUCTURED, VSIR_NOT_NORMALISED))
1325
1326 vkd3d_shader_parser_init(&sm1->p, program, message_context, compile_info->source_name);
1327 sm1->ptr = sm1->start;
1328
1329 return VKD3D_OK;
1330}
1331
1334{
1335 unsigned int j;
1336
1337 /* Find the highest constant index which is not written by a DEF
1338 * instruction. We can't (easily) use an FFZ function for this since it
1339 * needs to be limited by the highest used register index. */
1340 for (j = sm1->constants[set].count; j > 0; --j)
1341 {
1342 if (!bitmap_is_set(sm1->constants[set].def_mask, j - 1))
1343 return j;
1344 }
1345
1346 return 0;
1347}
1348
1349int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags,
1350 struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
1351{
1352 struct vkd3d_shader_instruction_array *instructions;
1353 struct vkd3d_shader_sm1_parser sm1 = {0};
1354 struct vkd3d_shader_instruction *ins;
1355 unsigned int i;
1356 int ret;
1357
1358 if ((ret = shader_sm1_init(&sm1, program, compile_info, message_context)) < 0)
1359 {
1360 WARN("Failed to initialise shader parser, ret %d.\n", ret);
1361 return ret;
1362 }
1363
1364 instructions = &program->instructions;
1365 while (!shader_sm1_is_end(&sm1))
1366 {
1367 if (!shader_instruction_array_reserve(instructions, instructions->count + 1))
1368 {
1369 ERR("Failed to allocate instructions.\n");
1373 }
1374 ins = &instructions->elements[instructions->count];
1375 shader_sm1_read_instruction(&sm1, ins);
1376
1377 if (ins->opcode == VKD3DSIH_INVALID)
1378 {
1379 WARN("Encountered unrecognized or invalid instruction.\n");
1382 }
1383 ++instructions->count;
1384 }
1385
1386 for (i = 0; i < ARRAY_SIZE(program->flat_constant_count); ++i)
1387 program->flat_constant_count[i] = get_external_constant_count(&sm1, i);
1388
1389 if (sm1.p.failed && ret >= 0)
1391
1392 if (ret < 0)
1393 {
1395 return ret;
1396 }
1397
1398 return VKD3D_OK;
1399}
1400
1401bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name,
1402 unsigned int semantic_index, bool output, enum vkd3d_shader_register_type *type, unsigned int *reg)
1403{
1404 unsigned int i;
1405
1406 static const struct
1407 {
1408 const char *semantic;
1409 bool output;
1411 unsigned int major_version;
1413 unsigned int offset;
1414 }
1415 register_table[] =
1416 {
1417 {"color", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3DSPR_INPUT},
1418 {"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 1, VKD3DSPR_TEXTURE},
1419
1420 {"color", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_COLOROUT},
1421 {"depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_DEPTHOUT},
1422 {"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_DEPTHOUT},
1423 {"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_COLOROUT},
1424 {"color", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_INPUT},
1425 {"texcoord", false, VKD3D_SHADER_TYPE_PIXEL, 2, VKD3DSPR_TEXTURE},
1426
1427 {"color", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_COLOROUT},
1428 {"depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_DEPTHOUT},
1429 {"sv_depth", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_DEPTHOUT},
1430 {"sv_target", true, VKD3D_SHADER_TYPE_PIXEL, 3, VKD3DSPR_COLOROUT},
1434
1435 {"color", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_ATTROUT},
1440 {"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 1, VKD3DSPR_TEXCRDOUT},
1441
1442 {"color", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_ATTROUT},
1447 {"texcoord", true, VKD3D_SHADER_TYPE_VERTEX, 2, VKD3DSPR_TEXCRDOUT},
1448 };
1449
1450 for (i = 0; i < ARRAY_SIZE(register_table); ++i)
1451 {
1452 if (!ascii_strcasecmp(semantic_name, register_table[i].semantic)
1453 && output == register_table[i].output
1454 && version->type == register_table[i].shader_type
1455 && version->major == register_table[i].major_version)
1456 {
1457 *type = register_table[i].type;
1458 if (register_table[i].type == VKD3DSPR_MISCTYPE || register_table[i].type == VKD3DSPR_RASTOUT)
1459 *reg = register_table[i].offset;
1460 else
1461 *reg = semantic_index;
1462 return true;
1463 }
1464 }
1465
1466 return false;
1467}
1468
1469bool sm1_usage_from_semantic_name(const char *semantic_name,
1470 uint32_t semantic_index, enum vkd3d_decl_usage *usage, uint32_t *usage_idx)
1471{
1472 static const struct
1473 {
1474 const char *name;
1476 }
1477 semantics[] =
1478 {
1479 {"binormal", VKD3D_DECL_USAGE_BINORMAL},
1480 {"blendindices", VKD3D_DECL_USAGE_BLEND_INDICES},
1481 {"blendweight", VKD3D_DECL_USAGE_BLEND_WEIGHT},
1482 {"color", VKD3D_DECL_USAGE_COLOR},
1483 {"depth", VKD3D_DECL_USAGE_DEPTH},
1484 {"fog", VKD3D_DECL_USAGE_FOG},
1485 {"normal", VKD3D_DECL_USAGE_NORMAL},
1486 {"position", VKD3D_DECL_USAGE_POSITION},
1487 {"positiont", VKD3D_DECL_USAGE_POSITIONT},
1488 {"psize", VKD3D_DECL_USAGE_PSIZE},
1489 {"sample", VKD3D_DECL_USAGE_SAMPLE},
1490 {"sv_depth", VKD3D_DECL_USAGE_DEPTH},
1491 {"sv_position", VKD3D_DECL_USAGE_POSITION},
1492 {"sv_target", VKD3D_DECL_USAGE_COLOR},
1493 {"tangent", VKD3D_DECL_USAGE_TANGENT},
1494 {"tessfactor", VKD3D_DECL_USAGE_TESS_FACTOR},
1495 {"texcoord", VKD3D_DECL_USAGE_TEXCOORD},
1496 };
1497
1498 unsigned int i;
1499
1500 for (i = 0; i < ARRAY_SIZE(semantics); ++i)
1501 {
1502 if (!ascii_strcasecmp(semantic_name, semantics[i].name))
1503 {
1504 *usage = semantics[i].usage;
1505 *usage_idx = semantic_index;
1506 return true;
1507 }
1508 }
1509
1510 return false;
1511}
1512
1514{
1520};
1521
1522static uint32_t sm1_version(enum vkd3d_shader_type type, unsigned int major, unsigned int minor)
1523{
1526}
1527
1529{
1530 switch (type->class)
1531 {
1532 case HLSL_CLASS_ARRAY:
1533 return hlsl_sm1_class(type->e.array.type);
1534 case HLSL_CLASS_MATRIX:
1536 if (type->modifiers & HLSL_MODIFIER_COLUMN_MAJOR)
1537 return D3DXPC_MATRIX_COLUMNS;
1538 else
1539 return D3DXPC_MATRIX_ROWS;
1540 case HLSL_CLASS_SCALAR:
1541 return D3DXPC_SCALAR;
1542 case HLSL_CLASS_STRUCT:
1543 return D3DXPC_STRUCT;
1544 case HLSL_CLASS_VECTOR:
1545 return D3DXPC_VECTOR;
1547 case HLSL_CLASS_SAMPLER:
1548 case HLSL_CLASS_STRING:
1549 case HLSL_CLASS_TEXTURE:
1551 return D3DXPC_OBJECT;
1555 case HLSL_CLASS_ERROR:
1556 case HLSL_CLASS_PASS:
1560 case HLSL_CLASS_UAV:
1561 case HLSL_CLASS_VOID:
1568 case HLSL_CLASS_NULL:
1569 break;
1570 }
1571
1573}
1574
1576{
1577 switch (type->class)
1578 {
1579 case HLSL_CLASS_SCALAR:
1580 case HLSL_CLASS_VECTOR:
1581 case HLSL_CLASS_MATRIX:
1582 switch (type->e.numeric.type)
1583 {
1584 case HLSL_TYPE_BOOL:
1585 return D3DXPT_BOOL;
1586 /* Actually double behaves differently depending on DLL version:
1587 * For <= 36, it maps to D3DXPT_FLOAT.
1588 * For 37-40, it maps to zero (D3DXPT_VOID).
1589 * For >= 41, it maps to 39, which is D3D_SVT_DOUBLE (note D3D_SVT_*
1590 * values are mostly compatible with D3DXPT_*).
1591 * However, the latter two cases look like bugs, and a reasonable
1592 * application certainly wouldn't know what to do with them.
1593 * For fx_2_0 it's always D3DXPT_FLOAT regardless of DLL version. */
1594 case HLSL_TYPE_DOUBLE:
1595 case HLSL_TYPE_FLOAT:
1596 case HLSL_TYPE_HALF:
1597 return D3DXPT_FLOAT;
1598 case HLSL_TYPE_INT:
1599 case HLSL_TYPE_UINT:
1600 return D3DXPT_INT;
1601 default:
1603 }
1604
1605 case HLSL_CLASS_SAMPLER:
1606 switch (type->sampler_dim)
1607 {
1609 return D3DXPT_SAMPLER1D;
1611 return D3DXPT_SAMPLER2D;
1613 return D3DXPT_SAMPLER3D;
1615 return D3DXPT_SAMPLERCUBE;
1617 return D3DXPT_SAMPLER;
1618 default:
1619 ERR("Invalid dimension %#x.\n", type->sampler_dim);
1621 }
1622 break;
1623
1624 case HLSL_CLASS_TEXTURE:
1625 switch (type->sampler_dim)
1626 {
1628 return D3DXPT_TEXTURE1D;
1630 return D3DXPT_TEXTURE2D;
1632 return D3DXPT_TEXTURE3D;
1634 return D3DXPT_TEXTURECUBE;
1636 return D3DXPT_TEXTURE;
1637 default:
1638 ERR("Invalid dimension %#x.\n", type->sampler_dim);
1640 }
1641 break;
1642
1643 case HLSL_CLASS_ARRAY:
1644 return hlsl_sm1_base_type(type->e.array.type);
1645
1646 case HLSL_CLASS_STRUCT:
1647 return D3DXPT_VOID;
1648
1649 case HLSL_CLASS_STRING:
1650 return D3DXPT_STRING;
1651
1653 return D3DXPT_PIXELSHADER;
1654
1656 return D3DXPT_VERTEXSHADER;
1657
1661 case HLSL_CLASS_ERROR:
1662 case HLSL_CLASS_PASS:
1666 case HLSL_CLASS_UAV:
1667 case HLSL_CLASS_VOID:
1674 case HLSL_CLASS_NULL:
1675 break;
1676 }
1677
1679}
1680
1681static void write_sm1_type(struct vkd3d_bytecode_buffer *buffer, struct hlsl_type *type, unsigned int ctab_start)
1682{
1683 const struct hlsl_type *array_type = hlsl_get_multiarray_element_type(type);
1685 unsigned int field_count = 0;
1686 size_t fields_offset = 0;
1687 size_t i;
1688
1689 if (type->bytecode_offset)
1690 return;
1691
1692 if (array_type->class == HLSL_CLASS_STRUCT)
1693 {
1694 field_count = array_type->e.record.field_count;
1695
1696 for (i = 0; i < field_count; ++i)
1697 {
1698 struct hlsl_struct_field *field = &array_type->e.record.fields[i];
1699
1700 field->name_bytecode_offset = put_string(buffer, field->name);
1701 write_sm1_type(buffer, field->type, ctab_start);
1702 }
1703
1704 fields_offset = bytecode_align(buffer) - ctab_start;
1705
1706 for (i = 0; i < field_count; ++i)
1707 {
1708 struct hlsl_struct_field *field = &array_type->e.record.fields[i];
1709
1710 put_u32(buffer, field->name_bytecode_offset - ctab_start);
1711 put_u32(buffer, field->type->bytecode_offset - ctab_start);
1712 }
1713 }
1714
1715 type->bytecode_offset = put_u32(buffer, vkd3d_make_u32(hlsl_sm1_class(type), hlsl_sm1_base_type(array_type)));
1716 put_u32(buffer, vkd3d_make_u32(type->dimy, type->dimx));
1717 put_u32(buffer, vkd3d_make_u32(array_size, field_count));
1718 put_u32(buffer, fields_offset);
1719}
1720
1721static void sm1_sort_extern(struct list *sorted, struct hlsl_ir_var *to_sort)
1722{
1723 struct hlsl_ir_var *var;
1724
1725 list_remove(&to_sort->extern_entry);
1726
1728 {
1729 if (strcmp(to_sort->name, var->name) < 0)
1730 {
1731 list_add_before(&var->extern_entry, &to_sort->extern_entry);
1732 return;
1733 }
1734 }
1735
1736 list_add_tail(sorted, &to_sort->extern_entry);
1737}
1738
1739static void sm1_sort_externs(struct hlsl_ctx *ctx)
1740{
1741 struct list sorted = LIST_INIT(sorted);
1742 struct hlsl_ir_var *var, *next;
1743
1745 {
1746 if (var->is_uniform)
1747 sm1_sort_extern(&sorted, var);
1748 }
1749 list_move_tail(&ctx->extern_vars, &sorted);
1750}
1751
1753{
1754 size_t ctab_offset, ctab_start, ctab_end, vars_offset, vars_start, size_offset, creator_offset, offset;
1755 unsigned int uniform_count = 0;
1756 struct hlsl_ir_var *var;
1757
1758 LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
1759 {
1760 unsigned int r;
1761
1762 for (r = 0; r <= HLSL_REGSET_LAST; ++r)
1763 {
1764 if (var->semantic.name || !var->regs[r].allocated || !var->last_read)
1765 continue;
1766
1767 ++uniform_count;
1768
1769 if (var->is_param && var->is_uniform)
1770 {
1771 char *new_name;
1772
1773 if (!(new_name = hlsl_sprintf_alloc(ctx, "$%s", var->name)))
1774 return;
1775 vkd3d_free((char *)var->name);
1776 var->name = new_name;
1777 }
1778 }
1779 }
1780
1782
1783 size_offset = put_u32(buffer, 0);
1784 ctab_offset = put_u32(buffer, VKD3D_MAKE_TAG('C','T','A','B'));
1785
1786 ctab_start = put_u32(buffer, 7 * sizeof(uint32_t)); /* CTAB header size. */
1787 creator_offset = put_u32(buffer, 0);
1788 put_u32(buffer, sm1_version(ctx->profile->type, ctx->profile->major_version, ctx->profile->minor_version));
1789 put_u32(buffer, uniform_count);
1790 vars_offset = put_u32(buffer, 0);
1791 put_u32(buffer, 0); /* FIXME: flags */
1792 put_u32(buffer, 0); /* FIXME: target string */
1793
1794 vars_start = bytecode_align(buffer);
1795 set_u32(buffer, vars_offset, vars_start - ctab_start);
1796
1797 LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
1798 {
1799 unsigned int r;
1800
1801 for (r = 0; r <= HLSL_REGSET_LAST; ++r)
1802 {
1803 if (var->semantic.name || !var->regs[r].allocated || !var->last_read)
1804 continue;
1805
1806 put_u32(buffer, 0); /* name */
1807 if (r == HLSL_REGSET_NUMERIC)
1808 {
1810 put_u32(buffer, var->bind_count[r]);
1811 }
1812 else
1813 {
1815 put_u32(buffer, var->bind_count[r]);
1816 }
1817 put_u32(buffer, 0); /* type */
1818 put_u32(buffer, 0); /* default value */
1819 }
1820 }
1821
1822 uniform_count = 0;
1823
1824 LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
1825 {
1826 unsigned int r;
1827
1828 for (r = 0; r <= HLSL_REGSET_LAST; ++r)
1829 {
1830 size_t var_offset, name_offset;
1831
1832 if (var->semantic.name || !var->regs[r].allocated || !var->last_read)
1833 continue;
1834
1835 var_offset = vars_start + (uniform_count * 5 * sizeof(uint32_t));
1836
1837 name_offset = put_string(buffer, var->name);
1838 set_u32(buffer, var_offset, name_offset - ctab_start);
1839
1840 write_sm1_type(buffer, var->data_type, ctab_start);
1841 set_u32(buffer, var_offset + 3 * sizeof(uint32_t), var->data_type->bytecode_offset - ctab_start);
1842
1843 if (var->default_values)
1844 {
1845 unsigned int reg_size = var->data_type->reg_size[HLSL_REGSET_NUMERIC];
1846 unsigned int comp_count = hlsl_type_component_count(var->data_type);
1847 unsigned int default_value_offset;
1848 unsigned int k;
1849
1850 default_value_offset = bytecode_reserve_bytes(buffer, reg_size * sizeof(uint32_t));
1851 set_u32(buffer, var_offset + 4 * sizeof(uint32_t), default_value_offset - ctab_start);
1852
1853 for (k = 0; k < comp_count; ++k)
1854 {
1855 struct hlsl_type *comp_type = hlsl_type_get_component_type(ctx, var->data_type, k);
1856 unsigned int comp_offset;
1857 enum hlsl_regset regset;
1858
1859 comp_offset = hlsl_type_get_component_offset(ctx, var->data_type, k, &regset);
1861 {
1862 union
1863 {
1864 uint32_t u;
1865 float f;
1866 } uni;
1867
1868 switch (comp_type->e.numeric.type)
1869 {
1870 case HLSL_TYPE_DOUBLE:
1871 if (ctx->double_as_float_alias)
1872 uni.u = var->default_values[k].number.u;
1873 else
1874 uni.u = 0;
1875 break;
1876
1877 case HLSL_TYPE_INT:
1878 uni.f = var->default_values[k].number.i;
1879 break;
1880
1881 case HLSL_TYPE_UINT:
1882 case HLSL_TYPE_BOOL:
1883 uni.f = var->default_values[k].number.u;
1884 break;
1885
1886 case HLSL_TYPE_HALF:
1887 case HLSL_TYPE_FLOAT:
1888 uni.u = var->default_values[k].number.u;
1889 break;
1890
1891 default:
1893 }
1894
1895 set_u32(buffer, default_value_offset + comp_offset * sizeof(uint32_t), uni.u);
1896 }
1897 }
1898 }
1899
1900 ++uniform_count;
1901 }
1902 }
1903
1905 set_u32(buffer, creator_offset, offset - ctab_start);
1906
1907 ctab_end = bytecode_align(buffer);
1908 set_u32(buffer, size_offset, vkd3d_make_u32(VKD3D_SM1_OP_COMMENT, (ctab_end - ctab_offset) / sizeof(uint32_t)));
1909}
1910
1912{
1915}
1916
1918{
1920 unsigned int flags;
1921
1923 {
1926 unsigned int writemask;
1929
1931 {
1934 unsigned int swizzle;
1936 } srcs[4];
1937 unsigned int src_count;
1938
1939 unsigned int has_dst;
1940};
1941
1942static bool is_inconsequential_instr(const struct sm1_instruction *instr)
1943{
1944 const struct sm1_src_register *src = &instr->srcs[0];
1945 const struct sm1_dst_register *dst = &instr->dst;
1946 unsigned int i;
1947
1948 if (instr->opcode != VKD3D_SM1_OP_MOV)
1949 return false;
1950 if (dst->mod != VKD3DSPDM_NONE)
1951 return false;
1952 if (src->mod != VKD3DSPSM_NONE)
1953 return false;
1954 if (src->type != dst->type)
1955 return false;
1956 if (src->reg != dst->reg)
1957 return false;
1958
1959 for (i = 0; i < 4; ++i)
1960 {
1961 if ((dst->writemask & (1 << i)) && (vsir_swizzle_get_component(src->swizzle, i) != i))
1962 return false;
1963 }
1964
1965 return true;
1966}
1967
1968static void write_sm1_dst_register(struct vkd3d_bytecode_buffer *buffer, const struct sm1_dst_register *reg)
1969{
1970 VKD3D_ASSERT(reg->writemask);
1974 | (reg->writemask << VKD3D_SM1_WRITEMASK_SHIFT) | reg->reg);
1975}
1976
1978 const struct sm1_src_register *reg)
1979{
1983 | (reg->swizzle << VKD3D_SM1_SWIZZLE_SHIFT) | reg->reg);
1984}
1985
1986static void d3dbc_write_instruction(struct d3dbc_compiler *d3dbc, const struct sm1_instruction *instr)
1987{
1988 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
1989 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
1990 uint32_t token = instr->opcode;
1991 unsigned int i;
1992
1993 if (is_inconsequential_instr(instr))
1994 return;
1995
1997
1998 if (version->major > 1)
2001
2002 if (instr->has_dst)
2004
2005 for (i = 0; i < instr->src_count; ++i)
2007};
2008
2011{
2012 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2013 const struct vkd3d_sm1_opcode_info *info;
2014 unsigned int i = 0;
2015
2016 for (;;)
2017 {
2018 info = &d3dbc->opcode_table[i++];
2019 if (info->vkd3d_opcode == VKD3DSIH_INVALID)
2020 return NULL;
2021
2022 if (vkd3d_opcode == info->vkd3d_opcode
2023 && vkd3d_shader_ver_ge(version, info->min_version.major, info->min_version.minor)
2024 && (vkd3d_shader_ver_le(version, info->max_version.major, info->max_version.minor)
2025 || !info->max_version.major))
2026 return info;
2027 }
2028}
2029
2031{
2036
2037 if (x & ~0x3u || y & ~0x3u || z & ~0x3u || w & ~0x3u)
2038 ERR("Unexpected vsir swizzle: 0x%08x.\n", swizzle);
2039
2040 return ((x & 0x3u) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(0))
2041 | ((y & 0x3) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(1))
2042 | ((z & 0x3) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(2))
2043 | ((w & 0x3) << VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(3));
2044}
2045
2046static void sm1_src_reg_from_vsir(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_src_param *param,
2047 struct sm1_src_register *src, const struct vkd3d_shader_location *loc)
2048{
2049 src->mod = param->modifiers;
2050 src->reg = param->reg.idx[0].offset;
2051 src->type = param->reg.type;
2052 src->swizzle = swizzle_from_vsir(param->swizzle);
2053
2054 if (param->reg.idx[0].rel_addr)
2055 {
2057 "Unhandled relative addressing on source register.");
2058 d3dbc->failed = true;
2059 }
2060}
2061
2062static void sm1_dst_reg_from_vsir(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_dst_param *param,
2063 struct sm1_dst_register *dst, const struct vkd3d_shader_location *loc)
2064{
2065 dst->mod = param->modifiers;
2066 dst->reg = param->reg.idx[0].offset;
2067 dst->type = param->reg.type;
2068 dst->writemask = param->write_mask;
2069
2070 if (param->reg.idx[0].rel_addr)
2071 {
2073 "Unhandled relative addressing on destination register.");
2074 d3dbc->failed = true;
2075 }
2076}
2077
2078static void d3dbc_write_vsir_def(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
2079{
2080 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2081 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
2083
2084 const struct sm1_dst_register reg =
2085 {
2086 .type = VKD3DSPR_CONST,
2087 .writemask = VKD3DSP_WRITEMASK_ALL,
2088 .reg = ins->dst[0].reg.idx[0].offset,
2089 };
2090
2092 if (version->major > 1)
2095
2097 for (unsigned int x = 0; x < 4; ++x)
2098 put_f32(buffer, ins->src[0].reg.u.immconst_f32[x]);
2099}
2100
2102 unsigned int reg_id, enum vkd3d_sm1_resource_type res_type)
2103{
2104 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2105 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
2106 struct sm1_dst_register reg = {0};
2108
2110 if (version->major > 1)
2113
2115 token |= res_type << VKD3D_SM1_RESOURCE_TYPE_SHIFT;
2117
2119 reg.writemask = VKD3DSP_WRITEMASK_ALL;
2120 reg.reg = reg_id;
2121
2123}
2124
2125static void d3dbc_write_vsir_dcl(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
2126{
2127 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2128 const struct vkd3d_shader_semantic *semantic = &ins->declaration.semantic;
2129 unsigned int reg_id;
2130
2131 if (version->major < 2)
2132 return;
2133
2134 reg_id = semantic->resource.reg.reg.idx[0].offset;
2135
2136 if (semantic->resource.reg.reg.type != VKD3DSPR_SAMPLER)
2137 {
2139 "dcl instruction with register type %u.", semantic->resource.reg.reg.type);
2140 d3dbc->failed = true;
2141 return;
2142 }
2143
2144 switch (semantic->resource_type)
2145 {
2148 break;
2149
2152 break;
2153
2156 break;
2157
2158 default:
2160 "dcl instruction with resource_type %u.", semantic->resource_type);
2161 d3dbc->failed = true;
2162 return;
2163 }
2164}
2165
2167 struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
2168{
2169 const struct vkd3d_sm1_opcode_info *info;
2170
2171 if (!(info = shader_sm1_get_opcode_info_from_vsir(d3dbc, ins->opcode)))
2172 {
2174 "Opcode %#x not supported for shader profile.", ins->opcode);
2175 d3dbc->failed = true;
2176 return NULL;
2177 }
2178
2179 if (ins->dst_count != info->dst_count)
2180 {
2182 "Invalid destination count %u for vsir instruction %#x (expected %u).",
2183 ins->dst_count, ins->opcode, info->dst_count);
2184 d3dbc->failed = true;
2185 return NULL;
2186 }
2187 if (ins->src_count != info->src_count)
2188 {
2190 "Invalid source count %u for vsir instruction %#x (expected %u).",
2191 ins->src_count, ins->opcode, info->src_count);
2192 d3dbc->failed = true;
2193 return NULL;
2194 }
2195
2196 return info;
2197}
2198
2200 const struct vkd3d_shader_instruction *ins)
2201{
2202 struct sm1_instruction instr = {0};
2203 const struct vkd3d_sm1_opcode_info *info;
2204
2206 return;
2207
2208 instr.opcode = info->sm1_opcode;
2209 instr.flags = ins->flags;
2210 instr.has_dst = info->dst_count;
2211 instr.src_count = info->src_count;
2212
2213 if (instr.has_dst)
2214 sm1_dst_reg_from_vsir(d3dbc, &ins->dst[0], &instr.dst, &ins->location);
2215 for (unsigned int i = 0; i < instr.src_count; ++i)
2216 sm1_src_reg_from_vsir(d3dbc, &ins->src[i], &instr.srcs[i], &ins->location);
2217
2218 d3dbc_write_instruction(d3dbc, &instr);
2219}
2220
2221static void d3dbc_write_vsir_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
2222{
2223 uint32_t writemask;
2224
2225 switch (ins->opcode)
2226 {
2227 case VKD3DSIH_DEF:
2228 d3dbc_write_vsir_def(d3dbc, ins);
2229 break;
2230
2231 case VKD3DSIH_DCL:
2232 d3dbc_write_vsir_dcl(d3dbc, ins);
2233 break;
2234
2235 case VKD3DSIH_ABS:
2236 case VKD3DSIH_ADD:
2237 case VKD3DSIH_CMP:
2238 case VKD3DSIH_DP2ADD:
2239 case VKD3DSIH_DP3:
2240 case VKD3DSIH_DP4:
2241 case VKD3DSIH_DSX:
2242 case VKD3DSIH_DSY:
2243 case VKD3DSIH_ELSE:
2244 case VKD3DSIH_ENDIF:
2245 case VKD3DSIH_FRC:
2246 case VKD3DSIH_IFC:
2247 case VKD3DSIH_MAD:
2248 case VKD3DSIH_MAX:
2249 case VKD3DSIH_MIN:
2250 case VKD3DSIH_MOV:
2251 case VKD3DSIH_MUL:
2252 case VKD3DSIH_SINCOS:
2253 case VKD3DSIH_SLT:
2254 case VKD3DSIH_TEX:
2255 case VKD3DSIH_TEXKILL:
2256 case VKD3DSIH_TEXLDD:
2258 break;
2259
2260 case VKD3DSIH_EXP:
2261 case VKD3DSIH_LOG:
2262 case VKD3DSIH_RCP:
2263 case VKD3DSIH_RSQ:
2264 writemask = ins->dst->write_mask;
2265 if (writemask != VKD3DSP_WRITEMASK_0 && writemask != VKD3DSP_WRITEMASK_1
2266 && writemask != VKD3DSP_WRITEMASK_2 && writemask != VKD3DSP_WRITEMASK_3)
2267 {
2270 "writemask %#x for vsir instruction with opcode %#x is not single component.",
2271 writemask, ins->opcode);
2272 d3dbc->failed = true;
2273 }
2275 break;
2276
2277 default:
2279 "vsir instruction with opcode %#x.", ins->opcode);
2280 d3dbc->failed = true;
2281 break;
2282 }
2283}
2284
2286 const struct signature_element *element, bool output)
2287{
2288 const struct vkd3d_shader_version *version = &d3dbc->program->shader_version;
2289 struct vkd3d_bytecode_buffer *buffer = &d3dbc->buffer;
2290 struct sm1_dst_register reg = {0};
2293 bool ret;
2294
2296 element->semantic_index, output, &reg.type, &reg.reg))
2297 {
2298 usage = 0;
2299 usage_idx = 0;
2300 }
2301 else
2302 {
2303 ret = sm1_usage_from_semantic_name(element->semantic_name, element->semantic_index, &usage, &usage_idx);
2305 reg.type = output ? VKD3DSPR_OUTPUT : VKD3DSPR_INPUT;
2306 reg.reg = element->register_index;
2307 }
2308
2310 if (version->major > 1)
2313
2314 token = (1u << 31);
2318
2319 reg.writemask = element->mask;
2321}
2322
2324{
2325 struct vsir_program *program = d3dbc->program;
2326 const struct vkd3d_shader_version *version;
2327 bool write_in = false, write_out = false;
2328
2329 version = &program->shader_version;
2330 if (version->type == VKD3D_SHADER_TYPE_PIXEL && version->major >= 2)
2331 write_in = true;
2332 else if (version->type == VKD3D_SHADER_TYPE_VERTEX && version->major == 3)
2333 write_in = write_out = true;
2334 else if (version->type == VKD3D_SHADER_TYPE_VERTEX && version->major < 3)
2335 write_in = true;
2336
2337 if (write_in)
2338 {
2339 for (unsigned int i = 0; i < program->input_signature.element_count; ++i)
2340 d3dbc_write_semantic_dcl(d3dbc, &program->input_signature.elements[i], false);
2341 }
2342
2343 if (write_out)
2344 {
2345 for (unsigned int i = 0; i < program->output_signature.element_count; ++i)
2346 d3dbc_write_semantic_dcl(d3dbc, &program->output_signature.elements[i], true);
2347 }
2348}
2349
2351{
2352 struct vsir_program *program = d3dbc->program;
2353 unsigned int i;
2354
2355 for (i = 0; i < program->instructions.count; ++i)
2356 d3dbc_write_vsir_instruction(d3dbc, &program->instructions.elements[i]);
2357}
2358
2359int d3dbc_compile(struct vsir_program *program, uint64_t config_flags,
2360 const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_code *ctab,
2361 struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
2362{
2363 const struct vkd3d_shader_version *version = &program->shader_version;
2364 struct d3dbc_compiler d3dbc = {0};
2365 struct vkd3d_bytecode_buffer *buffer = &d3dbc.buffer;
2366 int result;
2367
2368 d3dbc.program = program;
2369 d3dbc.message_context = message_context;
2370 switch (version->type)
2371 {
2374 break;
2375
2378 break;
2379
2380 default:
2382 "Invalid shader type %u.", version->type);
2384 }
2385
2386 put_u32(buffer, sm1_version(version->type, version->major, version->minor));
2387
2388 bytecode_put_bytes(buffer, ctab->code, ctab->size);
2389
2392
2394
2395 result = VKD3D_OK;
2396 if (buffer->status)
2397 result = buffer->status;
2398 if (d3dbc.failed)
2400
2401 if (!result)
2402 {
2403 out->code = buffer->data;
2404 out->size = buffer->size;
2405 }
2406 else
2407 {
2408 vkd3d_free(buffer->data);
2409 }
2410 return result;
2411}
static const unsigned char reg_size[]
Definition: amd64_sup.c:21
#define index(s, c)
Definition: various.h:29
#define ARRAY_SIZE(A)
Definition: main.h:20
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static __inline void bitmap_set(IN bitmap4 *mask, IN uint32_t word, IN uint32_t flag)
Definition: util.h:62
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
static void put_u32(struct bytecode_buffer *buffer, uint32_t value)
Definition: list.h:39
Definition: _set.h:50
BYTE usage_idx
static bool shader_sm1_is_end(struct vkd3d_shader_sm1_parser *sm1)
Definition: d3dbc.c:1249
#define VKD3D_SM1_SWIZZLE_COMPONENT_SHIFT(idx)
Definition: d3dbc.c:81
static void d3dbc_write_semantic_dcl(struct d3dbc_compiler *d3dbc, const struct signature_element *element, bool output)
Definition: d3dbc.c:2285
static void d3dbc_write_vsir_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2221
static bool has_relative_address(uint32_t param)
Definition: d3dbc.c:410
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info(const struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_sm1_opcode opcode)
Definition: d3dbc.c:419
void write_sm1_uniforms(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer)
Definition: d3dbc.c:1752
static uint32_t swizzle_from_sm1(uint32_t swizzle)
Definition: d3dbc.c:445
static struct signature_element * find_signature_element(const struct shader_signature *signature, const char *semantic_name, unsigned int semantic_index)
Definition: d3dbc.c:533
#define VKD3D_SM1_SWIZZLE_COMPONENT_MASK(idx)
Definition: d3dbc.c:82
static const struct vkd3d_sm1_opcode_info ps_opcode_table[]
Definition: d3dbc.c:301
#define VKD3D_SM1_RESOURCE_TYPE_MASK
Definition: d3dbc.c:39
vkd3d_sm1_misc_register
Definition: d3dbc.c:108
@ VKD3D_SM1_MISC_FACE
Definition: d3dbc.c:110
@ VKD3D_SM1_MISC_POSITION
Definition: d3dbc.c:109
static uint32_t read_u32(const uint32_t **ptr)
Definition: d3dbc.c:405
#define VKD3D_SM1_INSTRUCTION_LENGTH_SHIFT
Definition: d3dbc.c:46
#define VKD3D_SM1_VS
Definition: d3dbc.c:30
#define VKD3D_SM1_DST_MODIFIER_SHIFT
Definition: d3dbc.c:68
#define VKD3D_SM1_OPCODE_MASK
Definition: d3dbc.c:41
static uint32_t swizzle_from_vsir(uint32_t swizzle)
Definition: d3dbc.c:2030
static void d3dbc_write_vsir_dcl(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2125
#define VKD3D_SM1_INSTRUCTION_PREDICATED
Definition: d3dbc.c:54
vkd3d_sm1_resource_type
Definition: d3dbc.c:99
@ VKD3D_SM1_RESOURCE_TEXTURE_1D
Definition: d3dbc.c:101
@ VKD3D_SM1_RESOURCE_UNKNOWN
Definition: d3dbc.c:100
@ VKD3D_SM1_RESOURCE_TEXTURE_2D
Definition: d3dbc.c:102
@ VKD3D_SM1_RESOURCE_TEXTURE_3D
Definition: d3dbc.c:104
@ VKD3D_SM1_RESOURCE_TEXTURE_CUBE
Definition: d3dbc.c:103
static unsigned int make_mask_contiguous(unsigned int mask)
Definition: d3dbc.c:565
static bool add_signature_element(struct vkd3d_shader_sm1_parser *sm1, bool output, const char *name, unsigned int index, enum vkd3d_shader_sysval_semantic sysval, unsigned int register_index, bool is_dcl, unsigned int mask)
Definition: d3dbc.c:579
static struct signature_element * find_signature_element_by_register_index(const struct shader_signature *signature, unsigned int register_index)
Definition: d3dbc.c:549
vkd3d_sm1_address_mode_type
Definition: d3dbc.c:93
@ VKD3D_SM1_ADDRESS_MODE_ABSOLUTE
Definition: d3dbc.c:94
@ VKD3D_SM1_ADDRESS_MODE_RELATIVE
Definition: d3dbc.c:95
static void d3dbc_write_vsir_sampler_dcl(struct d3dbc_compiler *d3dbc, unsigned int reg_id, enum vkd3d_sm1_resource_type res_type)
Definition: d3dbc.c:2101
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2166
#define VKD3D_SM1_SWIZZLE_SHIFT
Definition: d3dbc.c:77
#define VKD3D_SM1_SWIZZLE_MASK
Definition: d3dbc.c:78
static void record_constant_register(struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_shader_d3dbc_constant_register set, uint32_t index, bool from_def)
Definition: d3dbc.c:796
static void write_sm1_dst_register(struct vkd3d_bytecode_buffer *buffer, const struct sm1_dst_register *reg)
Definition: d3dbc.c:1968
#define VKD3D_SM1_SWIZZLE_DEFAULT
Definition: d3dbc.c:79
static void sm1_dst_reg_from_vsir(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_dst_param *param, struct sm1_dst_register *dst, const struct vkd3d_shader_location *loc)
Definition: d3dbc.c:2062
#define VKD3D_SM1_DSTSHIFT_SHIFT
Definition: d3dbc.c:71
static void shader_sm1_validate_instruction(struct vkd3d_shader_sm1_parser *sm1, struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:1108
static void shader_sm1_scan_register(struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_register *reg, unsigned int mask, bool from_def)
Definition: d3dbc.c:809
#define VKD3D_SM1_SRC_MODIFIER_MASK
Definition: d3dbc.c:85
vkd3d_sm1_opcode
Definition: d3dbc.c:114
@ VKD3D_SM1_OP_IF
Definition: d3dbc.c:155
@ VKD3D_SM1_OP_TEXKILL
Definition: d3dbc.c:166
@ VKD3D_SM1_OP_TEXM3x3PAD
Definition: d3dbc.c:174
@ VKD3D_SM1_OP_ENDIF
Definition: d3dbc.c:158
@ VKD3D_SM1_OP_DP4
Definition: d3dbc.c:124
@ VKD3D_SM1_OP_TEXDP3TEX
Definition: d3dbc.c:184
@ VKD3D_SM1_OP_PHASE
Definition: d3dbc.c:199
@ VKD3D_SM1_OP_RET
Definition: d3dbc.c:143
@ VKD3D_SM1_OP_LIT
Definition: d3dbc.c:131
@ VKD3D_SM1_OP_BREAK
Definition: d3dbc.c:159
@ VKD3D_SM1_OP_LOG
Definition: d3dbc.c:130
@ VKD3D_SM1_OP_TEXBEML
Definition: d3dbc.c:169
@ VKD3D_SM1_OP_TEXLDD
Definition: d3dbc.c:194
@ VKD3D_SM1_OP_SGN
Definition: d3dbc.c:149
@ VKD3D_SM1_OP_TEXM3x2TEX
Definition: d3dbc.c:173
@ VKD3D_SM1_OP_BREAKP
Definition: d3dbc.c:197
@ VKD3D_SM1_OP_LOOP
Definition: d3dbc.c:142
@ VKD3D_SM1_OP_DP3
Definition: d3dbc.c:123
@ VKD3D_SM1_OP_TEXM3x3VSPEC
Definition: d3dbc.c:178
@ VKD3D_SM1_OP_ABS
Definition: d3dbc.c:150
@ VKD3D_SM1_OP_LOGP
Definition: d3dbc.c:180
@ VKD3D_SM1_OP_LABEL
Definition: d3dbc.c:145
@ VKD3D_SM1_OP_M3x2
Definition: d3dbc.c:139
@ VKD3D_SM1_OP_COMMENT
Definition: d3dbc.c:200
@ VKD3D_SM1_OP_BEM
Definition: d3dbc.c:190
@ VKD3D_SM1_OP_M3x4
Definition: d3dbc.c:137
@ VKD3D_SM1_OP_CND
Definition: d3dbc.c:181
@ VKD3D_SM1_OP_MAX
Definition: d3dbc.c:126
@ VKD3D_SM1_OP_SUB
Definition: d3dbc.c:118
@ VKD3D_SM1_OP_CMP
Definition: d3dbc.c:189
@ VKD3D_SM1_OP_TEXREG2GB
Definition: d3dbc.c:171
@ VKD3D_SM1_OP_SETP
Definition: d3dbc.c:195
@ VKD3D_SM1_OP_EXP
Definition: d3dbc.c:129
@ VKD3D_SM1_OP_TEXM3x3SPEC
Definition: d3dbc.c:177
@ VKD3D_SM1_OP_MOV
Definition: d3dbc.c:116
@ VKD3D_SM1_OP_TEXDP3
Definition: d3dbc.c:186
@ VKD3D_SM1_OP_NOP
Definition: d3dbc.c:115
@ VKD3D_SM1_OP_M3x3
Definition: d3dbc.c:138
@ VKD3D_SM1_OP_TEXBEM
Definition: d3dbc.c:168
@ VKD3D_SM1_OP_DSX
Definition: d3dbc.c:192
@ VKD3D_SM1_OP_DP2ADD
Definition: d3dbc.c:191
@ VKD3D_SM1_OP_M4x4
Definition: d3dbc.c:135
@ VKD3D_SM1_OP_DSY
Definition: d3dbc.c:193
@ VKD3D_SM1_OP_MAD
Definition: d3dbc.c:119
@ VKD3D_SM1_OP_CALLNZ
Definition: d3dbc.c:141
@ VKD3D_SM1_OP_TEXM3x3TEX
Definition: d3dbc.c:175
@ VKD3D_SM1_OP_NRM
Definition: d3dbc.c:151
@ VKD3D_SM1_OP_RSQ
Definition: d3dbc.c:122
@ VKD3D_SM1_OP_TEX
Definition: d3dbc.c:167
@ VKD3D_SM1_OP_REP
Definition: d3dbc.c:153
@ VKD3D_SM1_OP_TEXLDL
Definition: d3dbc.c:196
@ VKD3D_SM1_OP_END
Definition: d3dbc.c:201
@ VKD3D_SM1_OP_TEXDEPTH
Definition: d3dbc.c:188
@ VKD3D_SM1_OP_DEFI
Definition: d3dbc.c:163
@ VKD3D_SM1_OP_SINCOS
Definition: d3dbc.c:152
@ VKD3D_SM1_OP_IFC
Definition: d3dbc.c:156
@ VKD3D_SM1_OP_TEXREG2AR
Definition: d3dbc.c:170
@ VKD3D_SM1_OP_ENDREP
Definition: d3dbc.c:154
@ VKD3D_SM1_OP_EXPP
Definition: d3dbc.c:179
@ VKD3D_SM1_OP_ELSE
Definition: d3dbc.c:157
@ VKD3D_SM1_OP_MUL
Definition: d3dbc.c:120
@ VKD3D_SM1_OP_LRP
Definition: d3dbc.c:133
@ VKD3D_SM1_OP_RCP
Definition: d3dbc.c:121
@ VKD3D_SM1_OP_M4x3
Definition: d3dbc.c:136
@ VKD3D_SM1_OP_DST
Definition: d3dbc.c:132
@ VKD3D_SM1_OP_MOVA
Definition: d3dbc.c:161
@ VKD3D_SM1_OP_TEXM3x2DEPTH
Definition: d3dbc.c:185
@ VKD3D_SM1_OP_MIN
Definition: d3dbc.c:125
@ VKD3D_SM1_OP_TEXM3x2PAD
Definition: d3dbc.c:172
@ VKD3D_SM1_OP_DEFB
Definition: d3dbc.c:162
@ VKD3D_SM1_OP_BREAKC
Definition: d3dbc.c:160
@ VKD3D_SM1_OP_DEF
Definition: d3dbc.c:182
@ VKD3D_SM1_OP_POW
Definition: d3dbc.c:147
@ VKD3D_SM1_OP_TEXM3x3
Definition: d3dbc.c:187
@ VKD3D_SM1_OP_ADD
Definition: d3dbc.c:117
@ VKD3D_SM1_OP_CALL
Definition: d3dbc.c:140
@ VKD3D_SM1_OP_TEXREG2RGB
Definition: d3dbc.c:183
@ VKD3D_SM1_OP_ENDLOOP
Definition: d3dbc.c:144
@ VKD3D_SM1_OP_FRC
Definition: d3dbc.c:134
@ VKD3D_SM1_OP_TEXM3x3DIFF
Definition: d3dbc.c:176
@ VKD3D_SM1_OP_TEXCOORD
Definition: d3dbc.c:165
@ VKD3D_SM1_OP_SLT
Definition: d3dbc.c:127
@ VKD3D_SM1_OP_DCL
Definition: d3dbc.c:146
@ VKD3D_SM1_OP_SGE
Definition: d3dbc.c:128
@ VKD3D_SM1_OP_CRS
Definition: d3dbc.c:148
#define VKD3D_SM1_DCL_USAGE_INDEX_MASK
Definition: d3dbc.c:36
static void sm1_sort_extern(struct list *sorted, struct hlsl_ir_var *to_sort)
Definition: d3dbc.c:1721
#define VKD3D_SM1_END
Definition: d3dbc.c:87
static void write_sm1_src_register(struct vkd3d_bytecode_buffer *buffer, const struct sm1_src_register *reg)
Definition: d3dbc.c:1977
static void d3dbc_write_instruction(struct d3dbc_compiler *d3dbc, const struct sm1_instruction *instr)
Definition: d3dbc.c:1986
static void shader_sm1_read_src_param(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_src_param *src_param)
Definition: d3dbc.c:928
#define VKD3D_SM1_VERSION_MINOR(version)
Definition: d3dbc.c:90
#define VKD3D_SM1_ADDRESS_MODE_SHIFT
Definition: d3dbc.c:65
int d3dbc_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t config_flags, struct vkd3d_shader_message_context *message_context, struct vsir_program *program)
Definition: d3dbc.c:1349
bool sm1_register_from_semantic_name(const struct vkd3d_shader_version *version, const char *semantic_name, unsigned int semantic_index, bool output, enum vkd3d_shader_register_type *type, unsigned int *reg)
Definition: d3dbc.c:1401
static const struct vkd3d_sm1_opcode_info vs_opcode_table[]
Definition: d3dbc.c:233
#define VKD3D_SM1_WRITEMASK_SHIFT
Definition: d3dbc.c:74
#define VKD3D_SM1_DCL_USAGE_INDEX_SHIFT
Definition: d3dbc.c:35
static void write_sm1_type(struct vkd3d_bytecode_buffer *buffer, struct hlsl_type *type, unsigned int ctab_start)
Definition: d3dbc.c:1681
static unsigned int mask_from_swizzle(uint32_t swizzle)
Definition: d3dbc.c:1118
static enum vkd3d_result shader_sm1_init(struct vkd3d_shader_sm1_parser *sm1, struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
Definition: d3dbc.c:1267
#define VKD3D_SM1_PS
Definition: d3dbc.c:31
#define VKD3D_SM1_COMMENT_SIZE_MASK
Definition: d3dbc.c:52
static uint32_t get_external_constant_count(struct vkd3d_shader_sm1_parser *sm1, enum vkd3d_shader_d3dbc_constant_register set)
Definition: d3dbc.c:1332
#define VKD3D_SM1_REGISTER_TYPE_MASK2
Definition: d3dbc.c:63
#define VKD3D_SM1_RESOURCE_TYPE_SHIFT
Definition: d3dbc.c:38
static void shader_sm1_parse_src_param(uint32_t param, struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_src_param *src)
Definition: d3dbc.c:468
#define VKD3D_SM1_COISSUE
Definition: d3dbc.c:49
static void add_signature_mask(struct vkd3d_shader_sm1_parser *sm1, bool output, unsigned int register_index, unsigned int mask)
Definition: d3dbc.c:622
D3DXPARAMETER_TYPE hlsl_sm1_base_type(const struct hlsl_type *type)
Definition: d3dbc.c:1575
#define VKD3D_SM1_INSTRUCTION_PARAMETER
Definition: d3dbc.c:56
static void d3dbc_write_semantic_dcls(struct d3dbc_compiler *d3dbc)
Definition: d3dbc.c:2323
static const struct vkd3d_sm1_opcode_info * shader_sm1_get_opcode_info_from_vsir(struct d3dbc_compiler *d3dbc, enum vkd3d_shader_opcode vkd3d_opcode)
Definition: d3dbc.c:2009
static void shader_sm1_read_immconst(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_src_param *src_param, enum vsir_dimension dimension, enum vkd3d_data_type data_type)
Definition: d3dbc.c:1016
#define VKD3D_SM1_INSTRUCTION_FLAGS_MASK
Definition: d3dbc.c:44
static bool add_signature_element_from_register(struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_register *reg, bool is_dcl, unsigned int mask)
Definition: d3dbc.c:644
static void shader_sm1_read_semantic(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_semantic *semantic)
Definition: d3dbc.c:973
#define VKD3D_SM1_VERSION_MAJOR(version)
Definition: d3dbc.c:89
#define VKD3D_SM1_REGISTER_NUMBER_MASK
Definition: d3dbc.c:58
static void d3dbc_write_vsir_simple_instruction(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2199
static void shader_sm1_read_instruction(struct vkd3d_shader_sm1_parser *sm1, struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:1126
static void sm1_sort_externs(struct hlsl_ctx *ctx)
Definition: d3dbc.c:1739
static unsigned int idx_count_from_reg_type(enum vkd3d_shader_register_type reg_type)
Definition: d3dbc.c:456
bool sm1_usage_from_semantic_name(const char *semantic_name, uint32_t semantic_index, enum vkd3d_decl_usage *usage, uint32_t *usage_idx)
Definition: d3dbc.c:1469
#define VKD3D_SM1_DCL_USAGE_MASK
Definition: d3dbc.c:34
#define VKD3D_SM1_REGISTER_TYPE_SHIFT
Definition: d3dbc.c:60
static void d3dbc_write_program_instructions(struct d3dbc_compiler *d3dbc)
Definition: d3dbc.c:2350
static void shader_sm1_read_comment(struct vkd3d_shader_sm1_parser *sm1)
Definition: d3dbc.c:1049
#define VKD3D_SM1_COMMENT_SIZE_SHIFT
Definition: d3dbc.c:51
#define VKD3D_SM1_DSTSHIFT_MASK
Definition: d3dbc.c:72
#define VKD3D_SM1_INSTRUCTION_FLAGS_SHIFT
Definition: d3dbc.c:43
#define VKD3D_SM1_REGISTER_TYPE_MASK
Definition: d3dbc.c:61
static void d3dbc_write_vsir_def(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_instruction *ins)
Definition: d3dbc.c:2078
int d3dbc_compile(struct vsir_program *program, uint64_t config_flags, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_code *ctab, struct vkd3d_shader_code *out, struct vkd3d_shader_message_context *message_context)
Definition: d3dbc.c:2359
static void shader_sm1_parse_dst_param(uint32_t param, struct vkd3d_shader_src_param *rel_addr, struct vkd3d_shader_dst_param *dst)
Definition: d3dbc.c:493
D3DXPARAMETER_CLASS hlsl_sm1_class(const struct hlsl_type *type)
Definition: d3dbc.c:1528
static void shader_sm1_skip_opcode(const struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, const struct vkd3d_sm1_opcode_info *opcode_info, uint32_t opcode_token)
Definition: d3dbc.c:894
#define MAX_CONSTANT_COUNT
Definition: d3dbc.c:226
static void shader_sm1_read_param(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, uint32_t *token, uint32_t *addr_token)
Definition: d3dbc.c:854
#define VKD3D_SM1_DCL_USAGE_SHIFT
Definition: d3dbc.c:33
static uint32_t sm1_encode_register_type(enum vkd3d_shader_register_type type)
Definition: d3dbc.c:1911
#define VKD3D_SM1_REGISTER_TYPE_SHIFT2
Definition: d3dbc.c:62
static enum vkd3d_shader_resource_type resource_type_table[]
Definition: d3dbc.c:396
#define VKD3D_SM1_DST_MODIFIER_MASK
Definition: d3dbc.c:69
#define VKD3D_SM1_WRITEMASK_MASK
Definition: d3dbc.c:75
static unsigned int shader_sm1_get_swizzle_component(uint32_t swizzle, unsigned int idx)
Definition: d3dbc.c:440
static bool is_inconsequential_instr(const struct sm1_instruction *instr)
Definition: d3dbc.c:1942
static void shader_sm1_read_dst_param(struct vkd3d_shader_sm1_parser *sm1, const uint32_t **ptr, struct vkd3d_shader_dst_param *dst_param)
Definition: d3dbc.c:949
#define VKD3D_SM1_SRC_MODIFIER_SHIFT
Definition: d3dbc.c:84
#define VKD3D_SM1_INSTRUCTION_LENGTH_MASK
Definition: d3dbc.c:47
static uint32_t sm1_version(enum vkd3d_shader_type type, unsigned int major, unsigned int minor)
Definition: d3dbc.c:1522
#define VKD3D_SM1_ADDRESS_MODE_MASK
Definition: d3dbc.c:66
static void sm1_src_reg_from_vsir(struct d3dbc_compiler *d3dbc, const struct vkd3d_shader_src_param *param, struct sm1_src_register *src, const struct vkd3d_shader_location *loc)
Definition: d3dbc.c:2046
static bool add_signature_element_from_semantic(struct vkd3d_shader_sm1_parser *sm1, const struct vkd3d_shader_semantic *semantic)
Definition: d3dbc.c:747
range
Definition: d3dx9_private.h:58
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
UINT64 uint64_t
Definition: types.h:77
unsigned int idx
Definition: utils.c:40
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
static const WCHAR version[]
Definition: asmname.c:66
unsigned short uint16_t
Definition: stdint.h:35
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
static void list_move_tail(struct list_head *list, struct list_head *head)
Definition: list.h:122
return ret
Definition: mutex.c:147
D3DXPARAMETER_CLASS
Definition: d3dx9shader.h:61
@ D3DXPC_SCALAR
Definition: d3dx9shader.h:62
@ D3DXPC_MATRIX_COLUMNS
Definition: d3dx9shader.h:65
@ D3DXPC_STRUCT
Definition: d3dx9shader.h:67
@ D3DXPC_MATRIX_ROWS
Definition: d3dx9shader.h:64
@ D3DXPC_VECTOR
Definition: d3dx9shader.h:63
@ D3DXPC_OBJECT
Definition: d3dx9shader.h:66
@ D3DXRS_FLOAT4
Definition: d3dx9shader.h:55
@ D3DXRS_SAMPLER
Definition: d3dx9shader.h:56
D3DXPARAMETER_TYPE
Definition: d3dx9shader.h:72
@ D3DXPT_STRING
Definition: d3dx9shader.h:77
@ D3DXPT_TEXTURE
Definition: d3dx9shader.h:78
@ D3DXPT_SAMPLER3D
Definition: d3dx9shader.h:86
@ D3DXPT_VERTEXSHADER
Definition: d3dx9shader.h:89
@ D3DXPT_TEXTURE1D
Definition: d3dx9shader.h:79
@ D3DXPT_SAMPLERCUBE
Definition: d3dx9shader.h:87
@ D3DXPT_FLOAT
Definition: d3dx9shader.h:76
@ D3DXPT_TEXTURECUBE
Definition: d3dx9shader.h:82
@ D3DXPT_PIXELSHADER
Definition: d3dx9shader.h:88
@ D3DXPT_BOOL
Definition: d3dx9shader.h:74
@ D3DXPT_INT
Definition: d3dx9shader.h:75
@ D3DXPT_VOID
Definition: d3dx9shader.h:73
@ D3DXPT_SAMPLER
Definition: d3dx9shader.h:83
@ D3DXPT_SAMPLER1D
Definition: d3dx9shader.h:84
@ D3DXPT_SAMPLER2D
Definition: d3dx9shader.h:85
@ D3DXPT_TEXTURE3D
Definition: d3dx9shader.h:81
@ D3DXPT_TEXTURE2D
Definition: d3dx9shader.h:80
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint end
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLenum src
Definition: glext.h:6340
GLuint GLenum swizzle
Definition: glext.h:9511
GLuint buffer
Definition: glext.h:5915
GLsizeiptr size
Definition: glext.h:5919
GLintptr offset
Definition: glext.h:5920
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
GLuint program
Definition: glext.h:6723
GLenum GLenum dst
Definition: glext.h:6340
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLuint64EXT * result
Definition: glext.h:11304
GLfloat GLfloat p
Definition: glext.h:8902
GLfloat param
Definition: glext.h:5796
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
GLdouble GLdouble z
Definition: glext.h:5874
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 token
Definition: glfuncs.h:210
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
enum wined3d_data_type data_type
Definition: glsl_shader.c:71
unsigned int hlsl_type_component_count(const struct hlsl_type *type)
Definition: hlsl.c:1042
unsigned int hlsl_type_get_component_offset(struct hlsl_ctx *ctx, struct hlsl_type *type, unsigned int index, enum hlsl_regset *regset)
Definition: hlsl.c:620
struct hlsl_type * hlsl_type_get_component_type(struct hlsl_ctx *ctx, struct hlsl_type *type, unsigned int index)
Definition: hlsl.c:611
const struct hlsl_type * hlsl_get_multiarray_element_type(const struct hlsl_type *type)
Definition: hlsl.c:226
unsigned int hlsl_get_multiarray_size(const struct hlsl_type *type)
Definition: hlsl.c:233
char * hlsl_sprintf_alloc(struct hlsl_ctx *ctx, const char *fmt,...)
Definition: hlsl.c:75
@ HLSL_CLASS_COMPUTE_SHADER
Definition: hlsl.h:102
@ HLSL_CLASS_RASTERIZER_STATE
Definition: hlsl.h:94
@ HLSL_CLASS_RENDER_TARGET_VIEW
Definition: hlsl.h:95
@ HLSL_CLASS_VERTEX_SHADER
Definition: hlsl.h:101
@ HLSL_CLASS_MATRIX
Definition: hlsl.h:85
@ HLSL_CLASS_GEOMETRY_SHADER
Definition: hlsl.h:105
@ HLSL_CLASS_TECHNIQUE
Definition: hlsl.h:98
@ HLSL_CLASS_SAMPLER
Definition: hlsl.h:96
@ HLSL_CLASS_UAV
Definition: hlsl.h:100
@ HLSL_CLASS_VECTOR
Definition: hlsl.h:84
@ HLSL_CLASS_TEXTURE
Definition: hlsl.h:99
@ HLSL_CLASS_DEPTH_STENCIL_VIEW
Definition: hlsl.h:90
@ HLSL_CLASS_STRUCT
Definition: hlsl.h:87
@ HLSL_CLASS_CONSTANT_BUFFER
Definition: hlsl.h:106
@ HLSL_CLASS_VOID
Definition: hlsl.h:108
@ HLSL_CLASS_SCALAR
Definition: hlsl.h:83
@ HLSL_CLASS_EFFECT_GROUP
Definition: hlsl.h:91
@ HLSL_CLASS_PIXEL_SHADER
Definition: hlsl.h:93
@ HLSL_CLASS_BLEND_STATE
Definition: hlsl.h:107
@ HLSL_CLASS_STRING
Definition: hlsl.h:97
@ HLSL_CLASS_HULL_SHADER
Definition: hlsl.h:104
@ HLSL_CLASS_DOMAIN_SHADER
Definition: hlsl.h:103
@ HLSL_CLASS_NULL
Definition: hlsl.h:109
@ HLSL_CLASS_ARRAY
Definition: hlsl.h:88
@ HLSL_CLASS_DEPTH_STENCIL_STATE
Definition: hlsl.h:89
@ HLSL_CLASS_PASS
Definition: hlsl.h:92
@ HLSL_CLASS_ERROR
Definition: hlsl.h:110
hlsl_regset
Definition: hlsl.h:146
@ HLSL_REGSET_NUMERIC
Definition: hlsl.h:151
@ HLSL_REGSET_LAST
Definition: hlsl.h:152
@ HLSL_TYPE_HALF
Definition: hlsl.h:116
@ HLSL_TYPE_BOOL
Definition: hlsl.h:120
@ HLSL_TYPE_UINT
Definition: hlsl.h:119
@ HLSL_TYPE_INT
Definition: hlsl.h:118
@ HLSL_TYPE_FLOAT
Definition: hlsl.h:115
@ HLSL_TYPE_DOUBLE
Definition: hlsl.h:117
@ HLSL_SAMPLER_DIM_GENERIC
Definition: hlsl.h:126
@ HLSL_SAMPLER_DIM_CUBE
Definition: hlsl.h:131
@ HLSL_SAMPLER_DIM_3D
Definition: hlsl.h:130
@ HLSL_SAMPLER_DIM_2D
Definition: hlsl.h:129
@ HLSL_SAMPLER_DIM_1D
Definition: hlsl.h:128
#define HLSL_MODIFIERS_MAJORITY_MASK
Definition: hlsl.h:427
#define HLSL_MODIFIER_COLUMN_MAJOR
Definition: hlsl.h:407
static int reg
Definition: i386-dis.c:1290
bool vsir_program_init(struct vsir_program *program, const struct vkd3d_shader_compile_info *compile_info, const struct vkd3d_shader_version *version, unsigned int reserve, enum vsir_control_flow_type cf_type, enum vsir_normalisation_level normalisation_level)
Definition: ir.c:76
void vsir_program_cleanup(struct vsir_program *program)
Definition: ir.c:105
void vsir_register_init(struct vkd3d_shader_register *reg, enum vkd3d_shader_register_type reg_type, enum vkd3d_data_type data_type, unsigned int idx_count)
Definition: ir.c:164
void vsir_instruction_init(struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_location *location, enum vkd3d_shader_opcode opcode)
Definition: ir.c:321
#define e
Definition: ke_i.h:82
#define f
Definition: ke_i.h:83
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define memchr(s, c, n)
Definition: mkisofs.h:875
static PVOID ptr
Definition: dispmode.c:27
#define comment(fmt, arg1)
Definition: rebar.c:847
const char * var
Definition: shader.c:5879
D3DXREGISTER_SET regset
Definition: shader.c:5881
constants
Definition: resource.c:30
int k
Definition: mpi.c:3369
static UINT array_size
Definition: msctf.cpp:39
#define uint32_t
Definition: nsiface.idl:61
static unsigned __int64 next
Definition: rand_nt.c:6
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
__WINE_SERVER_LIST_INLINE void list_add_before(struct list *elem, struct list *to_add)
Definition: list.h:89
#define memset(x, y, z)
Definition: compat.h:39
#define minor(rdev)
Definition: propsheet.cpp:929
#define major(rdev)
Definition: propsheet.cpp:928
#define TRACE(s)
Definition: solgame.cpp:4
enum vkd3d_shader_register_type reg_type
Definition: spirv.c:4885
enum vkd3d_shader_sysval_semantic sysval
Definition: spirv.c:4839
Definition: inflate.c:139
struct vkd3d_bytecode_buffer buffer
Definition: d3dbc.c:1517
struct vkd3d_shader_message_context * message_context
Definition: d3dbc.c:1518
struct vsir_program * program
Definition: d3dbc.c:1516
const struct vkd3d_sm1_opcode_info * opcode_table
Definition: d3dbc.c:1515
bool failed
Definition: d3dbc.c:1519
Definition: parser.c:44
const char * name
Definition: hlsl.h:456
struct list extern_entry
Definition: hlsl.h:468
struct hlsl_type::@5997::@5998 numeric
size_t field_count
Definition: hlsl.h:203
union hlsl_type::@5997 e
struct hlsl_type::@5997::@5999 record
enum hlsl_type_class class
Definition: hlsl.h:163
Definition: parser.c:49
Definition: name.c:39
enum vkd3d_shader_register_type type
Definition: d3dbc.c:1924
enum vkd3d_shader_dst_modifier mod
Definition: d3dbc.c:1925
enum vkd3d_shader_src_modifier mod
Definition: d3dbc.c:1933
enum vkd3d_shader_register_type type
Definition: d3dbc.c:1932
unsigned int flags
Definition: d3dbc.c:1920
struct sm1_instruction::sm1_src_register srcs[4]
enum vkd3d_sm1_opcode opcode
Definition: d3dbc.c:1919
unsigned int src_count
Definition: d3dbc.c:1937
struct sm1_instruction::sm1_dst_register dst
unsigned int has_dst
Definition: d3dbc.c:1939
const void * code
Definition: vkd3d_shader.h:413
struct vkd3d_shader_code source
struct vkd3d_shader_register reg
struct vkd3d_shader_instruction * elements
struct vkd3d_shader_src_param * src
const struct vkd3d_shader_src_param * predicate
struct vkd3d_shader_location location
struct vkd3d_shader_texel_offset texel_offset
enum vkd3d_shader_resource_type resource_type
union vkd3d_shader_instruction::@6020 declaration
enum vkd3d_shader_opcode opcode
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]
struct vkd3d_shader_semantic semantic
struct vkd3d_shader_dst_param * dst
enum vkd3d_shader_resource_type resource_type
enum vkd3d_data_type resource_data_type[VKD3D_VEC4_SIZE]
struct vkd3d_shader_resource resource
enum vkd3d_decl_usage usage
const uint32_t * start
Definition: d3dbc.c:219
struct vkd3d_shader_parser p
Definition: d3dbc.c:222
uint32_t def_mask[VKD3D_BITMAP_SIZE(MAX_CONSTANT_COUNT)]
Definition: d3dbc.c:227
const uint32_t * end
Definition: d3dbc.c:219
const struct vkd3d_sm1_opcode_info * opcode_table
Definition: d3dbc.c:218
const uint32_t * ptr
Definition: d3dbc.c:219
struct vkd3d_shader_sm1_parser::@5991 constants[3]
struct vkd3d_shader_register reg
enum vkd3d_shader_src_modifier modifiers
unsigned int minor
Definition: d3dbc.c:212
enum vkd3d_shader_opcode vkd3d_opcode
Definition: d3dbc.c:209
unsigned int src_count
Definition: d3dbc.c:208
enum vkd3d_sm1_opcode sm1_opcode
Definition: d3dbc.c:206
unsigned int major
Definition: d3dbc.c:212
struct vkd3d_sm1_opcode_info::@5990 min_version
struct vkd3d_sm1_opcode_info::@5990 max_version
unsigned int dst_count
Definition: d3dbc.c:207
#define max(a, b)
Definition: svc.c:63
#define LIST_INIT(head)
Definition: queue.h:197
static bool bitmap_is_set(const uint32_t *map, unsigned int idx)
Definition: vkd3d_common.h:408
static uint16_t vkd3d_make_u16(uint8_t low, uint8_t high)
Definition: vkd3d_common.h:376
static uint32_t vkd3d_make_u32(uint16_t low, uint16_t high)
Definition: vkd3d_common.h:381
#define TAG_TEXT
Definition: vkd3d_common.h:86
#define VKD3D_MAKE_TAG(ch0, ch1, ch2, ch3)
Definition: vkd3d_common.h:57
#define vkd3d_unreachable()
Definition: vkd3d_common.h:119
#define VKD3D_BITMAP_SIZE(x)
Definition: vkd3d_common.h:396
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
static int ascii_strcasecmp(const char *a, const char *b)
Definition: vkd3d_common.h:437
static char * vkd3d_strdup(const char *string)
Definition: vkd3d_memory.h:57
static void vkd3d_free(void *ptr)
Definition: vkd3d_memory.h:52
bool vkd3d_array_reserve(void **elements, size_t *capacity, size_t element_count, size_t element_size)
Definition: memory.c:22
vkd3d_shader_d3dbc_constant_register
Definition: vkd3d_shader.h:913
@ VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER
Definition: vkd3d_shader.h:919
@ VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER
Definition: vkd3d_shader.h:915
@ VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER
Definition: vkd3d_shader.h:917
static uint32_t vkd3d_shader_create_swizzle(enum vkd3d_shader_swizzle_component x, enum vkd3d_shader_swizzle_component y, enum vkd3d_shader_swizzle_component z, enum vkd3d_shader_swizzle_component w)
VKD3D_SHADER_API const char * vkd3d_shader_get_version(unsigned int *major, unsigned int *minor)
vkd3d_shader_sysval_semantic
@ VKD3D_SHADER_SV_DEPTH
@ VKD3D_SHADER_SV_TARGET
@ VKD3D_SHADER_SV_NONE
@ VKD3D_SHADER_SV_IS_FRONT_FACE
@ VKD3D_SHADER_SV_POSITION
@ VKD3D_SHADER_COMPONENT_FLOAT
vkd3d_shader_resource_type
@ VKD3D_SHADER_RESOURCE_NONE
@ VKD3D_SHADER_RESOURCE_TEXTURE_3D
@ VKD3D_SHADER_RESOURCE_TEXTURE_CUBE
@ VKD3D_SHADER_RESOURCE_TEXTURE_1D
@ VKD3D_SHADER_RESOURCE_TEXTURE_2D
#define VKD3D_SHADER_NO_SWIZZLE
size_t bytecode_reserve_bytes(struct vkd3d_bytecode_buffer *buffer, size_t size)
size_t bytecode_align(struct vkd3d_bytecode_buffer *buffer)
void set_u32(struct vkd3d_bytecode_buffer *buffer, size_t offset, uint32_t value)
void vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser, struct vsir_program *program, struct vkd3d_shader_message_context *message_context, const char *source_name)
bool shader_instruction_array_reserve(struct vkd3d_shader_instruction_array *instructions, unsigned int reserve)
size_t bytecode_put_bytes(struct vkd3d_bytecode_buffer *buffer, const void *bytes, size_t size)
vkd3d_shader_src_modifier
@ VKD3DSPSM_NONE
static bool vkd3d_shader_ver_ge(const struct vkd3d_shader_version *v, unsigned int major, unsigned int minor)
vkd3d_shader_type
@ VKD3D_SHADER_TYPE_VERTEX
@ VKD3D_SHADER_TYPE_PIXEL
@ VKD3DSIM_LINEAR
static struct vkd3d_shader_dst_param * vsir_program_get_dst_params(struct vsir_program *program, unsigned int count)
#define VKD3DSP_WRITEMASK_3
vkd3d_shader_register_type
@ VKD3DSPR_IMMCONST
@ VKD3DSPR_CONSTBOOL
@ VKD3DSPR_CONST4
@ VKD3DSPR_RASTOUT
@ VKD3DSPR_COLOROUT
@ VKD3DSPR_MISCTYPE
@ VKD3DSPR_DEPTHOUT
@ VKD3DSPR_CONSTINT
@ VKD3DSPR_CONST
@ VKD3DSPR_TEMP
@ VKD3DSPR_COMBINED_SAMPLER
@ VKD3DSPR_CONST2
@ VKD3DSPR_CONST3
@ VKD3DSPR_ADDR
@ VKD3DSPR_OUTPUT
@ VKD3DSPR_SAMPLER
@ VKD3DSPR_TEXCRDOUT
@ VKD3DSPR_TEXTURE
@ VKD3DSPR_ATTROUT
@ VKD3DSPR_INPUT
vkd3d_shader_error
@ VKD3D_SHADER_ERROR_D3DBC_UNDECLARED_SEMANTIC
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_OPCODE
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_WRITEMASK
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_REGISTER_COUNT
@ VKD3D_SHADER_ERROR_D3DBC_UNEXPECTED_EOF
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_REGISTER_TYPE
@ VKD3D_SHADER_WARNING_D3DBC_IGNORED_INSTRUCTION_FLAGS
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_REGISTER_INDEX
@ VKD3D_SHADER_ERROR_D3DBC_OUT_OF_MEMORY
@ VKD3D_SHADER_ERROR_D3DBC_NOT_IMPLEMENTED
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_PROFILE
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_RESOURCE_TYPE
@ VKD3D_SHADER_ERROR_D3DBC_INVALID_VERSION_TOKEN
#define VKD3DSP_WRITEMASK_ALL
@ VSIR_DIMENSION_SCALAR
@ VSIR_DIMENSION_VEC4
@ VSIR_DIMENSION_NONE
@ VKD3D_DATA_INT
@ VKD3D_DATA_UINT
@ VKD3D_DATA_FLOAT
@ VSIR_NOT_NORMALISED
static struct vkd3d_shader_src_param * vsir_program_get_src_params(struct vsir_program *program, unsigned int count)
@ VSIR_RASTOUT_POINT_SIZE
@ VSIR_RASTOUT_FOG
@ VSIR_RASTOUT_POSITION
static unsigned int vsir_swizzle_get_component(uint32_t swizzle, unsigned int idx)
vkd3d_shader_opcode
@ VKD3DSIH_NOP
@ VKD3DSIH_TEXM3x3SPEC
@ VKD3DSIH_SETP
@ VKD3DSIH_TEXREG2RGB
@ VKD3DSIH_TEXDP3TEX
@ VKD3DSIH_SGE
@ VKD3DSIH_TEX
@ VKD3DSIH_M3x4
@ VKD3DSIH_TEXM3x3PAD
@ VKD3DSIH_CRS
@ VKD3DSIH_LOOP
@ VKD3DSIH_TEXDP3
@ VKD3DSIH_TEXREG2AR
@ VKD3DSIH_NRM
@ VKD3DSIH_TEXM3x3DIFF
@ VKD3DSIH_CND
@ VKD3DSIH_M4x3
@ VKD3DSIH_TEXM3x2PAD
@ VKD3DSIH_DP4
@ VKD3DSIH_LIT
@ VKD3DSIH_SUB
@ VKD3DSIH_TEXKILL
@ VKD3DSIH_ENDREP
@ VKD3DSIH_TEXCOORD
@ VKD3DSIH_BEM
@ VKD3DSIH_LOGP
@ VKD3DSIH_TEXREG2GB
@ VKD3DSIH_MUL
@ VKD3DSIH_BREAK
@ VKD3DSIH_CALL
@ VKD3DSIH_EXP
@ VKD3DSIH_TEXBEM
@ VKD3DSIH_IFC
@ VKD3DSIH_MIN
@ VKD3DSIH_BREAKC
@ VKD3DSIH_RCP
@ VKD3DSIH_INVALID
@ VKD3DSIH_IF
@ VKD3DSIH_TEXM3x2TEX
@ VKD3DSIH_M4x4
@ VKD3DSIH_RSQ
@ VKD3DSIH_ENDIF
@ VKD3DSIH_REP
@ VKD3DSIH_SLT
@ VKD3DSIH_LOG
@ VKD3DSIH_TEXLDD
@ VKD3DSIH_TEXM3x2DEPTH
@ VKD3DSIH_SGN
@ VKD3DSIH_TEXM3x3VSPEC
@ VKD3DSIH_DEFB
@ VKD3DSIH_MAD
@ VKD3DSIH_TEXDEPTH
@ VKD3DSIH_CALLNZ
@ VKD3DSIH_ADD
@ VKD3DSIH_DEF
@ VKD3DSIH_TEXBEML
@ VKD3DSIH_DEFI
@ VKD3DSIH_MOVA
@ VKD3DSIH_DSY
@ VKD3DSIH_MOV
@ VKD3DSIH_MAX
@ VKD3DSIH_DST
@ VKD3DSIH_EXPP
@ VKD3DSIH_TEXLDL
@ VKD3DSIH_PHASE
@ VKD3DSIH_CMP
@ VKD3DSIH_M3x2
@ VKD3DSIH_POW
@ VKD3DSIH_ENDLOOP
@ VKD3DSIH_DCL
@ VKD3DSIH_TEXM3x3
@ VKD3DSIH_FRC
@ VKD3DSIH_TEXM3x3TEX
@ VKD3DSIH_ELSE
@ VKD3DSIH_LABEL
@ VKD3DSIH_BREAKP
@ VKD3DSIH_DP2ADD
@ VKD3DSIH_SINCOS
@ VKD3DSIH_LRP
@ VKD3DSIH_RET
@ VKD3DSIH_DP3
@ VKD3DSIH_DSX
@ VKD3DSIH_ABS
@ VKD3DSIH_M3x3
#define SM1_COLOR_REGISTER_OFFSET
@ VKD3D_SHADER_REGISTER_PRECISION_DEFAULT
static size_t put_string(struct vkd3d_bytecode_buffer *buffer, const char *string)
@ VKD3D_DECL_USAGE_SAMPLE
@ VKD3D_DECL_USAGE_BLEND_WEIGHT
@ VKD3D_DECL_USAGE_BINORMAL
@ VKD3D_DECL_USAGE_TEXCOORD
@ VKD3D_DECL_USAGE_BLEND_INDICES
@ VKD3D_DECL_USAGE_TANGENT
@ VKD3D_DECL_USAGE_COLOR
@ VKD3D_DECL_USAGE_POSITION
@ VKD3D_DECL_USAGE_PSIZE
@ VKD3D_DECL_USAGE_TESS_FACTOR
@ VKD3D_DECL_USAGE_NORMAL
@ VKD3D_DECL_USAGE_DEPTH
@ VKD3D_DECL_USAGE_FOG
@ VKD3D_DECL_USAGE_POSITIONT
static size_t put_f32(struct vkd3d_bytecode_buffer *buffer, float value)
void vkd3d_shader_parser_error(struct vkd3d_shader_parser *parser, enum vkd3d_shader_error error, const char *format,...) VKD3D_PRINTF_FUNC(3
vkd3d_shader_dst_modifier
@ VKD3DSPDM_NONE
void vkd3d_shader_parser_warning(struct vkd3d_shader_parser *parser, enum vkd3d_shader_error error, const char *format,...) VKD3D_PRINTF_FUNC(3
#define VKD3DSP_WRITEMASK_0
#define SM1_RASTOUT_REGISTER_OFFSET
#define VKD3DSP_WRITEMASK_1
@ VSIR_CF_STRUCTURED
#define VKD3DSP_WRITEMASK_2
static bool vkd3d_shader_ver_le(const struct vkd3d_shader_version *v, unsigned int major, unsigned int minor)
vkd3d_result
Definition: vkd3d_types.h:41
@ VKD3D_ERROR_INVALID_SHADER
Definition: vkd3d_types.h:53
@ VKD3D_OK
Definition: vkd3d_types.h:43
@ VKD3D_ERROR_OUT_OF_MEMORY
Definition: vkd3d_types.h:49
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383