ReactOS 0.4.17-dev-966-gf06eace
shader_sm4.c
Go to the documentation of this file.
1/*
2 * Copyright 2009 Henri Verbeet for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "wined3d_private.h"
20#define LIBVKD3D_SHADER_SOURCE
21#include <vkd3d_shader.h>
22
25
26#define WINED3D_SM4_INSTRUCTION_MODIFIER (0x1u << 31)
27
28#define WINED3D_SM4_MODIFIER_MASK 0x3fu
29
30#define WINED3D_SM5_MODIFIER_DATA_TYPE_SHIFT 6
31#define WINED3D_SM5_MODIFIER_DATA_TYPE_MASK (0xffffu << WINED3D_SM5_MODIFIER_DATA_TYPE_SHIFT)
32
33#define WINED3D_SM5_MODIFIER_RESOURCE_TYPE_SHIFT 6
34#define WINED3D_SM5_MODIFIER_RESOURCE_TYPE_MASK (0xfu << WINED3D_SM5_MODIFIER_RESOURCE_TYPE_SHIFT)
35
36#define WINED3D_SM4_AOFFIMMI_U_SHIFT 9
37#define WINED3D_SM4_AOFFIMMI_U_MASK (0xfu << WINED3D_SM4_AOFFIMMI_U_SHIFT)
38#define WINED3D_SM4_AOFFIMMI_V_SHIFT 13
39#define WINED3D_SM4_AOFFIMMI_V_MASK (0xfu << WINED3D_SM4_AOFFIMMI_V_SHIFT)
40#define WINED3D_SM4_AOFFIMMI_W_SHIFT 17
41#define WINED3D_SM4_AOFFIMMI_W_MASK (0xfu << WINED3D_SM4_AOFFIMMI_W_SHIFT)
42
43#define WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT 24
44#define WINED3D_SM4_INSTRUCTION_LENGTH_MASK (0x1fu << WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT)
45
46#define WINED3D_SM4_INSTRUCTION_FLAGS_SHIFT 11
47#define WINED3D_SM4_INSTRUCTION_FLAGS_MASK (0x7u << WINED3D_SM4_INSTRUCTION_FLAGS_SHIFT)
48
49#define WINED3D_SM4_RESOURCE_TYPE_SHIFT 11
50#define WINED3D_SM4_RESOURCE_TYPE_MASK (0xfu << WINED3D_SM4_RESOURCE_TYPE_SHIFT)
51
52#define WINED3D_SM4_RESOURCE_SAMPLE_COUNT_SHIFT 16
53#define WINED3D_SM4_RESOURCE_SAMPLE_COUNT_MASK (0xfu << WINED3D_SM4_RESOURCE_SAMPLE_COUNT_SHIFT)
54
55#define WINED3D_SM4_PRIMITIVE_TYPE_SHIFT 11
56#define WINED3D_SM4_PRIMITIVE_TYPE_MASK (0x3fu << WINED3D_SM4_PRIMITIVE_TYPE_SHIFT)
57
58#define WINED3D_SM4_INDEX_TYPE_SHIFT 11
59#define WINED3D_SM4_INDEX_TYPE_MASK (0x1u << WINED3D_SM4_INDEX_TYPE_SHIFT)
60
61#define WINED3D_SM4_SAMPLER_MODE_SHIFT 11
62#define WINED3D_SM4_SAMPLER_MODE_MASK (0xfu << WINED3D_SM4_SAMPLER_MODE_SHIFT)
63
64#define WINED3D_SM4_SHADER_DATA_TYPE_SHIFT 11
65#define WINED3D_SM4_SHADER_DATA_TYPE_MASK (0xfu << WINED3D_SM4_SHADER_DATA_TYPE_SHIFT)
66
67#define WINED3D_SM4_INTERPOLATION_MODE_SHIFT 11
68#define WINED3D_SM4_INTERPOLATION_MODE_MASK (0xfu << WINED3D_SM4_INTERPOLATION_MODE_SHIFT)
69
70#define WINED3D_SM4_GLOBAL_FLAGS_SHIFT 11
71#define WINED3D_SM4_GLOBAL_FLAGS_MASK (0xffu << WINED3D_SM4_GLOBAL_FLAGS_SHIFT)
72
73#define WINED3D_SM5_PRECISE_SHIFT 19
74#define WINED3D_SM5_PRECISE_MASK (0xfu << WINED3D_SM5_PRECISE_SHIFT)
75
76#define WINED3D_SM5_CONTROL_POINT_COUNT_SHIFT 11
77#define WINED3D_SM5_CONTROL_POINT_COUNT_MASK (0xffu << WINED3D_SM5_CONTROL_POINT_COUNT_SHIFT)
78
79#define WINED3D_SM5_FP_ARRAY_SIZE_SHIFT 16
80#define WINED3D_SM5_FP_TABLE_COUNT_MASK 0xffffu
81
82#define WINED3D_SM5_UAV_FLAGS_SHIFT 15
83#define WINED3D_SM5_UAV_FLAGS_MASK (0x1ffu << WINED3D_SM5_UAV_FLAGS_SHIFT)
84
85#define WINED3D_SM5_SYNC_FLAGS_SHIFT 11
86#define WINED3D_SM5_SYNC_FLAGS_MASK (0xffu << WINED3D_SM5_SYNC_FLAGS_SHIFT)
87
88#define WINED3D_SM5_TESSELLATOR_SHIFT 11
89#define WINED3D_SM5_TESSELLATOR_MASK (0xfu << WINED3D_SM5_TESSELLATOR_SHIFT)
90
91#define WINED3D_SM4_OPCODE_MASK 0xff
92
93#define WINED3D_SM4_REGISTER_MODIFIER (0x1u << 31)
94
95#define WINED3D_SM4_ADDRESSING_SHIFT1 25
96#define WINED3D_SM4_ADDRESSING_MASK1 (0x3u << WINED3D_SM4_ADDRESSING_SHIFT1)
97
98#define WINED3D_SM4_ADDRESSING_SHIFT0 22
99#define WINED3D_SM4_ADDRESSING_MASK0 (0x3u << WINED3D_SM4_ADDRESSING_SHIFT0)
100
101#define WINED3D_SM4_REGISTER_ORDER_SHIFT 20
102#define WINED3D_SM4_REGISTER_ORDER_MASK (0x3u << WINED3D_SM4_REGISTER_ORDER_SHIFT)
103
104#define WINED3D_SM4_REGISTER_TYPE_SHIFT 12
105#define WINED3D_SM4_REGISTER_TYPE_MASK (0xffu << WINED3D_SM4_REGISTER_TYPE_SHIFT)
106
107#define WINED3D_SM4_SWIZZLE_TYPE_SHIFT 2
108#define WINED3D_SM4_SWIZZLE_TYPE_MASK (0x3u << WINED3D_SM4_SWIZZLE_TYPE_SHIFT)
109
110#define WINED3D_SM4_DIMENSION_SHIFT 0
111#define WINED3D_SM4_DIMENSION_MASK (0x3u << WINED3D_SM4_DIMENSION_SHIFT)
112
113#define WINED3D_SM4_WRITEMASK_SHIFT 4
114#define WINED3D_SM4_WRITEMASK_MASK (0xfu << WINED3D_SM4_WRITEMASK_SHIFT)
115
116#define WINED3D_SM4_SWIZZLE_SHIFT 4
117#define WINED3D_SM4_SWIZZLE_MASK (0xffu << WINED3D_SM4_SWIZZLE_SHIFT)
118
119#define WINED3D_SM4_VERSION_MAJOR(version) (((version) >> 4) & 0xf)
120#define WINED3D_SM4_VERSION_MINOR(version) (((version) >> 0) & 0xf)
121
122#define WINED3D_SM4_ADDRESSING_RELATIVE 0x2
123#define WINED3D_SM4_ADDRESSING_OFFSET 0x1
124
125#define WINED3D_SM4_INSTRUCTION_FLAG_SATURATE 0x4
126
127#define WINED3D_SM4_CONDITIONAL_NZ (0x1u << 18)
128
130{
315};
316
318{
322};
323
325{
361};
362
364{
368};
369
371{
409};
410
412{
416};
417
419{
422};
423
425{
436};
437
439{
445};
446
448{
451};
452
454{
457};
458
460{
461 struct list entry;
463};
464
466{
468 const DWORD *start, *end;
469
471
475 struct list src;
477};
478
480{
483 const char *dst_info;
484 const char *src_info;
486 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
487 struct wined3d_sm4_data *priv);
488};
489
491{
492 /* UNKNOWN */ WINED3D_PT_UNDEFINED,
493 /* WINED3D_SM4_OUTPUT_PT_POINTLIST */ WINED3D_PT_POINTLIST,
494 /* UNKNOWN */ WINED3D_PT_UNDEFINED,
495 /* WINED3D_SM4_OUTPUT_PT_LINESTRIP */ WINED3D_PT_LINESTRIP,
496 /* UNKNOWN */ WINED3D_PT_UNDEFINED,
497 /* WINED3D_SM4_OUTPUT_PT_TRIANGLESTRIP */ WINED3D_PT_TRIANGLESTRIP,
498};
499
501{
502 /* UNKNOWN */ WINED3D_PT_UNDEFINED,
503 /* WINED3D_SM4_INPUT_PT_POINT */ WINED3D_PT_POINTLIST,
504 /* WINED3D_SM4_INPUT_PT_LINE */ WINED3D_PT_LINELIST,
505 /* WINED3D_SM4_INPUT_PT_TRIANGLE */ WINED3D_PT_TRIANGLELIST,
506 /* UNKNOWN */ WINED3D_PT_UNDEFINED,
507 /* UNKNOWN */ WINED3D_PT_UNDEFINED,
508 /* WINED3D_SM4_INPUT_PT_LINEADJ */ WINED3D_PT_LINELIST_ADJ,
509 /* WINED3D_SM4_INPUT_PT_TRIANGLEADJ */ WINED3D_PT_TRIANGLELIST_ADJ,
510};
511
513{
515 /* WINED3D_SM4_RESOURCE_BUFFER */ WINED3D_SHADER_RESOURCE_BUFFER,
516 /* WINED3D_SM4_RESOURCE_TEXTURE_1D */ WINED3D_SHADER_RESOURCE_TEXTURE_1D,
517 /* WINED3D_SM4_RESOURCE_TEXTURE_2D */ WINED3D_SHADER_RESOURCE_TEXTURE_2D,
518 /* WINED3D_SM4_RESOURCE_TEXTURE_2DMS */ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS,
519 /* WINED3D_SM4_RESOURCE_TEXTURE_3D */ WINED3D_SHADER_RESOURCE_TEXTURE_3D,
520 /* WINED3D_SM4_RESOURCE_TEXTURE_CUBE */ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE,
521 /* WINED3D_SM4_RESOURCE_TEXTURE_1DARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY,
522 /* WINED3D_SM4_RESOURCE_TEXTURE_2DARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY,
523 /* WINED3D_SM4_RESOURCE_TEXTURE_2DMSARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY,
524 /* WINED3D_SM4_RESOURCE_TEXTURE_CUBEARRAY */ WINED3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY,
525};
526
528{
529 /* 0 */ WINED3D_DATA_FLOAT,
530 /* WINED3D_SM4_DATA_UNORM */ WINED3D_DATA_UNORM,
531 /* WINED3D_SM4_DATA_SNORM */ WINED3D_DATA_SNORM,
532 /* WINED3D_SM4_DATA_INT */ WINED3D_DATA_INT,
533 /* WINED3D_SM4_DATA_UINT */ WINED3D_DATA_UINT,
534 /* WINED3D_SM4_DATA_FLOAT */ WINED3D_DATA_FLOAT,
535};
536
537static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
539static BOOL shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
541
543 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
544 struct wined3d_sm4_data *priv)
545{
546 shader_sm4_read_src_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_UINT, &priv->src_param[0]);
547 ins->flags = (opcode_token & WINED3D_SM4_CONDITIONAL_NZ) ?
549}
550
552 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
553 struct wined3d_sm4_data *priv)
554{
556 unsigned int icb_size;
557
560 {
561 FIXME("Ignoring shader data type %#x.\n", type);
563 return;
564 }
565
566 ++tokens;
567 icb_size = token_count - 1;
568 if (icb_size % 4 || icb_size > MAX_IMMEDIATE_CONSTANT_BUFFER_SIZE)
569 {
570 FIXME("Unexpected immediate constant buffer size %u.\n", icb_size);
572 return;
573 }
574
575 priv->icb.vec4_count = icb_size / 4;
576 memcpy(priv->icb.data, tokens, sizeof(*tokens) * icb_size);
577 ins->declaration.icb = &priv->icb;
578}
579
581 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
582 struct wined3d_sm4_data *priv)
583{
584 enum wined3d_sm4_resource_type resource_type;
586 enum wined3d_data_type reg_data_type;
588
589 resource_type = (opcode_token & WINED3D_SM4_RESOURCE_TYPE_MASK) >> WINED3D_SM4_RESOURCE_TYPE_SHIFT;
590 if (!resource_type || (resource_type >= ARRAY_SIZE(resource_type_table)))
591 {
592 FIXME("Unhandled resource type %#x.\n", resource_type);
594 }
595 else
596 {
597 ins->declaration.semantic.resource_type = resource_type_table[resource_type];
598 }
599
602 {
604 }
605
607 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], reg_data_type, &ins->declaration.semantic.reg);
608
609 components = *tokens++;
610 if ((components & 0xfff0) != (components & 0xf) * 0x1110)
611 FIXME("Components (%#x) have different data types.\n", components);
612 data_type = components & 0xf;
613
615 {
616 FIXME("Unhandled data type %#x.\n", data_type);
617 ins->declaration.semantic.resource_data_type = WINED3D_DATA_FLOAT;
618 }
619 else
620 {
621 ins->declaration.semantic.resource_data_type = data_type_table[data_type];
622 }
623
624 if (reg_data_type == WINED3D_DATA_UAV)
626}
627
629 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
630 struct wined3d_sm4_data *priv)
631{
632 shader_sm4_read_src_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT, &ins->declaration.src);
633 if (opcode_token & WINED3D_SM4_INDEX_TYPE_MASK)
635}
636
638 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
639 struct wined3d_sm4_data *priv)
640{
643 FIXME("Unhandled sampler mode %#x.\n", ins->flags);
644 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_SAMPLER, &ins->declaration.dst);
645}
646
648 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
649 struct wined3d_sm4_data *priv)
650{
651 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_OPAQUE,
652 &ins->declaration.index_range.first_register);
653 ins->declaration.index_range.last_register = *tokens;
654}
655
657 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
658 struct wined3d_sm4_data *priv)
659{
660 enum wined3d_sm4_output_primitive_type primitive_type;
661
662 primitive_type = (opcode_token & WINED3D_SM4_PRIMITIVE_TYPE_MASK) >> WINED3D_SM4_PRIMITIVE_TYPE_SHIFT;
663 if (primitive_type >= ARRAY_SIZE(output_primitive_type_table))
665 else
666 ins->declaration.primitive_type.type = output_primitive_type_table[primitive_type];
667
669 FIXME("Unhandled output primitive type %#x.\n", primitive_type);
670}
671
673 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
674 struct wined3d_sm4_data *priv)
675{
676 enum wined3d_sm4_input_primitive_type primitive_type;
677
678 primitive_type = (opcode_token & WINED3D_SM4_PRIMITIVE_TYPE_MASK) >> WINED3D_SM4_PRIMITIVE_TYPE_SHIFT;
679 if (WINED3D_SM5_INPUT_PT_PATCH1 <= primitive_type && primitive_type <= WINED3D_SM5_INPUT_PT_PATCH32)
680 {
682 ins->declaration.primitive_type.patch_vertex_count = primitive_type - WINED3D_SM5_INPUT_PT_PATCH1 + 1;
683 }
684 else if (primitive_type >= ARRAY_SIZE(input_primitive_type_table))
685 {
687 }
688 else
689 {
690 ins->declaration.primitive_type.type = input_primitive_type_table[primitive_type];
691 }
692
694 FIXME("Unhandled input primitive type %#x.\n", primitive_type);
695}
696
698 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
699 struct wined3d_sm4_data *priv)
700{
701 ins->declaration.count = *tokens;
702}
703
705 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
706 struct wined3d_sm4_data *priv)
707{
708 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT, &ins->declaration.dst);
709}
710
712 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
713 struct wined3d_sm4_data *priv)
714{
715 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT,
717 ins->declaration.register_semantic.sysval_semantic = *tokens;
718}
719
721 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
722 struct wined3d_sm4_data *priv)
723{
725 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT, &ins->declaration.dst);
726}
727
729 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
730 struct wined3d_sm4_data *priv)
731{
733 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT,
735 ins->declaration.register_semantic.sysval_semantic = *tokens;
736}
737
739 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
740 struct wined3d_sm4_data *priv)
741{
742 ins->declaration.indexable_temp.register_idx = *tokens++;
743 ins->declaration.indexable_temp.register_size = *tokens++;
744 ins->declaration.indexable_temp.component_count = *tokens;
745}
746
748 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
749 struct wined3d_sm4_data *priv)
750{
752}
753
755 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
756 struct wined3d_sm4_data *priv)
757{
758 priv->src_param[0].reg.u.fp_body_idx = *tokens++;
759 shader_sm4_read_src_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_OPAQUE, &priv->src_param[0]);
760}
761
763 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
764 struct wined3d_sm4_data *priv)
765{
766 ins->declaration.index = *tokens;
767}
768
770 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
771 struct wined3d_sm4_data *priv)
772{
773 ins->declaration.index = *tokens++;
774 FIXME("Ignoring set of function bodies (count %lu).\n", *tokens);
775}
776
778 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
779 struct wined3d_sm4_data *priv)
780{
781 ins->declaration.fp.index = *tokens++;
782 ins->declaration.fp.body_count = *tokens++;
783 ins->declaration.fp.array_size = *tokens >> WINED3D_SM5_FP_ARRAY_SIZE_SHIFT;
784 ins->declaration.fp.table_count = *tokens++ & WINED3D_SM5_FP_TABLE_COUNT_MASK;
785 FIXME("Ignoring set of function tables (count %u).\n", ins->declaration.fp.table_count);
786}
787
789 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
790 struct wined3d_sm4_data *priv)
791{
794}
795
797 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
798 struct wined3d_sm4_data *priv)
799{
802}
803
805 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
806 struct wined3d_sm4_data *priv)
807{
810}
811
813 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
814 struct wined3d_sm4_data *priv)
815{
818}
819
821 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
822 struct wined3d_sm4_data *priv)
823{
824 ins->declaration.max_tessellation_factor = *(float *)tokens;
825}
826
828 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
829 struct wined3d_sm4_data *priv)
830{
831 ins->declaration.thread_group_size.x = *tokens++;
832 ins->declaration.thread_group_size.y = *tokens++;
833 ins->declaration.thread_group_size.z = *tokens++;
834}
835
837 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
838 struct wined3d_sm4_data *priv)
839{
840 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_UAV, &ins->declaration.dst);
842}
843
845 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
846 struct wined3d_sm4_data *priv)
847{
848 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_UAV,
851 ins->declaration.structured_resource.byte_stride = *tokens;
852 if (ins->declaration.structured_resource.byte_stride % 4)
853 FIXME("Byte stride %u is not multiple of 4.\n", ins->declaration.structured_resource.byte_stride);
854}
855
857 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
858 struct wined3d_sm4_data *priv)
859{
860 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT, &ins->declaration.tgsm_raw.reg);
861 ins->declaration.tgsm_raw.byte_count = *tokens;
862 if (ins->declaration.tgsm_raw.byte_count % 4)
863 FIXME("Byte count %u is not multiple of 4.\n", ins->declaration.tgsm_raw.byte_count);
864}
865
867 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
868 struct wined3d_sm4_data *priv)
869{
870 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_FLOAT,
871 &ins->declaration.tgsm_structured.reg);
872 ins->declaration.tgsm_structured.byte_stride = *tokens++;
873 ins->declaration.tgsm_structured.structure_count = *tokens;
874 if (ins->declaration.tgsm_structured.byte_stride % 4)
875 FIXME("Byte stride %u is not multiple of 4.\n", ins->declaration.tgsm_structured.byte_stride);
876}
877
879 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
880 struct wined3d_sm4_data *priv)
881{
882 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_RESOURCE,
884 ins->declaration.structured_resource.byte_stride = *tokens;
885 if (ins->declaration.structured_resource.byte_stride % 4)
886 FIXME("Byte stride %u is not multiple of 4.\n", ins->declaration.structured_resource.byte_stride);
887}
888
890 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
891 struct wined3d_sm4_data *priv)
892{
893 shader_sm4_read_dst_param(priv, &tokens, &tokens[token_count], WINED3D_DATA_RESOURCE, &ins->declaration.dst);
894}
895
897 DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count,
898 struct wined3d_sm4_data *priv)
899{
901}
902
903/*
904 * f -> WINED3D_DATA_FLOAT
905 * i -> WINED3D_DATA_INT
906 * u -> WINED3D_DATA_UINT
907 * O -> WINED3D_DATA_OPAQUE
908 * R -> WINED3D_DATA_RESOURCE
909 * S -> WINED3D_DATA_SAMPLER
910 * U -> WINED3D_DATA_UAV
911 */
913{
938 {WINED3D_SM4_OP_EQ, WINED3DSIH_EQ, "u", "ff"},
943 {WINED3D_SM4_OP_GE, WINED3DSIH_GE, "u", "ff"},
960 {WINED3D_SM4_OP_LD, WINED3DSIH_LD, "u", "iR"},
964 {WINED3D_SM4_OP_LT, WINED3DSIH_LT, "u", "ff"},
965 {WINED3D_SM4_OP_MAD, WINED3DSIH_MAD, "f", "fff"},
973 {WINED3D_SM4_OP_NE, WINED3DSIH_NE, "u", "ff"},
976 {WINED3D_SM4_OP_OR, WINED3DSIH_OR, "u", "uu"},
1003 {WINED3D_SM4_OP_XOR, WINED3DSIH_XOR, "u", "uu"},
1040 {WINED3D_SM4_OP_LOD, WINED3DSIH_LOD, "f", "fRS"},
1067 {WINED3D_SM5_OP_UBFE, WINED3DSIH_UBFE, "u", "iiu"},
1068 {WINED3D_SM5_OP_IBFE, WINED3DSIH_IBFE, "i", "iii"},
1069 {WINED3D_SM5_OP_BFI, WINED3DSIH_BFI, "u", "iiuu"},
1071 {WINED3D_SM5_OP_SWAPC, WINED3DSIH_SWAPC, "ff", "uff"},
1144};
1145
1147{
1148 /* WINED3D_SM4_RT_TEMP */ WINED3DSPR_TEMP,
1149 /* WINED3D_SM4_RT_INPUT */ WINED3DSPR_INPUT,
1150 /* WINED3D_SM4_RT_OUTPUT */ WINED3DSPR_OUTPUT,
1151 /* WINED3D_SM4_RT_INDEXABLE_TEMP */ WINED3DSPR_IDXTEMP,
1152 /* WINED3D_SM4_RT_IMMCONST */ WINED3DSPR_IMMCONST,
1153 /* UNKNOWN */ ~0u,
1154 /* WINED3D_SM4_RT_SAMPLER */ WINED3DSPR_SAMPLER,
1155 /* WINED3D_SM4_RT_RESOURCE */ WINED3DSPR_RESOURCE,
1156 /* WINED3D_SM4_RT_CONSTBUFFER */ WINED3DSPR_CONSTBUFFER,
1157 /* WINED3D_SM4_RT_IMMCONSTBUFFER */ WINED3DSPR_IMMCONSTBUFFER,
1158 /* UNKNOWN */ ~0u,
1159 /* WINED3D_SM4_RT_PRIMID */ WINED3DSPR_PRIMID,
1160 /* WINED3D_SM4_RT_DEPTHOUT */ WINED3DSPR_DEPTHOUT,
1161 /* WINED3D_SM4_RT_NULL */ WINED3DSPR_NULL,
1162 /* WINED3D_SM4_RT_RASTERIZER */ WINED3DSPR_RASTERIZER,
1163 /* WINED3D_SM4_RT_OMASK */ WINED3DSPR_SAMPLEMASK,
1164 /* WINED3D_SM5_RT_STREAM */ WINED3DSPR_STREAM,
1165 /* WINED3D_SM5_RT_FUNCTION_BODY */ WINED3DSPR_FUNCTIONBODY,
1166 /* UNKNOWN */ ~0u,
1167 /* WINED3D_SM5_RT_FUNCTION_POINTER */ WINED3DSPR_FUNCTIONPOINTER,
1168 /* UNKNOWN */ ~0u,
1169 /* UNKNOWN */ ~0u,
1170 /* WINED3D_SM5_RT_OUTPUT_CONTROL_POINT_ID */ WINED3DSPR_OUTPOINTID,
1171 /* WINED3D_SM5_RT_FORK_INSTANCE_ID */ WINED3DSPR_FORKINSTID,
1172 /* WINED3D_SM5_RT_JOIN_INSTANCE_ID */ WINED3DSPR_JOININSTID,
1173 /* WINED3D_SM5_RT_INPUT_CONTROL_POINT */ WINED3DSPR_INCONTROLPOINT,
1174 /* WINED3D_SM5_RT_OUTPUT_CONTROL_POINT */ WINED3DSPR_OUTCONTROLPOINT,
1175 /* WINED3D_SM5_RT_PATCH_CONSTANT_DATA */ WINED3DSPR_PATCHCONST,
1176 /* WINED3D_SM5_RT_DOMAIN_LOCATION */ WINED3DSPR_TESSCOORD,
1177 /* UNKNOWN */ ~0u,
1178 /* WINED3D_SM5_RT_UAV */ WINED3DSPR_UAV,
1179 /* WINED3D_SM5_RT_SHARED_MEMORY */ WINED3DSPR_GROUPSHAREDMEM,
1180 /* WINED3D_SM5_RT_THREAD_ID */ WINED3DSPR_THREADID,
1181 /* WINED3D_SM5_RT_THREAD_GROUP_ID */ WINED3DSPR_THREADGROUPID,
1182 /* WINED3D_SM5_RT_LOCAL_THREAD_ID */ WINED3DSPR_LOCALTHREADID,
1183 /* WINED3D_SM5_RT_COVERAGE */ WINED3DSPR_COVERAGE,
1184 /* WINED3D_SM5_RT_LOCAL_THREAD_INDEX */ WINED3DSPR_LOCALTHREADINDEX,
1185 /* WINED3D_SM5_RT_GS_INSTANCE_ID */ WINED3DSPR_GSINSTID,
1186 /* WINED3D_SM5_RT_DEPTHOUT_GREATER_EQUAL */ WINED3DSPR_DEPTHOUTGE,
1187 /* WINED3D_SM5_RT_DEPTHOUT_LESS_EQUAL */ WINED3DSPR_DEPTHOUTLE,
1188 /* UNKNOWN */ ~0u,
1189 /* WINED3D_SM5_RT_OUTPUT_STENCIL_REF */ WINED3DSPR_STENCILREF,
1190};
1191
1193{
1194 unsigned int i;
1195
1196 for (i = 0; i < ARRAY_SIZE(opcode_table); ++i)
1197 {
1198 if (opcode == opcode_table[i].opcode) return &opcode_table[i];
1199 }
1200
1201 return NULL;
1202}
1203
1204static void map_register(const struct wined3d_sm4_data *priv, struct wined3d_shader_register *reg)
1205{
1206 switch (priv->shader_version.type)
1207 {
1209 if (reg->type == WINED3DSPR_OUTPUT)
1210 {
1211 unsigned int reg_idx = reg->idx[0].offset;
1212
1213 if (reg_idx >= ARRAY_SIZE(priv->output_map))
1214 {
1215 ERR("Invalid output index %u.\n", reg_idx);
1216 break;
1217 }
1218
1219 reg->type = WINED3DSPR_COLOROUT;
1220 reg->idx[0].offset = priv->output_map[reg_idx];
1221 }
1222 break;
1223
1224 default:
1225 break;
1226 }
1227}
1228
1230{
1231 switch (t)
1232 {
1233 case 'f':
1234 return WINED3D_DATA_FLOAT;
1235 case 'i':
1236 return WINED3D_DATA_INT;
1237 case 'u':
1238 return WINED3D_DATA_UINT;
1239 case 'O':
1240 return WINED3D_DATA_OPAQUE;
1241 case 'R':
1242 return WINED3D_DATA_RESOURCE;
1243 case 'S':
1244 return WINED3D_DATA_SAMPLER;
1245 case 'U':
1246 return WINED3D_DATA_UAV;
1247 default:
1248 ERR("Invalid data type '%c'.\n", t);
1249 return WINED3D_DATA_FLOAT;
1250 }
1251}
1252
1253static enum wined3d_shader_type wined3d_get_sm4_shader_type(const DWORD *byte_code, size_t byte_code_size)
1254{
1255 unsigned int shader_type;
1256
1257 if (byte_code_size / sizeof(*byte_code) < 1)
1258 {
1259 WARN("Invalid byte code size %lu.\n", (long)byte_code_size);
1261 }
1262
1263 shader_type = byte_code[0] >> 16;
1264 switch (shader_type)
1265 {
1266 case WINED3D_SM4_PS:
1268 break;
1269 case WINED3D_SM4_VS:
1271 break;
1272 case WINED3D_SM4_GS:
1274 break;
1275 case WINED3D_SM5_HS:
1277 break;
1278 case WINED3D_SM5_DS:
1280 break;
1281 case WINED3D_SM5_CS:
1283 break;
1284 default:
1285 FIXME("Unrecognised shader type %#x.\n", shader_type);
1287 }
1288}
1289
1290static void *shader_sm4_init(const DWORD *byte_code, size_t byte_code_size,
1291 const struct wined3d_shader_signature *output_signature)
1292{
1293 unsigned int version_token, token_count;
1294 struct wined3d_sm4_data *priv;
1295 unsigned int i;
1296
1297 if (byte_code_size / sizeof(*byte_code) < 2)
1298 {
1299 WARN("Invalid byte code size %lu.\n", (long)byte_code_size);
1300 return NULL;
1301 }
1302
1303 version_token = byte_code[0];
1304 TRACE("Version: 0x%08x.\n", version_token);
1305 token_count = byte_code[1];
1306 TRACE("Token count: %u.\n", token_count);
1307
1308 if (token_count < 2 || byte_code_size / sizeof(*byte_code) < token_count)
1309 {
1310 WARN("Invalid token count %u.\n", token_count);
1311 return NULL;
1312 }
1313
1314 if (!(priv = malloc(sizeof(*priv))))
1315 {
1316 ERR("Failed to allocate private data\n");
1317 return NULL;
1318 }
1319
1320 priv->start = &byte_code[2];
1321 priv->end = &byte_code[token_count];
1322
1323 priv->shader_version.type = wined3d_get_sm4_shader_type(byte_code, byte_code_size);
1325 {
1326 free(priv);
1327 return NULL;
1328 }
1329
1330 priv->shader_version.major = WINED3D_SM4_VERSION_MAJOR(version_token);
1331 priv->shader_version.minor = WINED3D_SM4_VERSION_MINOR(version_token);
1332
1333 memset(priv->output_map, 0xff, sizeof(priv->output_map));
1334 for (i = 0; i < output_signature->element_count; ++i)
1335 {
1336 struct wined3d_shader_signature_element *e = &output_signature->elements[i];
1337
1339 && stricmp(e->semantic_name, "SV_TARGET"))
1340 continue;
1341 if (e->register_idx >= ARRAY_SIZE(priv->output_map))
1342 {
1343 WARN("Invalid output index %u.\n", e->register_idx);
1344 continue;
1345 }
1346
1347 priv->output_map[e->register_idx] = e->semantic_idx;
1348 }
1349
1350 list_init(&priv->src_free);
1351 list_init(&priv->src);
1352
1353 return priv;
1354}
1355
1356static void shader_sm4_free(void *data)
1357{
1358 struct wined3d_shader_src_param_entry *e1, *e2;
1359 struct wined3d_sm4_data *priv = data;
1360
1361 list_move_head(&priv->src_free, &priv->src);
1363 {
1364 free(e1);
1365 }
1366 free(priv);
1367}
1368
1370{
1372 struct list *elem;
1373
1374 if (!list_empty(&priv->src_free))
1375 {
1376 elem = list_head(&priv->src_free);
1378 }
1379 else
1380 {
1381 if (!(e = malloc(sizeof(*e))))
1382 return NULL;
1383 elem = &e->entry;
1384 }
1385
1386 list_add_tail(&priv->src, elem);
1388 return &e->param;
1389}
1390
1391static void shader_sm4_read_header(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
1392{
1393 struct wined3d_sm4_data *priv = data;
1394
1395 *ptr = priv->start;
1397}
1398
1399static BOOL shader_sm4_read_reg_idx(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
1400 DWORD addressing, struct wined3d_shader_register_index *reg_idx)
1401{
1402 if (addressing & WINED3D_SM4_ADDRESSING_RELATIVE)
1403 {
1404 struct wined3d_shader_src_param *rel_addr = get_src_param(priv);
1405
1406 if (!(reg_idx->rel_addr = rel_addr))
1407 {
1408 ERR("Failed to get src param for relative addressing.\n");
1409 return FALSE;
1410 }
1411
1412 if (addressing & WINED3D_SM4_ADDRESSING_OFFSET)
1413 reg_idx->offset = *(*ptr)++;
1414 else
1415 reg_idx->offset = 0;
1417 }
1418 else
1419 {
1420 reg_idx->rel_addr = NULL;
1421 reg_idx->offset = *(*ptr)++;
1422 }
1423
1424 return TRUE;
1425}
1426
1427static BOOL shader_sm4_read_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
1429 enum wined3d_shader_src_modifier *modifier)
1430{
1431 enum wined3d_sm4_register_type register_type;
1433
1434 if (*ptr >= end)
1435 {
1436 WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
1437 return FALSE;
1438 }
1439 token = *(*ptr)++;
1440
1442 if (register_type >= ARRAY_SIZE(register_type_table)
1443 || register_type_table[register_type] == ~0u)
1444 {
1445 FIXME("Unhandled register type %#x.\n", register_type);
1446 param->type = WINED3DSPR_TEMP;
1447 }
1448 else
1449 {
1450 param->type = register_type_table[register_type];
1451 }
1452 param->data_type = data_type;
1453
1455 {
1456 unsigned int m;
1457
1458 if (*ptr >= end)
1459 {
1460 WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
1461 return FALSE;
1462 }
1463 m = *(*ptr)++;
1464
1465 switch (m)
1466 {
1467 case 0x41:
1468 *modifier = WINED3DSPSM_NEG;
1469 break;
1470
1471 case 0x81:
1472 *modifier = WINED3DSPSM_ABS;
1473 break;
1474
1475 case 0xc1:
1476 *modifier = WINED3DSPSM_ABSNEG;
1477 break;
1478
1479 default:
1480 FIXME("Skipping modifier 0x%08x.\n", m);
1481 case 0x01:
1482 *modifier = WINED3DSPSM_NONE;
1483 break;
1484 }
1485 }
1486 else
1487 {
1488 *modifier = WINED3DSPSM_NONE;
1489 }
1490
1492
1493 if (order < 1)
1494 param->idx[0].offset = ~0U;
1495 else
1496 {
1498 if (!(shader_sm4_read_reg_idx(priv, ptr, end, addressing, &param->idx[0])))
1499 {
1500 ERR("Failed to read register index.\n");
1501 return FALSE;
1502 }
1503 }
1504
1505 if (order < 2)
1506 param->idx[1].offset = ~0U;
1507 else
1508 {
1510 if (!(shader_sm4_read_reg_idx(priv, ptr, end, addressing, &param->idx[1])))
1511 {
1512 ERR("Failed to read register index.\n");
1513 return FALSE;
1514 }
1515 }
1516
1517 if (order > 2)
1518 FIXME("Unhandled order %u.\n", order);
1519
1520 if (register_type == WINED3D_SM4_RT_IMMCONST)
1521 {
1523
1524 switch (dimension)
1525 {
1527 param->immconst_type = WINED3D_IMMCONST_SCALAR;
1528 if (end - *ptr < 1)
1529 {
1530 WARN("Invalid ptr %p, end %p.\n", *ptr, end);
1531 return FALSE;
1532 }
1533 memcpy(param->u.immconst_data, *ptr, 1 * sizeof(DWORD));
1534 *ptr += 1;
1535 break;
1536
1538 param->immconst_type = WINED3D_IMMCONST_VEC4;
1539 if (end - *ptr < 4)
1540 {
1541 WARN("Invalid ptr %p, end %p.\n", *ptr, end);
1542 return FALSE;
1543 }
1544 memcpy(param->u.immconst_data, *ptr, 4 * sizeof(DWORD));
1545 *ptr += 4;
1546 break;
1547
1548 default:
1549 FIXME("Unhandled dimension %#x.\n", dimension);
1550 break;
1551 }
1552 }
1553
1554 map_register(priv, param);
1555
1556 return TRUE;
1557}
1558
1559static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
1561{
1562 DWORD token;
1563
1564 if (*ptr >= end)
1565 {
1566 WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
1567 return FALSE;
1568 }
1569 token = **ptr;
1570
1571 if (!shader_sm4_read_param(priv, ptr, end, data_type, &src_param->reg, &src_param->modifiers))
1572 {
1573 ERR("Failed to read parameter.\n");
1574 return FALSE;
1575 }
1576
1577 if (src_param->reg.type == WINED3DSPR_IMMCONST)
1578 {
1579 src_param->swizzle = WINED3DSP_NOSWIZZLE;
1580 }
1581 else
1582 {
1583 enum wined3d_sm4_swizzle_type swizzle_type =
1585
1586 switch (swizzle_type)
1587 {
1589 src_param->swizzle = WINED3DSP_NOSWIZZLE;
1590 break;
1591
1594 src_param->swizzle = (src_param->swizzle & 0x3) * 0x55;
1595 break;
1596
1599 break;
1600
1601 default:
1602 FIXME("Unhandled swizzle type %#x.\n", swizzle_type);
1603 break;
1604 }
1605 }
1606
1607 return TRUE;
1608}
1609
1610static BOOL shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end,
1612{
1613 enum wined3d_shader_src_modifier modifier;
1614 DWORD token;
1615
1616 if (*ptr >= end)
1617 {
1618 WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
1619 return FALSE;
1620 }
1621 token = **ptr;
1622
1623 if (!shader_sm4_read_param(priv, ptr, end, data_type, &dst_param->reg, &modifier))
1624 {
1625 ERR("Failed to read parameter.\n");
1626 return FALSE;
1627 }
1628
1629 if (modifier != WINED3DSPSM_NONE)
1630 {
1631 ERR("Invalid source modifier %#x on destination register.\n", modifier);
1632 return FALSE;
1633 }
1634
1636 dst_param->modifiers = 0;
1637 dst_param->shift = 0;
1638
1639 return TRUE;
1640}
1641
1643{
1644 enum wined3d_sm4_instruction_modifier modifier_type = modifier & WINED3D_SM4_MODIFIER_MASK;
1645
1646 switch (modifier_type)
1647 {
1649 {
1650 static const DWORD recognized_bits = WINED3D_SM4_INSTRUCTION_MODIFIER
1655
1656 /* Bit fields are used for sign extension. */
1657 struct
1658 {
1659 int u : 4;
1660 int v : 4;
1661 int w : 4;
1662 } aoffimmi;
1663
1664 if (modifier & ~recognized_bits)
1665 FIXME("Unhandled instruction modifier %#x.\n", modifier);
1666
1667 aoffimmi.u = (modifier & WINED3D_SM4_AOFFIMMI_U_MASK) >> WINED3D_SM4_AOFFIMMI_U_SHIFT;
1668 aoffimmi.v = (modifier & WINED3D_SM4_AOFFIMMI_V_MASK) >> WINED3D_SM4_AOFFIMMI_V_SHIFT;
1669 aoffimmi.w = (modifier & WINED3D_SM4_AOFFIMMI_W_MASK) >> WINED3D_SM4_AOFFIMMI_W_SHIFT;
1670 ins->texel_offset.u = aoffimmi.u;
1671 ins->texel_offset.v = aoffimmi.v;
1672 ins->texel_offset.w = aoffimmi.w;
1673 break;
1674 }
1675
1677 {
1680
1681 if ((components & 0xfff0) != (components & 0xf) * 0x1110)
1682 FIXME("Components (%#x) have different data types.\n", components);
1684 break;
1685 }
1686
1688 {
1689 enum wined3d_sm4_resource_type resource_type
1691
1692 ins->resource_type = resource_type_table[resource_type];
1693 break;
1694 }
1695
1696 default:
1697 FIXME("Unhandled instruction modifier %#x.\n", modifier);
1698 }
1699}
1700
1702{
1703 const struct wined3d_sm4_opcode_info *opcode_info;
1704 uint32_t opcode_token, previous_token;
1705 struct wined3d_sm4_data *priv = data;
1706 unsigned int opcode;
1707 unsigned int i, len;
1708 SIZE_T remaining;
1709 const DWORD *p;
1710 DWORD precise;
1711
1712 list_move_head(&priv->src_free, &priv->src);
1713
1714 if (*ptr >= priv->end)
1715 {
1716 WARN("End of byte-code, failed to read opcode.\n");
1717 goto fail;
1718 }
1719 remaining = priv->end - *ptr;
1720
1721 opcode_token = *(*ptr)++;
1722 opcode = opcode_token & WINED3D_SM4_OPCODE_MASK;
1723
1725 if (!len)
1726 {
1727 if (remaining < 2)
1728 {
1729 WARN("End of byte-code, failed to read length token.\n");
1730 goto fail;
1731 }
1732 len = **ptr;
1733 }
1734 if (!len || remaining < len)
1735 {
1736 WARN("Read invalid length %u (remaining %Iu).\n", len, remaining);
1737 goto fail;
1738 }
1739 --len;
1740
1741 if (TRACE_ON(d3d_bytecode))
1742 {
1743 TRACE_(d3d_bytecode)("[ %08x ", opcode_token);
1744 for (i = 0; i < len; ++i)
1745 {
1746 TRACE_(d3d_bytecode)("%08lx ", (*ptr)[i]);
1747 }
1748 TRACE_(d3d_bytecode)("]\n");
1749 }
1750
1751 if (!(opcode_info = get_opcode_info(opcode)))
1752 {
1753 FIXME("Unrecognized opcode %#x, opcode_token 0x%08x.\n", opcode, opcode_token);
1755 *ptr += len;
1756 return;
1757 }
1758
1759 ins->handler_idx = opcode_info->handler_idx;
1760 ins->flags = 0;
1761 ins->coissue = 0;
1762 ins->predicate = NULL;
1763 ins->dst_count = strlen(opcode_info->dst_info);
1764 ins->dst = priv->dst_param;
1765 ins->src_count = strlen(opcode_info->src_info);
1766 ins->src = priv->src_param;
1769 memset(&ins->texel_offset, 0, sizeof(ins->texel_offset));
1770
1771 p = *ptr;
1772 *ptr += len;
1773
1774 if (opcode_info->read_opcode_func)
1775 {
1776 opcode_info->read_opcode_func(ins, opcode, opcode_token, p, len, priv);
1777 }
1778 else
1779 {
1780 enum wined3d_shader_dst_modifier instruction_dst_modifier = WINED3DSPDM_NONE;
1781
1782 previous_token = opcode_token;
1783 while (previous_token & WINED3D_SM4_INSTRUCTION_MODIFIER && p != *ptr)
1784 shader_sm4_read_instruction_modifier(previous_token = *p++, ins);
1785
1788 {
1789 ins->flags &= ~WINED3D_SM4_INSTRUCTION_FLAG_SATURATE;
1790 instruction_dst_modifier = WINED3DSPDM_SATURATE;
1791 }
1792 precise = (opcode_token & WINED3D_SM5_PRECISE_MASK) >> WINED3D_SM5_PRECISE_SHIFT;
1793 ins->flags |= precise << WINED3DSI_PRECISE_SHIFT;
1794
1795 for (i = 0; i < ins->dst_count; ++i)
1796 {
1797 if (!(shader_sm4_read_dst_param(priv, &p, *ptr, map_data_type(opcode_info->dst_info[i]),
1798 &priv->dst_param[i])))
1799 {
1801 return;
1802 }
1803 priv->dst_param[i].modifiers |= instruction_dst_modifier;
1804 }
1805
1806 for (i = 0; i < ins->src_count; ++i)
1807 {
1808 if (!(shader_sm4_read_src_param(priv, &p, *ptr, map_data_type(opcode_info->src_info[i]),
1809 &priv->src_param[i])))
1810 {
1812 return;
1813 }
1814 }
1815 }
1816
1817 return;
1818
1819fail:
1820 *ptr = priv->end;
1822 return;
1823}
1824
1825static BOOL shader_sm4_is_end(void *data, const DWORD **ptr)
1826{
1827 struct wined3d_sm4_data *priv = data;
1828 return *ptr == priv->end;
1829}
1830
1832{
1838};
1839
1840#define TAG_AON9 WINEMAKEFOURCC('A', 'o', 'n', '9')
1841#define TAG_ISG1 WINEMAKEFOURCC('I', 'S', 'G', '1')
1842#define TAG_ISGN WINEMAKEFOURCC('I', 'S', 'G', 'N')
1843#define TAG_OSG1 WINEMAKEFOURCC('O', 'S', 'G', '1')
1844#define TAG_OSG5 WINEMAKEFOURCC('O', 'S', 'G', '5')
1845#define TAG_OSGN WINEMAKEFOURCC('O', 'S', 'G', 'N')
1846#define TAG_PCSG WINEMAKEFOURCC('P', 'C', 'S', 'G')
1847#define TAG_PSG1 WINEMAKEFOURCC('P', 'S', 'G', '1')
1848#define TAG_SHDR WINEMAKEFOURCC('S', 'H', 'D', 'R')
1849#define TAG_SHEX WINEMAKEFOURCC('S', 'H', 'E', 'X')
1850
1852{
1854 unsigned int shader_version;
1856 unsigned int byte_code_offset;
1857};
1858
1859static unsigned int read_dword(const char **ptr)
1860{
1861 unsigned int ret;
1862 memcpy(&ret, *ptr, sizeof(ret));
1863 *ptr += sizeof(ret);
1864 return ret;
1865}
1866
1867static BOOL require_space(size_t offset, size_t count, size_t size, size_t data_size)
1868{
1869 return !count || (data_size - offset) / count >= size;
1870}
1871
1872static void skip_dword_unknown(const char **ptr, unsigned int count)
1873{
1874 unsigned int i;
1875 unsigned int d;
1876
1877 WARN("Skipping %u unknown DWORDs:\n", count);
1878 for (i = 0; i < count; ++i)
1879 {
1880 d = read_dword(ptr);
1881 WARN("\t0x%08x\n", d);
1882 }
1883}
1884
1885static const char *shader_get_string(const char *data, size_t data_size, unsigned int offset)
1886{
1887 if (offset >= data_size)
1888 {
1889 WARN("Invalid offset %#x (data size %#lx).\n", offset, (long)data_size);
1890 return NULL;
1891 }
1892
1893 if (!memchr( data + offset, 0, data_size - offset ))
1894 return NULL;
1895
1896 return data + offset;
1897}
1898
1899static HRESULT shader_parse_signature(DWORD tag, const char *data, unsigned int data_size,
1901{
1903 bool has_stream_index, has_min_precision;
1904 const char *ptr = data;
1905 unsigned int i;
1906 unsigned int count;
1907
1908 if (!require_space(0, 2, sizeof(DWORD), data_size))
1909 {
1910 WARN("Invalid data size %#x.\n", data_size);
1911 return E_INVALIDARG;
1912 }
1913
1914 count = read_dword(&ptr);
1915 TRACE("%u elements.\n", count);
1916
1917 skip_dword_unknown(&ptr, 1); /* It seems to always be 0x00000008. */
1918
1919 if (!require_space(ptr - data, count, 6 * sizeof(DWORD), data_size))
1920 {
1921 WARN("Invalid count %#x (data size %#x).\n", count, data_size);
1922 return E_INVALIDARG;
1923 }
1924
1925 if (!(e = calloc(count, sizeof(*e))))
1926 {
1927 ERR("Failed to allocate input signature memory.\n");
1928 return E_OUTOFMEMORY;
1929 }
1930
1931 has_min_precision = tag == TAG_OSG1 || tag == TAG_PSG1 || tag == TAG_ISG1;
1932 has_stream_index = tag == TAG_OSG5 || has_min_precision;
1933
1934 for (i = 0; i < count; ++i)
1935 {
1936 unsigned int name_offset;
1937
1938 if (has_stream_index)
1939 e[i].stream_idx = read_dword(&ptr);
1940 else
1941 e[i].stream_idx = 0;
1942 name_offset = read_dword(&ptr);
1943 if (!(e[i].semantic_name = shader_get_string(data, data_size, name_offset)))
1944 {
1945 WARN("Invalid name offset %#x (data size %#x).\n", name_offset, data_size);
1946 free(e);
1947 return E_INVALIDARG;
1948 }
1949 e[i].semantic_idx = read_dword(&ptr);
1950 e[i].sysval_semantic = read_dword(&ptr);
1951 e[i].component_type = read_dword(&ptr);
1952 e[i].register_idx = read_dword(&ptr);
1953 e[i].mask = read_dword(&ptr);
1954
1955 if (has_min_precision)
1956 e[i].min_precision = read_dword(&ptr);
1957 else
1958 e[i].min_precision = 0;
1959
1960 TRACE("Stream: %u, semantic: %s, semantic idx: %u, sysval_semantic %#x, "
1961 "type %u, register idx: %u, use_mask %#x, input_mask %#x, min_precision %u.\n",
1963 e[i].component_type, e[i].register_idx, (e[i].mask >> 8) & 0xff, e[i].mask & 0xff, e[i].min_precision);
1964 }
1965
1966 s->elements = e;
1967 s->element_count = count;
1968
1969 return S_OK;
1970}
1971
1972static HRESULT shader_dxbc_process_section(struct wined3d_shader *shader, unsigned int max_version,
1973 enum vkd3d_shader_source_type *source_type, const struct vkd3d_shader_dxbc_section_desc *section)
1974{
1975 unsigned int data_size = section->data.size;
1976 const void *data = section->data.code;
1977 uint32_t tag = section->tag;
1978 HRESULT hr;
1979
1980 switch (tag)
1981 {
1982 case TAG_ISGN:
1983 case TAG_ISG1:
1984 if (max_version < 4)
1985 {
1986 TRACE("Skipping shader input signature.\n");
1987 break;
1988 }
1989 if (shader->input_signature.elements)
1990 {
1991 FIXME("Multiple input signatures.\n");
1992 break;
1993 }
1994 if (FAILED(hr = shader_parse_signature(tag, data, data_size, &shader->input_signature)))
1995 return hr;
1996 break;
1997
1998 case TAG_OSGN:
1999 case TAG_OSG1:
2000 case TAG_OSG5:
2001 if (max_version < 4)
2002 {
2003 TRACE("Skipping shader output signature.\n");
2004 break;
2005 }
2006 if (shader->output_signature.elements)
2007 {
2008 FIXME("Multiple output signatures.\n");
2009 break;
2010 }
2011 if (FAILED(hr = shader_parse_signature(tag, data, data_size, &shader->output_signature)))
2012 return hr;
2013 break;
2014
2015 case TAG_PCSG:
2016 case TAG_PSG1:
2017 if (shader->patch_constant_signature.elements)
2018 {
2019 FIXME("Multiple patch constant signatures.\n");
2020 break;
2021 }
2022 if (FAILED(hr = shader_parse_signature(tag, data, data_size, &shader->patch_constant_signature)))
2023 return hr;
2024 break;
2025
2026 case TAG_SHDR:
2027 case TAG_SHEX:
2028 if (max_version < 4)
2029 {
2030 TRACE("Skipping SM4+ shader.\n");
2031 break;
2032 }
2033 if (shader->function)
2034 FIXME("Multiple shader code chunks.\n");
2035 shader->function = data;
2036 shader->functionLength = data_size;
2037 *source_type = VKD3D_SHADER_SOURCE_DXBC_TPF;
2038 break;
2039
2040 case TAG_AON9:
2041 if (max_version < 4)
2042 {
2043 const struct aon9_header *header = data;
2044 unsigned int unknown_dword_count;
2045 const char *byte_code;
2046
2047 if (data_size < sizeof(*header))
2048 {
2049 WARN("Invalid Aon9 data size %#x.\n", data_size);
2050 return E_FAIL;
2051 }
2052 byte_code = data;
2053 byte_code += header->byte_code_offset;
2054 unknown_dword_count = (header->byte_code_offset - sizeof(*header)) / sizeof(DWORD);
2055
2056 if (data_size - 2 * sizeof(DWORD) < header->byte_code_offset)
2057 {
2058 WARN("Invalid byte code offset %#x (size %#x).\n", header->byte_code_offset, data_size);
2059 return E_FAIL;
2060 }
2061 FIXME("Skipping %u unknown DWORDs.\n", unknown_dword_count);
2062
2063 if (shader->function)
2064 FIXME("Multiple shader code chunks.\n");
2065 shader->function = (const DWORD *)byte_code;
2066 shader->functionLength = data_size - header->byte_code_offset;
2067 *source_type = VKD3D_SHADER_SOURCE_D3D_BYTECODE;
2068 TRACE("Feature level 9 shader version 0%08x, 0%08lx.\n",
2069 header->shader_version, *shader->function);
2070 }
2071 else
2072 {
2073 TRACE("Skipping feature level 9 shader code.\n");
2074 }
2075 break;
2076
2077 default:
2078 TRACE("Skipping chunk %s.\n", debugstr_fourcc(tag));
2079 break;
2080 }
2081
2082 return S_OK;
2083}
2084
2086 unsigned int max_shader_version, enum vkd3d_shader_source_type *source_type)
2087{
2088 const struct vkd3d_shader_code dxbc = {.code = shader->byte_code, .size = shader->byte_code_size};
2089 struct vkd3d_shader_dxbc_desc dxbc_desc;
2091 unsigned int i;
2092 int ret;
2093
2094 if ((ret = vkd3d_shader_parse_dxbc(&dxbc, 0, &dxbc_desc, NULL)) < 0)
2095 {
2096 WARN("Failed to parse DXBC, ret %d.\n", ret);
2097 return E_INVALIDARG;
2098 }
2099
2100 for (i = 0; i < dxbc_desc.section_count; ++i)
2101 {
2102 if (FAILED(hr = shader_dxbc_process_section(shader, max_shader_version, source_type, &dxbc_desc.sections[i])))
2103 break;
2104 }
2105 vkd3d_shader_free_dxbc(&dxbc_desc);
2106
2107 if (!shader->function)
2108 hr = E_INVALIDARG;
2109
2110 if (FAILED(hr))
2111 WARN("Failed to parse DXBC, hr %#lx.\n", hr);
2112
2113 return hr;
2114}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define U(x)
Definition: wordpad.c:45
static void list_remove(struct list_entry *entry)
Definition: list.h:90
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
Definition: list.h:83
static void list_init(struct list_entry *head)
Definition: list.h:51
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
Definition: list.h:39
component_type
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT32 uint32_t
Definition: types.h:75
#define TRACE_(x)
Definition: compat.h:76
#define TRACE_ON(x)
Definition: compat.h:75
#define stricmp(_String1, _String2)
Definition: compat.h:24
#define WINE_DECLARE_DEBUG_CHANNEL(x)
Definition: compat.h:45
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble s
Definition: gl.h:2039
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble t
Definition: gl.h:2047
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLenum GLenum GLuint components
Definition: glext.h:9620
GLintptr offset
Definition: glext.h:5920
GLuint shader
Definition: glext.h:6030
GLenum GLint GLuint mask
Definition: glext.h:6028
GLfloat GLfloat p
Definition: glext.h:8902
GLfloat param
Definition: glext.h:5796
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:11194
GLenum GLsizei len
Definition: glext.h:6722
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
const GLfloat * m
Definition: glext.h:10848
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
enum wined3d_data_type data_type
Definition: glsl_shader.c:71
static int reg
Definition: i386-dis.c:1290
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
uint32_t entry
Definition: isohybrid.c:63
#define d
Definition: ke_i.h:81
#define e
Definition: ke_i.h:82
#define debugstr_a
Definition: kernel32.h:31
if(dx< 0)
Definition: linetemp.h:194
#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
static size_t elem
Definition: string.c:71
#define calloc
Definition: rosglue.h:14
static __inline const char * debugstr_fourcc(unsigned int cc)
Definition: debug.h:397
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
Definition: list.h:242
__WINE_SERVER_LIST_INLINE void list_move_head(struct list *dst, struct list *src)
Definition: list.h:196
#define memset(x, y, z)
Definition: compat.h:39
static void shader_sm5_read_sync(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:896
static void shader_sm4_read_header(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
Definition: shader_sm4.c:1391
#define WINED3D_SM5_MODIFIER_DATA_TYPE_SHIFT
Definition: shader_sm4.c:30
wined3d_sm4_instruction_modifier
Definition: shader_sm4.c:318
@ WINED3D_SM4_MODIFIER_AOFFIMMI
Definition: shader_sm4.c:319
@ WINED3D_SM5_MODIFIER_DATA_TYPE
Definition: shader_sm4.c:321
@ WINED3D_SM5_MODIFIER_RESOURCE_TYPE
Definition: shader_sm4.c:320
#define WINED3D_SM5_UAV_FLAGS_MASK
Definition: shader_sm4.c:83
static void shader_sm4_read_dcl_indexable_temp(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:738
#define WINED3D_SM4_SAMPLER_MODE_MASK
Definition: shader_sm4.c:62
#define TAG_ISG1
Definition: shader_sm4.c:1841
static void shader_sm5_read_dcl_hs_max_tessfactor(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:820
static void shader_sm4_read_instruction_modifier(uint32_t modifier, struct wined3d_shader_instruction *ins)
Definition: shader_sm4.c:1642
static void shader_sm5_read_dcl_uav_structured(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:844
#define WINED3D_SM4_SHADER_DATA_TYPE_SHIFT
Definition: shader_sm4.c:64
static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end, enum wined3d_data_type data_type, struct wined3d_shader_src_param *src_param)
Definition: shader_sm4.c:1559
#define WINED3D_SM4_SWIZZLE_MASK
Definition: shader_sm4.c:117
#define TAG_SHEX
Definition: shader_sm4.c:1849
static void shader_sm5_read_dcl_tgsm_structured(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:866
#define WINED3D_SM4_MODIFIER_MASK
Definition: shader_sm4.c:28
#define WINED3D_SM4_INDEX_TYPE_MASK
Definition: shader_sm4.c:59
wined3d_sm4_sampler_mode
Definition: shader_sm4.c:448
@ WINED3D_SM4_SAMPLER_COMPARISON
Definition: shader_sm4.c:450
@ WINED3D_SM4_SAMPLER_DEFAULT
Definition: shader_sm4.c:449
static unsigned int read_dword(const char **ptr)
Definition: shader_sm4.c:1859
wined3d_sm4_resource_type
Definition: shader_sm4.c:425
@ WINED3D_SM4_RESOURCE_TEXTURE_1DARRAY
Definition: shader_sm4.c:432
@ WINED3D_SM4_RESOURCE_TEXTURE_2DMS
Definition: shader_sm4.c:429
@ WINED3D_SM4_RESOURCE_TEXTURE_2DMSARRAY
Definition: shader_sm4.c:434
@ WINED3D_SM4_RESOURCE_TEXTURE_1D
Definition: shader_sm4.c:427
@ WINED3D_SM4_RESOURCE_TEXTURE_CUBE
Definition: shader_sm4.c:431
@ WINED3D_SM4_RESOURCE_TEXTURE_CUBEARRAY
Definition: shader_sm4.c:435
@ WINED3D_SM4_RESOURCE_TEXTURE_2DARRAY
Definition: shader_sm4.c:433
@ WINED3D_SM4_RESOURCE_BUFFER
Definition: shader_sm4.c:426
@ WINED3D_SM4_RESOURCE_TEXTURE_2D
Definition: shader_sm4.c:428
@ WINED3D_SM4_RESOURCE_TEXTURE_3D
Definition: shader_sm4.c:430
#define WINED3D_SM4_DIMENSION_SHIFT
Definition: shader_sm4.c:110
wined3d_sm4_input_primitive_type
Definition: shader_sm4.c:371
@ WINED3D_SM5_INPUT_PT_PATCH23
Definition: shader_sm4.c:399
@ WINED3D_SM5_INPUT_PT_PATCH25
Definition: shader_sm4.c:401
@ WINED3D_SM5_INPUT_PT_PATCH3
Definition: shader_sm4.c:379
@ WINED3D_SM4_INPUT_PT_POINT
Definition: shader_sm4.c:372
@ WINED3D_SM4_INPUT_PT_TRIANGLEADJ
Definition: shader_sm4.c:376
@ WINED3D_SM5_INPUT_PT_PATCH32
Definition: shader_sm4.c:408
@ WINED3D_SM4_INPUT_PT_TRIANGLE
Definition: shader_sm4.c:374
@ WINED3D_SM5_INPUT_PT_PATCH7
Definition: shader_sm4.c:383
@ WINED3D_SM5_INPUT_PT_PATCH21
Definition: shader_sm4.c:397
@ WINED3D_SM5_INPUT_PT_PATCH6
Definition: shader_sm4.c:382
@ WINED3D_SM5_INPUT_PT_PATCH29
Definition: shader_sm4.c:405
@ WINED3D_SM5_INPUT_PT_PATCH10
Definition: shader_sm4.c:386
@ WINED3D_SM5_INPUT_PT_PATCH22
Definition: shader_sm4.c:398
@ WINED3D_SM5_INPUT_PT_PATCH14
Definition: shader_sm4.c:390
@ WINED3D_SM5_INPUT_PT_PATCH18
Definition: shader_sm4.c:394
@ WINED3D_SM5_INPUT_PT_PATCH11
Definition: shader_sm4.c:387
@ WINED3D_SM5_INPUT_PT_PATCH8
Definition: shader_sm4.c:384
@ WINED3D_SM5_INPUT_PT_PATCH30
Definition: shader_sm4.c:406
@ WINED3D_SM5_INPUT_PT_PATCH20
Definition: shader_sm4.c:396
@ WINED3D_SM5_INPUT_PT_PATCH31
Definition: shader_sm4.c:407
@ WINED3D_SM4_INPUT_PT_LINE
Definition: shader_sm4.c:373
@ WINED3D_SM5_INPUT_PT_PATCH24
Definition: shader_sm4.c:400
@ WINED3D_SM5_INPUT_PT_PATCH4
Definition: shader_sm4.c:380
@ WINED3D_SM5_INPUT_PT_PATCH9
Definition: shader_sm4.c:385
@ WINED3D_SM5_INPUT_PT_PATCH5
Definition: shader_sm4.c:381
@ WINED3D_SM5_INPUT_PT_PATCH2
Definition: shader_sm4.c:378
@ WINED3D_SM4_INPUT_PT_LINEADJ
Definition: shader_sm4.c:375
@ WINED3D_SM5_INPUT_PT_PATCH19
Definition: shader_sm4.c:395
@ WINED3D_SM5_INPUT_PT_PATCH12
Definition: shader_sm4.c:388
@ WINED3D_SM5_INPUT_PT_PATCH27
Definition: shader_sm4.c:403
@ WINED3D_SM5_INPUT_PT_PATCH13
Definition: shader_sm4.c:389
@ WINED3D_SM5_INPUT_PT_PATCH17
Definition: shader_sm4.c:393
@ WINED3D_SM5_INPUT_PT_PATCH16
Definition: shader_sm4.c:392
@ WINED3D_SM5_INPUT_PT_PATCH15
Definition: shader_sm4.c:391
@ WINED3D_SM5_INPUT_PT_PATCH1
Definition: shader_sm4.c:377
@ WINED3D_SM5_INPUT_PT_PATCH26
Definition: shader_sm4.c:402
@ WINED3D_SM5_INPUT_PT_PATCH28
Definition: shader_sm4.c:404
#define WINED3D_SM4_ADDRESSING_RELATIVE
Definition: shader_sm4.c:122
const struct wined3d_shader_frontend sm4_shader_frontend
Definition: shader_sm4.c:1831
static HRESULT shader_parse_signature(DWORD tag, const char *data, unsigned int data_size, struct wined3d_shader_signature *s)
Definition: shader_sm4.c:1899
static void shader_sm4_read_dcl_sampler(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:637
#define TAG_SHDR
Definition: shader_sm4.c:1848
#define WINED3D_SM4_REGISTER_TYPE_MASK
Definition: shader_sm4.c:105
wined3d_sm4_output_primitive_type
Definition: shader_sm4.c:364
@ WINED3D_SM4_OUTPUT_PT_LINESTRIP
Definition: shader_sm4.c:366
@ WINED3D_SM4_OUTPUT_PT_TRIANGLESTRIP
Definition: shader_sm4.c:367
@ WINED3D_SM4_OUTPUT_PT_POINTLIST
Definition: shader_sm4.c:365
static const struct wined3d_sm4_opcode_info * get_opcode_info(enum wined3d_sm4_opcode opcode)
Definition: shader_sm4.c:1192
wined3d_sm4_shader_data_type
Definition: shader_sm4.c:454
@ WINED3D_SM4_SHADER_DATA_MESSAGE
Definition: shader_sm4.c:456
@ WINED3D_SM4_SHADER_DATA_IMMEDIATE_CONSTANT_BUFFER
Definition: shader_sm4.c:455
#define WINED3D_SM4_RESOURCE_SAMPLE_COUNT_SHIFT
Definition: shader_sm4.c:52
static void map_register(const struct wined3d_sm4_data *priv, struct wined3d_shader_register *reg)
Definition: shader_sm4.c:1204
#define WINED3D_SM4_ADDRESSING_SHIFT1
Definition: shader_sm4.c:95
wined3d_sm4_opcode
Definition: shader_sm4.c:130
@ WINED3D_SM4_OP_DCL_INPUT_PRIMITIVE
Definition: shader_sm4.c:220
@ WINED3D_SM5_OP_RCP
Definition: shader_sm4.c:252
@ WINED3D_SM5_OP_DCL_UAV_STRUCTURED
Definition: shader_sm4.c:279
@ WINED3D_SM4_OP_ITOF
Definition: shader_sm4.c:171
@ WINED3D_SM4_OP_DCL_CONSTANT_BUFFER
Definition: shader_sm4.c:216
@ WINED3D_SM4_OP_BREAK
Definition: shader_sm4.c:133
@ WINED3D_SM5_OP_IMM_ATOMIC_EXCH
Definition: shader_sm4.c:305
@ WINED3D_SM4_OP_SAMPLE_C_LZ
Definition: shader_sm4.c:199
@ WINED3D_SM5_OP_HS_JOIN_PHASE
Definition: shader_sm4.c:240
@ WINED3D_SM4_OP_LT
Definition: shader_sm4.c:177
@ WINED3D_SM5_OP_DCL_OUTPUT_CONTROL_POINT_COUNT
Definition: shader_sm4.c:269
@ WINED3D_SM4_OP_MAX
Definition: shader_sm4.c:180
@ WINED3D_SM5_OP_DCL_HS_FORK_PHASE_INSTANCE_COUNT
Definition: shader_sm4.c:274
@ WINED3D_SM4_OP_UMUL
Definition: shader_sm4.c:209
@ WINED3D_SM5_OP_DCL_RESOURCE_RAW
Definition: shader_sm4.c:282
@ WINED3D_SM5_OP_SWAPC
Definition: shader_sm4.c:263
@ WINED3D_SM4_OP_EQ
Definition: shader_sm4.c:152
@ WINED3D_SM5_OP_DCL_TGSM_RAW
Definition: shader_sm4.c:280
@ WINED3D_SM4_OP_SAMPLE_B
Definition: shader_sm4.c:202
@ WINED3D_SM5_OP_EMIT_STREAM
Definition: shader_sm4.c:241
@ WINED3D_SM4_OP_LD
Definition: shader_sm4.c:173
@ WINED3D_SM4_OP_CONTINUE
Definition: shader_sm4.c:136
@ WINED3D_SM5_OP_BFI
Definition: shader_sm4.c:261
@ WINED3D_SM5_OP_IMM_ATOMIC_UMAX
Definition: shader_sm4.c:309
@ WINED3D_SM5_OP_ATOMIC_UMIN
Definition: shader_sm4.c:298
@ WINED3D_SM4_OP_SAMPLE_LOD
Definition: shader_sm4.c:200
@ WINED3D_SM4_OP_DERIV_RTY
Definition: shader_sm4.c:141
@ WINED3D_SM4_OP_ROUND_PI
Definition: shader_sm4.c:194
@ WINED3D_SM5_OP_DCL_INTERFACE
Definition: shader_sm4.c:267
@ WINED3D_SM5_OP_STORE_UAV_TYPED
Definition: shader_sm4.c:285
@ WINED3D_SM4_OP_SAMPLE_INFO
Definition: shader_sm4.c:236
@ WINED3D_SM5_OP_LD_RAW
Definition: shader_sm4.c:286
@ WINED3D_SM4_OP_IF
Definition: shader_sm4.c:159
@ WINED3D_SM4_OP_NOP
Definition: shader_sm4.c:186
@ WINED3D_SM4_OP_LD2DMS
Definition: shader_sm4.c:174
@ WINED3D_SM5_OP_F16TOF32
Definition: shader_sm4.c:254
@ WINED3D_SM4_OP_CUT
Definition: shader_sm4.c:138
@ WINED3D_SM4_OP_CASE
Definition: shader_sm4.c:135
@ WINED3D_SM5_OP_ATOMIC_UMAX
Definition: shader_sm4.c:297
@ WINED3D_SM4_OP_SINCOS
Definition: shader_sm4.c:205
@ WINED3D_SM5_OP_ATOMIC_XOR
Definition: shader_sm4.c:292
@ WINED3D_SM4_OP_RET
Definition: shader_sm4.c:190
@ WINED3D_SM5_OP_DCL_FUNCTION_TABLE
Definition: shader_sm4.c:266
@ WINED3D_SM5_OP_SYNC
Definition: shader_sm4.c:311
@ WINED3D_SM5_OP_EVAL_SAMPLE_INDEX
Definition: shader_sm4.c:312
@ WINED3D_SM4_OP_ISHR
Definition: shader_sm4.c:170
@ WINED3D_SM4_OP_DCL_INPUT_PS_SIV
Definition: shader_sm4.c:227
@ WINED3D_SM4_OP_IGE
Definition: shader_sm4.c:161
@ WINED3D_SM4_OP_DP3
Definition: shader_sm4.c:145
@ WINED3D_SM5_OP_UBFE
Definition: shader_sm4.c:259
@ WINED3D_SM4_OP_UMAX
Definition: shader_sm4.c:210
@ WINED3D_SM4_OP_SAMPLE_GRAD
Definition: shader_sm4.c:201
@ WINED3D_SM4_OP_INE
Definition: shader_sm4.c:167
@ WINED3D_SM5_OP_ATOMIC_OR
Definition: shader_sm4.c:291
@ WINED3D_SM4_OP_AND
Definition: shader_sm4.c:132
@ WINED3D_SM5_OP_GATHER4_PO
Definition: shader_sm4.c:250
@ WINED3D_SM4_OP_NE
Definition: shader_sm4.c:185
@ WINED3D_SM4_OP_INEG
Definition: shader_sm4.c:168
@ WINED3D_SM5_OP_GATHER4_PO_C
Definition: shader_sm4.c:251
@ WINED3D_SM5_OP_DERIV_RTX_FINE
Definition: shader_sm4.c:246
@ WINED3D_SM5_OP_DCL_RESOURCE_STRUCTURED
Definition: shader_sm4.c:283
@ WINED3D_SM5_OP_DERIV_RTX_COARSE
Definition: shader_sm4.c:245
@ WINED3D_SM4_OP_SAMPLE_C
Definition: shader_sm4.c:198
@ WINED3D_SM4_OP_ISHL
Definition: shader_sm4.c:169
@ WINED3D_SM4_OP_DERIV_RTX
Definition: shader_sm4.c:140
@ WINED3D_SM4_OP_FTOI
Definition: shader_sm4.c:155
@ WINED3D_SM5_OP_BUFINFO
Definition: shader_sm4.c:244
@ WINED3D_SM5_OP_IMM_ATOMIC_ALLOC
Definition: shader_sm4.c:299
@ WINED3D_SM4_OP_LOOP
Definition: shader_sm4.c:176
@ WINED3D_SM4_OP_RSQ
Definition: shader_sm4.c:196
@ WINED3D_SM4_OP_RESINFO
Definition: shader_sm4.c:189
@ WINED3D_SM5_OP_FIRSTBIT_SHI
Definition: shader_sm4.c:258
@ WINED3D_SM4_OP_SAMPLE
Definition: shader_sm4.c:197
@ WINED3D_SM5_OP_DCL_HS_JOIN_PHASE_INSTANCE_COUNT
Definition: shader_sm4.c:275
@ WINED3D_SM5_OP_IMM_ATOMIC_CONSUME
Definition: shader_sm4.c:300
@ WINED3D_SM4_OP_IADD
Definition: shader_sm4.c:158
@ WINED3D_SM5_OP_DCL_STREAM
Definition: shader_sm4.c:264
@ WINED3D_SM5_OP_STORE_STRUCTURED
Definition: shader_sm4.c:289
@ WINED3D_SM5_OP_STORE_RAW
Definition: shader_sm4.c:287
@ WINED3D_SM4_OP_FRC
Definition: shader_sm4.c:154
@ WINED3D_SM5_OP_F32TOF16
Definition: shader_sm4.c:253
@ WINED3D_SM4_OP_IMUL
Definition: shader_sm4.c:166
@ WINED3D_SM5_OP_IMM_ATOMIC_UMIN
Definition: shader_sm4.c:310
@ WINED3D_SM4_OP_ULT
Definition: shader_sm4.c:207
@ WINED3D_SM5_OP_GATHER4_C
Definition: shader_sm4.c:249
@ WINED3D_SM5_OP_EVAL_CENTROID
Definition: shader_sm4.c:313
@ WINED3D_SM4_OP_DCL_INPUT
Definition: shader_sm4.c:222
@ WINED3D_SM4_OP_LOD
Definition: shader_sm4.c:233
@ WINED3D_SM4_OP_DCL_OUTPUT
Definition: shader_sm4.c:228
@ WINED3D_SM5_OP_ATOMIC_CMP_STORE
Definition: shader_sm4.c:293
@ WINED3D_SM4_OP_MOVC
Definition: shader_sm4.c:183
@ WINED3D_SM4_OP_ROUND_NE
Definition: shader_sm4.c:192
@ WINED3D_SM4_OP_MOV
Definition: shader_sm4.c:182
@ WINED3D_SM4_OP_DIV
Definition: shader_sm4.c:143
@ WINED3D_SM4_OP_MUL
Definition: shader_sm4.c:184
@ WINED3D_SM4_OP_RETC
Definition: shader_sm4.c:191
@ WINED3D_SM5_OP_FIRSTBIT_HI
Definition: shader_sm4.c:256
@ WINED3D_SM4_OP_DCL_INPUT_SIV
Definition: shader_sm4.c:224
@ WINED3D_SM5_OP_HS_CONTROL_POINT_PHASE
Definition: shader_sm4.c:238
@ WINED3D_SM5_OP_ATOMIC_IMIN
Definition: shader_sm4.c:296
@ WINED3D_SM5_OP_IMM_ATOMIC_AND
Definition: shader_sm4.c:302
@ WINED3D_SM4_OP_DCL_INDEX_RANGE
Definition: shader_sm4.c:218
@ WINED3D_SM4_OP_GATHER4
Definition: shader_sm4.c:234
@ WINED3D_SM4_OP_GE
Definition: shader_sm4.c:157
@ WINED3D_SM4_OP_DCL_VERTICES_OUT
Definition: shader_sm4.c:221
@ WINED3D_SM5_OP_BFREV
Definition: shader_sm4.c:262
@ WINED3D_SM4_OP_SAMPLE_POS
Definition: shader_sm4.c:235
@ WINED3D_SM5_OP_DCL_TGSM_STRUCTURED
Definition: shader_sm4.c:281
@ WINED3D_SM4_OP_ENDLOOP
Definition: shader_sm4.c:150
@ WINED3D_SM4_OP_DCL_OUTPUT_TOPOLOGY
Definition: shader_sm4.c:219
@ WINED3D_SM5_OP_LD_STRUCTURED
Definition: shader_sm4.c:288
@ WINED3D_SM4_OP_UGE
Definition: shader_sm4.c:208
@ WINED3D_SM5_OP_DCL_UAV_RAW
Definition: shader_sm4.c:278
@ WINED3D_SM4_OP_EMIT
Definition: shader_sm4.c:148
@ WINED3D_SM5_OP_HS_FORK_PHASE
Definition: shader_sm4.c:239
@ WINED3D_SM4_OP_DCL_OUTPUT_SIV
Definition: shader_sm4.c:229
@ WINED3D_SM5_OP_DERIV_RTY_FINE
Definition: shader_sm4.c:248
@ WINED3D_SM4_OP_LABEL
Definition: shader_sm4.c:172
@ WINED3D_SM5_OP_DCL_TESSELLATOR_PARTITIONING
Definition: shader_sm4.c:271
@ WINED3D_SM4_OP_IMAX
Definition: shader_sm4.c:164
@ WINED3D_SM4_OP_ENDSWITCH
Definition: shader_sm4.c:151
@ WINED3D_SM4_OP_ELSE
Definition: shader_sm4.c:147
@ WINED3D_SM5_OP_IMM_ATOMIC_IADD
Definition: shader_sm4.c:301
@ WINED3D_SM5_OP_HS_DECLS
Definition: shader_sm4.c:237
@ WINED3D_SM4_OP_MAD
Definition: shader_sm4.c:178
@ WINED3D_SM4_OP_LOG
Definition: shader_sm4.c:175
@ WINED3D_SM5_OP_DCL_TESSELLATOR_DOMAIN
Definition: shader_sm4.c:270
@ WINED3D_SM5_OP_DCL_FUNCTION_BODY
Definition: shader_sm4.c:265
@ WINED3D_SM5_OP_CUT_STREAM
Definition: shader_sm4.c:242
@ WINED3D_SM4_OP_DCL_SAMPLER
Definition: shader_sm4.c:217
@ WINED3D_SM4_OP_UDIV
Definition: shader_sm4.c:206
@ WINED3D_SM4_OP_UMIN
Definition: shader_sm4.c:211
@ WINED3D_SM5_OP_IMM_ATOMIC_IMAX
Definition: shader_sm4.c:307
@ WINED3D_SM4_OP_DISCARD
Definition: shader_sm4.c:142
@ WINED3D_SM4_OP_DCL_INPUT_PS_SGV
Definition: shader_sm4.c:226
@ WINED3D_SM5_OP_IMM_ATOMIC_OR
Definition: shader_sm4.c:303
@ WINED3D_SM5_OP_DCL_HS_MAX_TESSFACTOR
Definition: shader_sm4.c:273
@ WINED3D_SM5_OP_LD_UAV_TYPED
Definition: shader_sm4.c:284
@ WINED3D_SM5_OP_DERIV_RTY_COARSE
Definition: shader_sm4.c:247
@ WINED3D_SM5_OP_DCL_GS_INSTANCES
Definition: shader_sm4.c:314
@ WINED3D_SM5_OP_IMM_ATOMIC_CMP_EXCH
Definition: shader_sm4.c:306
@ WINED3D_SM4_OP_DEFAULT
Definition: shader_sm4.c:139
@ WINED3D_SM4_OP_DCL_GLOBAL_FLAGS
Definition: shader_sm4.c:232
@ WINED3D_SM5_OP_COUNTBITS
Definition: shader_sm4.c:255
@ WINED3D_SM5_OP_FIRSTBIT_LO
Definition: shader_sm4.c:257
@ WINED3D_SM4_OP_ROUND_NI
Definition: shader_sm4.c:193
@ WINED3D_SM4_OP_DCL_TEMPS
Definition: shader_sm4.c:230
@ WINED3D_SM4_OP_XOR
Definition: shader_sm4.c:214
@ WINED3D_SM5_OP_ATOMIC_IMAX
Definition: shader_sm4.c:295
@ WINED3D_SM4_OP_CONTINUEC
Definition: shader_sm4.c:137
@ WINED3D_SM4_OP_EXP
Definition: shader_sm4.c:153
@ WINED3D_SM5_OP_FCALL
Definition: shader_sm4.c:243
@ WINED3D_SM5_OP_DCL_THREAD_GROUP
Definition: shader_sm4.c:276
@ WINED3D_SM5_OP_DCL_TESSELLATOR_OUTPUT_PRIMITIVE
Definition: shader_sm4.c:272
@ WINED3D_SM4_OP_DP2
Definition: shader_sm4.c:144
@ WINED3D_SM4_OP_SWITCH
Definition: shader_sm4.c:204
@ WINED3D_SM4_OP_USHR
Definition: shader_sm4.c:212
@ WINED3D_SM4_OP_DCL_INPUT_PS
Definition: shader_sm4.c:225
@ WINED3D_SM4_OP_DP4
Definition: shader_sm4.c:146
@ WINED3D_SM4_OP_IMIN
Definition: shader_sm4.c:165
@ WINED3D_SM4_OP_DCL_RESOURCE
Definition: shader_sm4.c:215
@ WINED3D_SM4_OP_MIN
Definition: shader_sm4.c:179
@ WINED3D_SM4_OP_DCL_INPUT_SGV
Definition: shader_sm4.c:223
@ WINED3D_SM5_OP_IMM_ATOMIC_IMIN
Definition: shader_sm4.c:308
@ WINED3D_SM4_OP_DCL_INDEXABLE_TEMP
Definition: shader_sm4.c:231
@ WINED3D_SM5_OP_DCL_INPUT_CONTROL_POINT_COUNT
Definition: shader_sm4.c:268
@ WINED3D_SM4_OP_ILT
Definition: shader_sm4.c:162
@ WINED3D_SM4_OP_NOT
Definition: shader_sm4.c:187
@ WINED3D_SM5_OP_ATOMIC_AND
Definition: shader_sm4.c:290
@ WINED3D_SM4_OP_SHADER_DATA
Definition: shader_sm4.c:181
@ WINED3D_SM4_OP_IEQ
Definition: shader_sm4.c:160
@ WINED3D_SM4_OP_FTOU
Definition: shader_sm4.c:156
@ WINED3D_SM4_OP_IMAD
Definition: shader_sm4.c:163
@ WINED3D_SM4_OP_UTOF
Definition: shader_sm4.c:213
@ WINED3D_SM4_OP_ROUND_Z
Definition: shader_sm4.c:195
@ WINED3D_SM4_OP_ENDIF
Definition: shader_sm4.c:149
@ WINED3D_SM4_OP_SQRT
Definition: shader_sm4.c:203
@ WINED3D_SM4_OP_ADD
Definition: shader_sm4.c:131
@ WINED3D_SM4_OP_OR
Definition: shader_sm4.c:188
@ WINED3D_SM5_OP_DCL_UAV_TYPED
Definition: shader_sm4.c:277
@ WINED3D_SM5_OP_ATOMIC_IADD
Definition: shader_sm4.c:294
@ WINED3D_SM5_OP_IBFE
Definition: shader_sm4.c:260
@ WINED3D_SM4_OP_BREAKC
Definition: shader_sm4.c:134
@ WINED3D_SM5_OP_IMM_ATOMIC_XOR
Definition: shader_sm4.c:304
static const struct wined3d_sm4_opcode_info opcode_table[]
Definition: shader_sm4.c:912
#define WINED3D_SM5_MODIFIER_RESOURCE_TYPE_MASK
Definition: shader_sm4.c:34
static void shader_sm5_read_dcl_resource_raw(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:889
static BOOL require_space(size_t offset, size_t count, size_t size, size_t data_size)
Definition: shader_sm4.c:1867
static struct wined3d_shader_src_param * get_src_param(struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:1369
#define WINED3D_SM5_SYNC_FLAGS_SHIFT
Definition: shader_sm4.c:85
#define WINED3D_SM4_REGISTER_ORDER_MASK
Definition: shader_sm4.c:102
#define WINED3D_SM5_CONTROL_POINT_COUNT_SHIFT
Definition: shader_sm4.c:76
static void shader_sm4_read_dcl_index_range(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:647
static void shader_sm5_read_dcl_tessellator_output_primitive(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:812
#define WINED3D_SM4_INSTRUCTION_FLAGS_SHIFT
Definition: shader_sm4.c:46
static void shader_sm5_read_fcall(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:754
#define WINED3D_SM4_GLOBAL_FLAGS_MASK
Definition: shader_sm4.c:71
static void shader_sm4_free(void *data)
Definition: shader_sm4.c:1356
#define WINED3D_SM4_REGISTER_ORDER_SHIFT
Definition: shader_sm4.c:101
#define TAG_AON9
Definition: shader_sm4.c:1840
#define WINED3D_SM4_PRIMITIVE_TYPE_MASK
Definition: shader_sm4.c:56
static enum wined3d_shader_type wined3d_get_sm4_shader_type(const DWORD *byte_code, size_t byte_code_size)
Definition: shader_sm4.c:1253
#define WINED3D_SM4_RESOURCE_TYPE_SHIFT
Definition: shader_sm4.c:49
static void shader_sm5_read_dcl_function_body(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:762
#define TAG_ISGN
Definition: shader_sm4.c:1842
static BOOL shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end, enum wined3d_data_type data_type, struct wined3d_shader_dst_param *dst_param)
Definition: shader_sm4.c:1610
static void shader_sm5_read_control_point_count(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:788
static void shader_sm4_read_declaration_count(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:697
static BOOL shader_sm4_is_end(void *data, const DWORD **ptr)
Definition: shader_sm4.c:1825
#define WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT
Definition: shader_sm4.c:43
#define TAG_OSGN
Definition: shader_sm4.c:1845
static void * shader_sm4_init(const DWORD *byte_code, size_t byte_code_size, const struct wined3d_shader_signature *output_signature)
Definition: shader_sm4.c:1290
#define WINED3D_SM4_PRIMITIVE_TYPE_SHIFT
Definition: shader_sm4.c:55
#define WINED3D_SM4_INSTRUCTION_FLAGS_MASK
Definition: shader_sm4.c:47
#define WINED3D_SM4_DIMENSION_MASK
Definition: shader_sm4.c:111
#define WINED3D_SM5_TESSELLATOR_SHIFT
Definition: shader_sm4.c:88
#define WINED3D_SM4_SAMPLER_MODE_SHIFT
Definition: shader_sm4.c:61
static void shader_sm5_read_dcl_tgsm_raw(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:856
static BOOL shader_sm4_read_reg_idx(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end, DWORD addressing, struct wined3d_shader_register_index *reg_idx)
Definition: shader_sm4.c:1399
#define WINED3D_SM5_FP_TABLE_COUNT_MASK
Definition: shader_sm4.c:80
#define WINED3D_SM4_SWIZZLE_SHIFT
Definition: shader_sm4.c:116
#define WINED3D_SM4_OPCODE_MASK
Definition: shader_sm4.c:91
#define WINED3D_SM4_AOFFIMMI_V_SHIFT
Definition: shader_sm4.c:38
#define WINED3D_SM4_INSTRUCTION_FLAG_SATURATE
Definition: shader_sm4.c:125
#define WINED3D_SM4_WRITEMASK_SHIFT
Definition: shader_sm4.c:113
static void shader_sm5_read_dcl_thread_group(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:827
static enum wined3d_primitive_type output_primitive_type_table[]
Definition: shader_sm4.c:490
static void shader_sm4_read_declaration_register_semantic(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:711
wined3d_sm4_register_type
Definition: shader_sm4.c:325
@ WINED3D_SM4_RT_TEMP
Definition: shader_sm4.c:326
@ WINED3D_SM5_RT_DEPTHOUT_LESS_EQUAL
Definition: shader_sm4.c:359
@ WINED3D_SM4_RT_INPUT
Definition: shader_sm4.c:327
@ WINED3D_SM5_RT_THREAD_ID
Definition: shader_sm4.c:352
@ WINED3D_SM5_RT_OUTPUT_STENCIL_REF
Definition: shader_sm4.c:360
@ WINED3D_SM5_RT_THREAD_GROUP_ID
Definition: shader_sm4.c:353
@ WINED3D_SM5_RT_FUNCTION_BODY
Definition: shader_sm4.c:341
@ WINED3D_SM4_RT_OMASK
Definition: shader_sm4.c:339
@ WINED3D_SM5_RT_PATCH_CONSTANT_DATA
Definition: shader_sm4.c:348
@ WINED3D_SM4_RT_SAMPLER
Definition: shader_sm4.c:331
@ WINED3D_SM5_RT_DEPTHOUT_GREATER_EQUAL
Definition: shader_sm4.c:358
@ WINED3D_SM5_RT_GS_INSTANCE_ID
Definition: shader_sm4.c:357
@ WINED3D_SM4_RT_NULL
Definition: shader_sm4.c:337
@ WINED3D_SM5_RT_FORK_INSTANCE_ID
Definition: shader_sm4.c:344
@ WINED3D_SM4_RT_CONSTBUFFER
Definition: shader_sm4.c:333
@ WINED3D_SM5_RT_JOIN_INSTANCE_ID
Definition: shader_sm4.c:345
@ WINED3D_SM4_RT_IMMCONST
Definition: shader_sm4.c:330
@ WINED3D_SM4_RT_PRIMID
Definition: shader_sm4.c:335
@ WINED3D_SM5_RT_INPUT_CONTROL_POINT
Definition: shader_sm4.c:346
@ WINED3D_SM5_RT_LOCAL_THREAD_INDEX
Definition: shader_sm4.c:356
@ WINED3D_SM4_RT_INDEXABLE_TEMP
Definition: shader_sm4.c:329
@ WINED3D_SM4_RT_OUTPUT
Definition: shader_sm4.c:328
@ WINED3D_SM5_RT_SHARED_MEMORY
Definition: shader_sm4.c:351
@ WINED3D_SM5_RT_LOCAL_THREAD_ID
Definition: shader_sm4.c:354
@ WINED3D_SM5_RT_OUTPUT_CONTROL_POINT
Definition: shader_sm4.c:347
@ WINED3D_SM5_RT_DOMAIN_LOCATION
Definition: shader_sm4.c:349
@ WINED3D_SM4_RT_RASTERIZER
Definition: shader_sm4.c:338
@ WINED3D_SM5_RT_STREAM
Definition: shader_sm4.c:340
@ WINED3D_SM5_RT_FUNCTION_POINTER
Definition: shader_sm4.c:342
@ WINED3D_SM5_RT_OUTPUT_CONTROL_POINT_ID
Definition: shader_sm4.c:343
@ WINED3D_SM5_RT_COVERAGE
Definition: shader_sm4.c:355
@ WINED3D_SM5_RT_UAV
Definition: shader_sm4.c:350
@ WINED3D_SM4_RT_IMMCONSTBUFFER
Definition: shader_sm4.c:334
@ WINED3D_SM4_RT_DEPTHOUT
Definition: shader_sm4.c:336
@ WINED3D_SM4_RT_RESOURCE
Definition: shader_sm4.c:332
#define WINED3D_SM4_REGISTER_MODIFIER
Definition: shader_sm4.c:93
#define TAG_OSG1
Definition: shader_sm4.c:1843
#define WINED3D_SM4_ADDRESSING_SHIFT0
Definition: shader_sm4.c:98
#define WINED3D_SM5_TESSELLATOR_MASK
Definition: shader_sm4.c:89
#define WINED3D_SM5_MODIFIER_DATA_TYPE_MASK
Definition: shader_sm4.c:31
#define WINED3D_SM4_AOFFIMMI_U_SHIFT
Definition: shader_sm4.c:36
#define WINED3D_SM4_INSTRUCTION_LENGTH_MASK
Definition: shader_sm4.c:44
#define WINED3D_SM4_ADDRESSING_MASK0
Definition: shader_sm4.c:99
static void shader_sm4_read_dcl_output_topology(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:656
static void shader_sm4_read_dcl_global_flags(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:747
static void skip_dword_unknown(const char **ptr, unsigned int count)
Definition: shader_sm4.c:1872
static void shader_sm5_read_dcl_tessellator_domain(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:796
#define WINED3D_SM4_CONDITIONAL_NZ
Definition: shader_sm4.c:127
wined3d_sm4_data_type
Definition: shader_sm4.c:439
@ WINED3D_SM4_DATA_INT
Definition: shader_sm4.c:442
@ WINED3D_SM4_DATA_SNORM
Definition: shader_sm4.c:441
@ WINED3D_SM4_DATA_FLOAT
Definition: shader_sm4.c:444
@ WINED3D_SM4_DATA_UNORM
Definition: shader_sm4.c:440
@ WINED3D_SM4_DATA_UINT
Definition: shader_sm4.c:443
static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wined3d_shader_instruction *ins)
Definition: shader_sm4.c:1701
static enum wined3d_shader_resource_type resource_type_table[]
Definition: shader_sm4.c:512
static void shader_sm4_read_dcl_input_primitive(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:672
#define WINED3D_SM4_AOFFIMMI_V_MASK
Definition: shader_sm4.c:39
#define WINED3D_SM5_FP_ARRAY_SIZE_SHIFT
Definition: shader_sm4.c:79
#define TAG_PSG1
Definition: shader_sm4.c:1847
#define WINED3D_SM5_MODIFIER_RESOURCE_TYPE_SHIFT
Definition: shader_sm4.c:33
#define WINED3D_SM4_INTERPOLATION_MODE_SHIFT
Definition: shader_sm4.c:67
#define WINED3D_SM4_ADDRESSING_OFFSET
Definition: shader_sm4.c:123
wined3d_sm4_swizzle_type
Definition: shader_sm4.c:412
@ WINED3D_SM4_SWIZZLE_NONE
Definition: shader_sm4.c:413
@ WINED3D_SM4_SWIZZLE_SCALAR
Definition: shader_sm4.c:415
@ WINED3D_SM4_SWIZZLE_VEC4
Definition: shader_sm4.c:414
#define WINED3D_SM5_UAV_FLAGS_SHIFT
Definition: shader_sm4.c:82
#define TAG_OSG5
Definition: shader_sm4.c:1844
#define WINED3D_SM4_AOFFIMMI_U_MASK
Definition: shader_sm4.c:37
#define WINED3D_SM4_SHADER_DATA_TYPE_MASK
Definition: shader_sm4.c:65
#define WINED3D_SM5_CONTROL_POINT_COUNT_MASK
Definition: shader_sm4.c:77
#define WINED3D_SM4_INTERPOLATION_MODE_MASK
Definition: shader_sm4.c:68
#define WINED3D_SM4_REGISTER_TYPE_SHIFT
Definition: shader_sm4.c:104
#define WINED3D_SM4_RESOURCE_TYPE_MASK
Definition: shader_sm4.c:50
#define WINED3D_SM5_SYNC_FLAGS_MASK
Definition: shader_sm4.c:86
#define WINED3D_SM4_VERSION_MINOR(version)
Definition: shader_sm4.c:120
static enum wined3d_data_type map_data_type(char t)
Definition: shader_sm4.c:1229
#define WINED3D_SM4_ADDRESSING_MASK1
Definition: shader_sm4.c:96
static void shader_sm4_read_dcl_input_ps(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:720
static void shader_sm5_read_dcl_function_table(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:769
#define WINED3D_SM4_AOFFIMMI_W_MASK
Definition: shader_sm4.c:41
static void shader_sm4_read_conditional_op(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:542
static void shader_sm5_read_dcl_resource_structured(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:878
static enum wined3d_data_type data_type_table[]
Definition: shader_sm4.c:527
static void shader_sm4_read_dcl_constant_buffer(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:628
#define TAG_PCSG
Definition: shader_sm4.c:1846
static enum wined3d_shader_register_type register_type_table[]
Definition: shader_sm4.c:1146
static BOOL shader_sm4_read_param(struct wined3d_sm4_data *priv, const DWORD **ptr, const DWORD *end, enum wined3d_data_type data_type, struct wined3d_shader_register *param, enum wined3d_shader_src_modifier *modifier)
Definition: shader_sm4.c:1427
static void shader_sm5_read_dcl_interface(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:777
HRESULT wined3d_shader_extract_from_dxbc(struct wined3d_shader *shader, unsigned int max_shader_version, enum vkd3d_shader_source_type *source_type)
Definition: shader_sm4.c:2085
#define WINED3D_SM4_VERSION_MAJOR(version)
Definition: shader_sm4.c:119
#define WINED3D_SM4_WRITEMASK_MASK
Definition: shader_sm4.c:114
static HRESULT shader_dxbc_process_section(struct wined3d_shader *shader, unsigned int max_version, enum vkd3d_shader_source_type *source_type, const struct vkd3d_shader_dxbc_section_desc *section)
Definition: shader_sm4.c:1972
#define WINED3D_SM4_INSTRUCTION_MODIFIER
Definition: shader_sm4.c:26
static void shader_sm5_read_dcl_uav_raw(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:836
#define WINED3D_SM4_SWIZZLE_TYPE_MASK
Definition: shader_sm4.c:108
static void shader_sm4_read_dcl_resource(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:580
static void shader_sm4_read_dcl_input_ps_siv(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:728
static void shader_sm5_read_dcl_tessellator_partitioning(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:804
#define WINED3D_SM4_AOFFIMMI_W_SHIFT
Definition: shader_sm4.c:40
static void shader_sm4_read_shader_data(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:551
#define WINED3D_SM5_PRECISE_SHIFT
Definition: shader_sm4.c:73
static const char * shader_get_string(const char *data, size_t data_size, unsigned int offset)
Definition: shader_sm4.c:1885
#define WINED3D_SM4_RESOURCE_SAMPLE_COUNT_MASK
Definition: shader_sm4.c:53
#define WINED3D_SM5_PRECISE_MASK
Definition: shader_sm4.c:74
static void shader_sm4_read_declaration_dst(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:704
wined3d_sm4_dimension
Definition: shader_sm4.c:419
@ WINED3D_SM4_DIMENSION_SCALAR
Definition: shader_sm4.c:420
@ WINED3D_SM4_DIMENSION_VEC4
Definition: shader_sm4.c:421
#define WINED3D_SM4_SWIZZLE_TYPE_SHIFT
Definition: shader_sm4.c:107
static enum wined3d_primitive_type input_primitive_type_table[]
Definition: shader_sm4.c:500
#define WINED3D_SM4_GLOBAL_FLAGS_SHIFT
Definition: shader_sm4.c:70
#define TRACE(s)
Definition: solgame.cpp:4
unsigned int byte_code_offset
Definition: shader_sm4.c:1856
DWORD unknown
Definition: shader_sm4.c:1855
DWORD chunk_size
Definition: shader_sm4.c:1853
unsigned int shader_version
Definition: shader_sm4.c:1854
struct list entry
Definition: wpp.c:51
Definition: list.h:15
Definition: parser.c:56
Definition: ecma_167.h:138
const void * code
Definition: vkd3d_shader.h:413
struct vkd3d_shader_dxbc_section_desc * sections
struct wined3d_shader_register reg
enum wined3d_data_type resource_data_type
struct wined3d_shader_primitive_type primitive_type
struct wined3d_shader_tgsm_structured tgsm_structured
enum wined3d_tessellator_partitioning tessellator_partitioning
const struct wined3d_shader_src_param * src
union wined3d_shader_instruction::@348 declaration
struct wined3d_shader_semantic semantic
const struct wined3d_shader_dst_param * dst
enum wined3d_shader_resource_type resource_type
struct wined3d_shader_function_table_pointer fp
const struct wined3d_shader_src_param * predicate
enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx
struct wined3d_shader_indexable_temp indexable_temp
struct wined3d_shader_structured_resource structured_resource
struct wined3d_shader_index_range index_range
enum wined3d_tessellator_output_primitive tessellator_output_primitive
enum wined3d_tessellator_domain tessellator_domain
struct wined3d_shader_tgsm_raw tgsm_raw
const struct wined3d_shader_immediate_constant_buffer * icb
struct wined3d_shader_texel_offset texel_offset
struct wined3d_shader_thread_group_size thread_group_size
struct wined3d_shader_register_semantic register_semantic
const struct wined3d_shader_src_param * rel_addr
enum wined3d_sysval_semantic sysval_semantic
struct wined3d_shader_signature_element * elements
Definition: shader_sm4.c:460
struct list entry
Definition: shader_sm4.c:461
enum wined3d_shader_src_modifier modifiers
struct wined3d_shader_register reg
struct list src_free
Definition: shader_sm4.c:474
struct wined3d_shader_immediate_constant_buffer icb
Definition: shader_sm4.c:476
struct wined3d_shader_dst_param dst_param[2]
Definition: shader_sm4.c:473
struct wined3d_shader_src_param src_param[5]
Definition: shader_sm4.c:472
unsigned int output_map[MAX_REG_OUTPUT]
Definition: shader_sm4.c:470
struct wined3d_shader_version shader_version
Definition: shader_sm4.c:467
const DWORD * start
Definition: shader_sm4.c:468
struct list src
Definition: shader_sm4.c:475
const DWORD * end
Definition: shader_sm4.c:468
const char * dst_info
Definition: shader_sm4.c:483
const char * src_info
Definition: shader_sm4.c:484
enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx
Definition: shader_sm4.c:482
void(* read_opcode_func)(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv)
Definition: shader_sm4.c:485
enum wined3d_sm4_opcode opcode
Definition: shader_sm4.c:481
#define LIST_ENTRY(type)
Definition: queue.h:175
ULONG_PTR SIZE_T
Definition: typedefs.h:80
vkd3d_shader_source_type
@ VKD3D_SHADER_SOURCE_D3D_BYTECODE
@ VKD3D_SHADER_SOURCE_DXBC_TPF
VKD3D_SHADER_API void vkd3d_shader_free_dxbc(struct vkd3d_shader_dxbc_desc *dxbc)
Definition: dxbc.c:290
VKD3D_SHADER_API int vkd3d_shader_parse_dxbc(const struct vkd3d_shader_code *dxbc, uint32_t flags, struct vkd3d_shader_dxbc_desc *desc, char **messages)
Definition: dxbc.c:320
wined3d_primitive_type
Definition: wined3d.h:74
@ WINED3D_PT_LINELIST
Definition: wined3d.h:77
@ WINED3D_PT_UNDEFINED
Definition: wined3d.h:75
@ WINED3D_PT_PATCH
Definition: wined3d.h:86
@ WINED3D_PT_POINTLIST
Definition: wined3d.h:76
@ WINED3D_PT_TRIANGLELIST_ADJ
Definition: wined3d.h:84
@ WINED3D_PT_LINELIST_ADJ
Definition: wined3d.h:82
@ WINED3D_PT_TRIANGLESTRIP
Definition: wined3d.h:80
@ WINED3D_PT_LINESTRIP
Definition: wined3d.h:78
@ WINED3D_PT_TRIANGLELIST
Definition: wined3d.h:79
#define WINED3D_OK
Definition: wined3d.h:33
wined3d_shader_type
Definition: wined3d.h:840
@ WINED3D_SHADER_TYPE_HULL
Definition: wined3d.h:844
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_GEOMETRY
Definition: wined3d.h:843
@ WINED3D_SHADER_TYPE_DOMAIN
Definition: wined3d.h:845
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842
@ WINED3D_SHADER_TYPE_INVALID
Definition: wined3d.h:850
#define MAX_REG_OUTPUT
wined3d_data_type
@ WINED3D_DATA_UINT
@ WINED3D_DATA_INT
@ WINED3D_DATA_UAV
@ WINED3D_DATA_SAMPLER
@ WINED3D_DATA_SNORM
@ WINED3D_DATA_UNORM
@ WINED3D_DATA_RESOURCE
@ WINED3D_DATA_FLOAT
@ WINED3D_DATA_OPAQUE
WINED3D_SHADER_INSTRUCTION_HANDLER
@ WINED3DSIH_DSX_COARSE
@ WINED3DSIH_DCL_TESSELLATOR_PARTITIONING
@ WINED3DSIH_MOVC
@ WINED3DSIH_ULT
@ WINED3DSIH_SINCOS
@ WINED3DSIH_DCL_TEMPS
@ WINED3DSIH_DP4
@ WINED3DSIH_GATHER4_PO_C
@ WINED3DSIH_ATOMIC_XOR
@ WINED3DSIH_MUL
@ WINED3DSIH_DSX_FINE
@ WINED3DSIH_DCL_OUTPUT
@ WINED3DSIH_DCL_FUNCTION_TABLE
@ WINED3DSIH_DCL_INPUT_SIV
@ WINED3DSIH_IMM_ATOMIC_XOR
@ WINED3DSIH_IEQ
@ WINED3DSIH_DCL_INPUT
@ WINED3DSIH_CONTINUE
@ WINED3DSIH_CONTINUEP
@ WINED3DSIH_FIRSTBIT_HI
@ WINED3DSIH_IADD
@ WINED3DSIH_SAMPLE_B
@ WINED3DSIH_DCL_CONSTANT_BUFFER
@ WINED3DSIH_ROUND_Z
@ WINED3DSIH_DCL_INTERFACE
@ WINED3DSIH_IMM_ATOMIC_IADD
@ WINED3DSIH_LOOP
@ WINED3DSIH_DSY_COARSE
@ WINED3DSIH_SAMPLE_LOD
@ WINED3DSIH_SYNC
@ WINED3DSIH_ISHL
@ WINED3DSIH_SWITCH
@ WINED3DSIH_SWAPC
@ WINED3DSIH_RCP
@ WINED3DSIH_F16TOF32
@ WINED3DSIH_IMIN
@ WINED3DSIH_STORE_STRUCTURED
@ WINED3DSIH_NOP
@ WINED3DSIH_ENDIF
@ WINED3DSIH_IMM_ATOMIC_UMAX
@ WINED3DSIH_STORE_UAV_TYPED
@ WINED3DSIH_FTOI
@ WINED3DSIH_LD
@ WINED3DSIH_EXP
@ WINED3DSIH_ATOMIC_IMAX
@ WINED3DSIH_DEFAULT
@ WINED3DSIH_UMAX
@ WINED3DSIH_OR
@ WINED3DSIH_ROUND_PI
@ WINED3DSIH_SAMPLE_GRAD
@ WINED3DSIH_ATOMIC_AND
@ WINED3DSIH_DCL_INPUT_SGV
@ WINED3DSIH_IF
@ WINED3DSIH_ATOMIC_UMIN
@ WINED3DSIH_UMIN
@ WINED3DSIH_ATOMIC_OR
@ WINED3DSIH_DCL_INPUT_PS_SGV
@ WINED3DSIH_LD2DMS
@ WINED3DSIH_LOG
@ WINED3DSIH_SAMPLE
@ WINED3DSIH_MOV
@ WINED3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER
@ WINED3DSIH_HS_DECLS
@ WINED3DSIH_AND
@ WINED3DSIH_DCL_THREAD_GROUP
@ WINED3DSIH_UMUL
@ WINED3DSIH_DCL_OUTPUT_SIV
@ WINED3DSIH_DCL_INDEX_RANGE
@ WINED3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE
@ WINED3DSIH_ATOMIC_CMP_STORE
@ WINED3DSIH_LD_RAW
@ WINED3DSIH_GATHER4
@ WINED3DSIH_UTOF
@ WINED3DSIH_ELSE
@ WINED3DSIH_HS_CONTROL_POINT_PHASE
@ WINED3DSIH_LD_STRUCTURED
@ WINED3DSIH_ENDSWITCH
@ WINED3DSIH_ATOMIC_IADD
@ WINED3DSIH_RSQ
@ WINED3DSIH_SQRT
@ WINED3DSIH_IMM_ATOMIC_AND
@ WINED3DSIH_IMM_ATOMIC_CONSUME
@ WINED3DSIH_EQ
@ WINED3DSIH_IMM_ATOMIC_UMIN
@ WINED3DSIH_ADD
@ WINED3DSIH_HS_FORK_PHASE
@ WINED3DSIH_BREAK
@ WINED3DSIH_NOT
@ WINED3DSIH_XOR
@ WINED3DSIH_BFREV
@ WINED3DSIH_FRC
@ WINED3DSIH_SAMPLE_INFO
@ WINED3DSIH_EVAL_CENTROID
@ WINED3DSIH_DSX
@ WINED3DSIH_DCL
@ WINED3DSIH_COUNTBITS
@ WINED3DSIH_IMM_ATOMIC_CMP_EXCH
@ WINED3DSIH_DCL_VERTICES_OUT
@ WINED3DSIH_HS_JOIN_PHASE
@ WINED3DSIH_USHR
@ WINED3DSIH_F32TOF16
@ WINED3DSIH_EMIT
@ WINED3DSIH_ILT
@ WINED3DSIH_DCL_OUTPUT_TOPOLOGY
@ WINED3DSIH_DCL_HS_MAX_TESSFACTOR
@ WINED3DSIH_UBFE
@ WINED3DSIH_ATOMIC_IMIN
@ WINED3DSIH_BREAKP
@ WINED3DSIH_BFI
@ WINED3DSIH_DCL_SAMPLER
@ WINED3DSIH_DCL_GS_INSTANCES
@ WINED3DSIH_DCL_TGSM_RAW
@ WINED3DSIH_DCL_UAV_TYPED
@ WINED3DSIH_MIN
@ WINED3DSIH_TABLE_SIZE
@ WINED3DSIH_GE
@ WINED3DSIH_DP3
@ WINED3DSIH_CUT
@ WINED3DSIH_EMIT_STREAM
@ WINED3DSIH_SAMPLE_POS
@ WINED3DSIH_FTOU
@ WINED3DSIH_RET
@ WINED3DSIH_IMAX
@ WINED3DSIH_ITOF
@ WINED3DSIH_IGE
@ WINED3DSIH_IMM_ATOMIC_IMAX
@ WINED3DSIH_SAMPLE_C_LZ
@ WINED3DSIH_LOD
@ WINED3DSIH_ENDLOOP
@ WINED3DSIH_DSY
@ WINED3DSIH_DCL_INPUT_PS
@ WINED3DSIH_GATHER4_C
@ WINED3DSIH_LD_UAV_TYPED
@ WINED3DSIH_INEG
@ WINED3DSIH_GATHER4_PO
@ WINED3DSIH_DCL_UAV_STRUCTURED
@ WINED3DSIH_LT
@ WINED3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT
@ WINED3DSIH_DCL_INPUT_CONTROL_POINT_COUNT
@ WINED3DSIH_DCL_GLOBAL_FLAGS
@ WINED3DSIH_TEXKILL
@ WINED3DSIH_UDIV
@ WINED3DSIH_EVAL_SAMPLE_INDEX
@ WINED3DSIH_ROUND_NI
@ WINED3DSIH_INE
@ WINED3DSIH_IBFE
@ WINED3DSIH_BUFINFO
@ WINED3DSIH_STORE_RAW
@ WINED3DSIH_IMM_ATOMIC_ALLOC
@ WINED3DSIH_IMM_ATOMIC_IMIN
@ WINED3DSIH_UGE
@ WINED3DSIH_MAD
@ WINED3DSIH_CUT_STREAM
@ WINED3DSIH_DCL_TESSELLATOR_DOMAIN
@ WINED3DSIH_LABEL
@ WINED3DSIH_IMM_ATOMIC_EXCH
@ WINED3DSIH_FCALL
@ WINED3DSIH_CASE
@ WINED3DSIH_IMUL
@ WINED3DSIH_IMAD
@ WINED3DSIH_NE
@ WINED3DSIH_FIRSTBIT_SHI
@ WINED3DSIH_RESINFO
@ WINED3DSIH_DCL_INPUT_PS_SIV
@ WINED3DSIH_DCL_TGSM_STRUCTURED
@ WINED3DSIH_FIRSTBIT_LO
@ WINED3DSIH_SAMPLE_C
@ WINED3DSIH_ROUND_NE
@ WINED3DSIH_DCL_UAV_RAW
@ WINED3DSIH_DCL_FUNCTION_BODY
@ WINED3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT
@ WINED3DSIH_IMM_ATOMIC_OR
@ WINED3DSIH_DCL_STREAM
@ WINED3DSIH_DIV
@ WINED3DSIH_ATOMIC_UMAX
@ WINED3DSIH_DCL_INDEXABLE_TEMP
@ WINED3DSIH_DCL_RESOURCE_RAW
@ WINED3DSIH_MAX
@ WINED3DSIH_DCL_INPUT_PRIMITIVE
@ WINED3DSIH_RETP
@ WINED3DSIH_ISHR
@ WINED3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT
@ WINED3DSIH_DP2
@ WINED3DSIH_DSY_FINE
@ WINED3DSIH_DCL_RESOURCE_STRUCTURED
#define WINED3D_SM5_DS
wined3d_shader_src_modifier
@ WINED3DSPSM_ABSNEG
@ WINED3DSPSM_ABS
@ WINED3DSPSM_NONE
@ WINED3DSPSM_NEG
#define WINED3D_SM4_PS
wined3d_shader_dst_modifier
@ WINED3DSPDM_SATURATE
@ WINED3DSPDM_NONE
wined3d_shader_resource_type
@ WINED3D_SHADER_RESOURCE_BUFFER
@ WINED3D_SHADER_RESOURCE_TEXTURE_3D
@ WINED3D_SHADER_RESOURCE_TEXTURE_2D
@ WINED3D_SHADER_RESOURCE_TEXTURE_1DARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DARRAY
@ WINED3D_SHADER_RESOURCE_NONE
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_2DMS
@ WINED3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY
@ WINED3D_SHADER_RESOURCE_TEXTURE_CUBE
@ WINED3D_SHADER_RESOURCE_TEXTURE_1D
#define MAX_IMMEDIATE_CONSTANT_BUFFER_SIZE
#define WINED3DSI_INDEXED_DYNAMIC
wined3d_shader_register_type
@ WINED3DSPR_RESOURCE
@ WINED3DSPR_COLOROUT
@ WINED3DSPR_RASTERIZER
@ WINED3DSPR_PRIMID
@ WINED3DSPR_LOCALTHREADID
@ WINED3DSPR_FUNCTIONPOINTER
@ WINED3DSPR_IMMCONST
@ WINED3DSPR_OUTPOINTID
@ WINED3DSPR_OUTCONTROLPOINT
@ WINED3DSPR_INCONTROLPOINT
@ WINED3DSPR_TESSCOORD
@ WINED3DSPR_NULL
@ WINED3DSPR_GSINSTID
@ WINED3DSPR_THREADGROUPID
@ WINED3DSPR_STENCILREF
@ WINED3DSPR_JOININSTID
@ WINED3DSPR_DEPTHOUTGE
@ WINED3DSPR_UAV
@ WINED3DSPR_SAMPLER
@ WINED3DSPR_CONSTBUFFER
@ WINED3DSPR_FUNCTIONBODY
@ WINED3DSPR_IDXTEMP
@ WINED3DSPR_STREAM
@ WINED3DSPR_PATCHCONST
@ WINED3DSPR_OUTPUT
@ WINED3DSPR_INPUT
@ WINED3DSPR_GROUPSHAREDMEM
@ WINED3DSPR_SAMPLEMASK
@ WINED3DSPR_TEMP
@ WINED3DSPR_DEPTHOUT
@ WINED3DSPR_THREADID
@ WINED3DSPR_COVERAGE
@ WINED3DSPR_LOCALTHREADINDEX
@ WINED3DSPR_FORKINSTID
@ WINED3DSPR_DEPTHOUTLE
@ WINED3DSPR_IMMCONSTBUFFER
#define WINED3DSI_PRECISE_SHIFT
#define WINED3DSP_NOSWIZZLE
@ WINED3D_IMMCONST_VEC4
@ WINED3D_IMMCONST_SCALAR
#define WINED3D_SM5_HS
#define WINED3D_SM4_GS
#define WINED3D_SM4_VS
#define WINED3D_SM5_CS
@ WINED3D_SHADER_CONDITIONAL_OP_NZ
@ WINED3D_SHADER_CONDITIONAL_OP_Z