xref: /aosp_15_r20/external/mesa3d/src/microsoft/compiler/dxil_signature.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © Microsoft Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef DXIL_SIGNATURE_H
25*61046927SAndroid Build Coastguard Worker #define DXIL_SIGNATURE_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include "dxil_enums.h"
28*61046927SAndroid Build Coastguard Worker #include "nir.h"
29*61046927SAndroid Build Coastguard Worker #include "util/string_buffer.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
32*61046927SAndroid Build Coastguard Worker extern "C" {
33*61046927SAndroid Build Coastguard Worker #endif
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker /* struct taken from DXILContainer
36*61046927SAndroid Build Coastguard Worker  * Enums values were replaced by uint32_t since they must occupy 32 bit
37*61046927SAndroid Build Coastguard Worker  */
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker struct dxil_signature_element {
40*61046927SAndroid Build Coastguard Worker    uint32_t stream;                   // Stream index (parameters must appear in non-decreasing stream order)
41*61046927SAndroid Build Coastguard Worker    uint32_t semantic_name_offset;     // Offset to char * stream from start of DxilProgramSignature.
42*61046927SAndroid Build Coastguard Worker    uint32_t semantic_index;           // Semantic Index
43*61046927SAndroid Build Coastguard Worker    uint32_t system_value;             // Semantic type. Similar to DxilSemantic::Kind, but a serialized rather than processing rep.
44*61046927SAndroid Build Coastguard Worker    uint32_t comp_type;                // Type of bits.
45*61046927SAndroid Build Coastguard Worker    uint32_t reg;                      // Register Index (row index)
46*61046927SAndroid Build Coastguard Worker    uint8_t  mask;                     // Mask (column allocation)
47*61046927SAndroid Build Coastguard Worker    union {                            // Unconditional cases useful for validation of shader linkage.
48*61046927SAndroid Build Coastguard Worker       uint8_t never_writes_mask;      // For an output signature, the shader the signature belongs to never
49*61046927SAndroid Build Coastguard Worker                                       // writes the masked components of the output register.
50*61046927SAndroid Build Coastguard Worker       uint8_t always_reads_mask;      // For an input signature, the shader the signature belongs to always
51*61046927SAndroid Build Coastguard Worker                                       // reads the masked components of the input register.
52*61046927SAndroid Build Coastguard Worker    };
53*61046927SAndroid Build Coastguard Worker    uint16_t pad;
54*61046927SAndroid Build Coastguard Worker    uint32_t min_precision;             // Minimum precision of input/output data
55*61046927SAndroid Build Coastguard Worker };
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker struct dxil_signature_record {
58*61046927SAndroid Build Coastguard Worker    struct dxil_signature_element elements[32];
59*61046927SAndroid Build Coastguard Worker    unsigned num_elements;
60*61046927SAndroid Build Coastguard Worker    const char *sysvalue;
61*61046927SAndroid Build Coastguard Worker    char *name;
62*61046927SAndroid Build Coastguard Worker    uint8_t sig_comp_type;
63*61046927SAndroid Build Coastguard Worker };
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker struct dxil_psv_sem_index_table {
66*61046927SAndroid Build Coastguard Worker    uint32_t data[128];
67*61046927SAndroid Build Coastguard Worker    uint32_t size;
68*61046927SAndroid Build Coastguard Worker };
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker struct dxil_psv_signature_element {
71*61046927SAndroid Build Coastguard Worker    uint32_t semantic_name_offset;          // Offset into StringTable
72*61046927SAndroid Build Coastguard Worker    uint32_t semantic_indexes_offset;       // Offset into PSVSemanticIndexTable, count == Rows
73*61046927SAndroid Build Coastguard Worker    uint8_t rows;                   // Number of rows this element occupies
74*61046927SAndroid Build Coastguard Worker    uint8_t start_row;               // Starting row of packing location if allocated
75*61046927SAndroid Build Coastguard Worker    uint8_t cols_and_start;           // 0:4 = Cols, 4:6 = StartCol, 6:7 == Allocated
76*61046927SAndroid Build Coastguard Worker    uint8_t semantic_kind;           // PSVSemanticKind
77*61046927SAndroid Build Coastguard Worker    uint8_t component_type;          // DxilProgramSigCompType
78*61046927SAndroid Build Coastguard Worker    uint8_t interpolation_mode;      // DXIL::InterpolationMode or D3D10_SB_INTERPOLATION_MODE
79*61046927SAndroid Build Coastguard Worker    uint8_t dynamic_mask_and_stream;   // 0:4 = DynamicIndexMask, 4:6 = OutputStream (0-3)
80*61046927SAndroid Build Coastguard Worker    uint8_t reserved;
81*61046927SAndroid Build Coastguard Worker };
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker struct dxil_psv_runtime_info_0 {
84*61046927SAndroid Build Coastguard Worker    union {
85*61046927SAndroid Build Coastguard Worker       struct {
86*61046927SAndroid Build Coastguard Worker          char output_position_present;
87*61046927SAndroid Build Coastguard Worker       } vs;
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker       struct {
90*61046927SAndroid Build Coastguard Worker          uint32_t input_control_point_count;
91*61046927SAndroid Build Coastguard Worker          uint32_t output_control_point_count;
92*61046927SAndroid Build Coastguard Worker          uint32_t tessellator_domain;
93*61046927SAndroid Build Coastguard Worker          uint32_t tessellator_output_primitive;
94*61046927SAndroid Build Coastguard Worker       } hs;
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker       struct {
97*61046927SAndroid Build Coastguard Worker          uint32_t input_control_point_count;
98*61046927SAndroid Build Coastguard Worker          char output_position_present;
99*61046927SAndroid Build Coastguard Worker          uint32_t tessellator_domain;
100*61046927SAndroid Build Coastguard Worker       } ds;
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker       struct {
103*61046927SAndroid Build Coastguard Worker          uint32_t input_primitive;
104*61046927SAndroid Build Coastguard Worker          uint32_t output_toplology;
105*61046927SAndroid Build Coastguard Worker          uint32_t output_stream_mask;
106*61046927SAndroid Build Coastguard Worker          char output_position_present;
107*61046927SAndroid Build Coastguard Worker       } gs;
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker       struct {
110*61046927SAndroid Build Coastguard Worker          char depth_output;
111*61046927SAndroid Build Coastguard Worker          char sample_frequency;
112*61046927SAndroid Build Coastguard Worker       } ps;
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker       /* Maximum sized defining the union size (MSInfo)*/
115*61046927SAndroid Build Coastguard Worker       struct {
116*61046927SAndroid Build Coastguard Worker          uint32_t dummy1[3];
117*61046927SAndroid Build Coastguard Worker          uint16_t dummy2[2];
118*61046927SAndroid Build Coastguard Worker       } dummy;
119*61046927SAndroid Build Coastguard Worker    };
120*61046927SAndroid Build Coastguard Worker    uint32_t min_expected_wave_lane_count;  // minimum lane count required, 0 if unused
121*61046927SAndroid Build Coastguard Worker    uint32_t max_expected_wave_lane_count;  // maximum lane count required, 0xffffffff if unused
122*61046927SAndroid Build Coastguard Worker };
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker struct dxil_psv_runtime_info_1 {
125*61046927SAndroid Build Coastguard Worker    struct dxil_psv_runtime_info_0 psv0;
126*61046927SAndroid Build Coastguard Worker    uint8_t shader_stage;              // PSVShaderKind
127*61046927SAndroid Build Coastguard Worker    uint8_t uses_view_id;
128*61046927SAndroid Build Coastguard Worker    union {
129*61046927SAndroid Build Coastguard Worker      uint16_t max_vertex_count;          // MaxVertexCount for GS only (max 1024)
130*61046927SAndroid Build Coastguard Worker      uint8_t sig_patch_const_or_prim_vectors;  // Output for HS; Input for DS; Primitive output for MS (overlaps MS1::SigPrimVectors)
131*61046927SAndroid Build Coastguard Worker      // struct { uint8_t dummy[2]; } fill;
132*61046927SAndroid Build Coastguard Worker    };
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    // PSVSignatureElement counts
135*61046927SAndroid Build Coastguard Worker    uint8_t sig_input_elements;
136*61046927SAndroid Build Coastguard Worker    uint8_t sig_output_elements;
137*61046927SAndroid Build Coastguard Worker    uint8_t sig_patch_const_or_prim_elements;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    // Number of packed vectors per signature
140*61046927SAndroid Build Coastguard Worker    uint8_t sig_input_vectors;
141*61046927SAndroid Build Coastguard Worker    uint8_t sig_output_vectors[4];
142*61046927SAndroid Build Coastguard Worker };
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker struct dxil_psv_runtime_info_2 {
145*61046927SAndroid Build Coastguard Worker    struct dxil_psv_runtime_info_1 psv1;
146*61046927SAndroid Build Coastguard Worker    uint32_t num_threads_x;
147*61046927SAndroid Build Coastguard Worker    uint32_t num_threads_y;
148*61046927SAndroid Build Coastguard Worker    uint32_t num_threads_z;
149*61046927SAndroid Build Coastguard Worker };
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker struct dxil_mdnode;
152*61046927SAndroid Build Coastguard Worker struct dxil_module;
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker void
155*61046927SAndroid Build Coastguard Worker preprocess_signatures(struct dxil_module *mod, nir_shader *s, unsigned input_clip_size);
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode *
158*61046927SAndroid Build Coastguard Worker get_signatures(struct dxil_module *mod);
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker #endif
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker #endif
165