/* * Copyright © Microsoft Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef DXIL_SIGNATURE_H #define DXIL_SIGNATURE_H #include "dxil_enums.h" #include "nir.h" #include "util/string_buffer.h" #ifdef __cplusplus extern "C" { #endif /* struct taken from DXILContainer * Enums values were replaced by uint32_t since they must occupy 32 bit */ struct dxil_signature_element { uint32_t stream; // Stream index (parameters must appear in non-decreasing stream order) uint32_t semantic_name_offset; // Offset to char * stream from start of DxilProgramSignature. uint32_t semantic_index; // Semantic Index uint32_t system_value; // Semantic type. Similar to DxilSemantic::Kind, but a serialized rather than processing rep. uint32_t comp_type; // Type of bits. uint32_t reg; // Register Index (row index) uint8_t mask; // Mask (column allocation) union { // Unconditional cases useful for validation of shader linkage. uint8_t never_writes_mask; // For an output signature, the shader the signature belongs to never // writes the masked components of the output register. uint8_t always_reads_mask; // For an input signature, the shader the signature belongs to always // reads the masked components of the input register. }; uint16_t pad; uint32_t min_precision; // Minimum precision of input/output data }; struct dxil_signature_record { struct dxil_signature_element elements[32]; unsigned num_elements; const char *sysvalue; char *name; }; struct dxil_psv_sem_index_table { uint32_t data[80]; uint32_t size; }; struct dxil_psv_signature_element { uint32_t semantic_name_offset; // Offset into StringTable uint32_t semantic_indexes_offset; // Offset into PSVSemanticIndexTable, count == Rows uint8_t rows; // Number of rows this element occupies uint8_t start_row; // Starting row of packing location if allocated uint8_t cols_and_start; // 0:4 = Cols, 4:6 = StartCol, 6:7 == Allocated uint8_t semantic_kind; // PSVSemanticKind uint8_t component_type; // DxilProgramSigCompType uint8_t interpolation_mode; // DXIL::InterpolationMode or D3D10_SB_INTERPOLATION_MODE uint8_t dynamic_mask_and_stream; // 0:4 = DynamicIndexMask, 4:6 = OutputStream (0-3) uint8_t reserved; }; struct dxil_psv_runtime_info_0 { union { struct { char output_position_present; } vs; struct { uint32_t input_primitive; uint32_t output_toplology; uint32_t output_stream_mask; char output_position_present; } gs; struct { char depth_output; char sample_frequency; } ps; /* Maximum sized defining the union size (MSInfo)*/ struct { uint32_t dummy1[3]; uint16_t dummy2[2]; } dummy; }; uint32_t min_expected_wave_lane_count; // minimum lane count required, 0 if unused uint32_t max_expected_wave_lane_count; // maximum lane count required, 0xffffffff if unused }; struct dxil_psv_runtime_info_1 { struct dxil_psv_runtime_info_0 psv0; uint8_t shader_stage; // PSVShaderKind uint8_t uses_view_id; union { uint16_t max_vertex_count; // MaxVertexCount for GS only (max 1024) uint8_t sig_patch_const_or_prim_vectors; // Output for HS; Input for DS; Primitive output for MS (overlaps MS1::SigPrimVectors) // struct { uint8_t dummy[2]; } fill; }; // PSVSignatureElement counts uint8_t sig_input_elements; uint8_t sig_output_elements; uint8_t sig_patch_const_or_prim_elements; // Number of packed vectors per signature uint8_t sig_input_vectors; uint8_t sig_output_vectors[4]; }; struct dxil_mdnode; struct dxil_module; const struct dxil_mdnode * get_signatures(struct dxil_module *mod, nir_shader *s, bool vulkan); #ifdef __cplusplus } #endif #endif