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 /* 25*61046927SAndroid Build Coastguard Worker * See the DirectX Shader Compiler for documentation for DXIL details: 26*61046927SAndroid Build Coastguard Worker * https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/DXIL.rst 27*61046927SAndroid Build Coastguard Worker */ 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker #ifndef DXIL_MODULE_H 30*61046927SAndroid Build Coastguard Worker #define DXIL_MODULE_H 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 33*61046927SAndroid Build Coastguard Worker extern "C" { 34*61046927SAndroid Build Coastguard Worker #endif 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker #include "dxil_buffer.h" 37*61046927SAndroid Build Coastguard Worker #include "dxil_signature.h" 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker #include "util/list.h" 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker #define DXIL_SHADER_MAX_IO_ROWS 128 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker enum dxil_shader_kind { 45*61046927SAndroid Build Coastguard Worker DXIL_PIXEL_SHADER = 0, 46*61046927SAndroid Build Coastguard Worker DXIL_VERTEX_SHADER = 1, 47*61046927SAndroid Build Coastguard Worker DXIL_GEOMETRY_SHADER = 2, 48*61046927SAndroid Build Coastguard Worker DXIL_HULL_SHADER = 3, 49*61046927SAndroid Build Coastguard Worker DXIL_DOMAIN_SHADER = 4, 50*61046927SAndroid Build Coastguard Worker DXIL_COMPUTE_SHADER = 5, 51*61046927SAndroid Build Coastguard Worker }; 52*61046927SAndroid Build Coastguard Worker 53*61046927SAndroid Build Coastguard Worker extern int debug_dxil; 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker enum dxil_debug_flags { 56*61046927SAndroid Build Coastguard Worker DXIL_DEBUG_VERBOSE = 1 << 0, 57*61046927SAndroid Build Coastguard Worker DXIL_DEBUG_DUMP_BLOB = 1 << 1, 58*61046927SAndroid Build Coastguard Worker DXIL_DEBUG_TRACE = 1 << 2, 59*61046927SAndroid Build Coastguard Worker DXIL_DEBUG_DUMP_MODULE = 1 << 3, 60*61046927SAndroid Build Coastguard Worker }; 61*61046927SAndroid Build Coastguard Worker 62*61046927SAndroid Build Coastguard Worker enum dxil_bin_opcode { 63*61046927SAndroid Build Coastguard Worker DXIL_BINOP_ADD = 0, 64*61046927SAndroid Build Coastguard Worker DXIL_BINOP_SUB = 1, 65*61046927SAndroid Build Coastguard Worker DXIL_BINOP_MUL = 2, 66*61046927SAndroid Build Coastguard Worker DXIL_BINOP_UDIV = 3, 67*61046927SAndroid Build Coastguard Worker DXIL_BINOP_SDIV = 4, 68*61046927SAndroid Build Coastguard Worker DXIL_BINOP_UREM = 5, 69*61046927SAndroid Build Coastguard Worker DXIL_BINOP_SREM = 6, 70*61046927SAndroid Build Coastguard Worker DXIL_BINOP_SHL = 7, 71*61046927SAndroid Build Coastguard Worker DXIL_BINOP_LSHR = 8, 72*61046927SAndroid Build Coastguard Worker DXIL_BINOP_ASHR = 9, 73*61046927SAndroid Build Coastguard Worker DXIL_BINOP_AND = 10, 74*61046927SAndroid Build Coastguard Worker DXIL_BINOP_OR = 11, 75*61046927SAndroid Build Coastguard Worker DXIL_BINOP_XOR = 12, 76*61046927SAndroid Build Coastguard Worker DXIL_BINOP_INSTR_COUNT 77*61046927SAndroid Build Coastguard Worker }; 78*61046927SAndroid Build Coastguard Worker 79*61046927SAndroid Build Coastguard Worker enum dxil_cast_opcode { 80*61046927SAndroid Build Coastguard Worker DXIL_CAST_TRUNC = 0, 81*61046927SAndroid Build Coastguard Worker DXIL_CAST_ZEXT = 1, 82*61046927SAndroid Build Coastguard Worker DXIL_CAST_SEXT = 2, 83*61046927SAndroid Build Coastguard Worker DXIL_CAST_FPTOUI = 3, 84*61046927SAndroid Build Coastguard Worker DXIL_CAST_FPTOSI = 4, 85*61046927SAndroid Build Coastguard Worker DXIL_CAST_UITOFP = 5, 86*61046927SAndroid Build Coastguard Worker DXIL_CAST_SITOFP = 6, 87*61046927SAndroid Build Coastguard Worker DXIL_CAST_FPTRUNC = 7, 88*61046927SAndroid Build Coastguard Worker DXIL_CAST_FPEXT = 8, 89*61046927SAndroid Build Coastguard Worker DXIL_CAST_PTRTOINT = 9, 90*61046927SAndroid Build Coastguard Worker DXIL_CAST_INTTOPTR = 10, 91*61046927SAndroid Build Coastguard Worker DXIL_CAST_BITCAST = 11, 92*61046927SAndroid Build Coastguard Worker DXIL_CAST_ADDRSPACECAST = 12, 93*61046927SAndroid Build Coastguard Worker DXIL_CAST_INSTR_COUNT 94*61046927SAndroid Build Coastguard Worker }; 95*61046927SAndroid Build Coastguard Worker 96*61046927SAndroid Build Coastguard Worker enum dxil_cmp_pred { 97*61046927SAndroid Build Coastguard Worker DXIL_FCMP_FALSE = 0, 98*61046927SAndroid Build Coastguard Worker DXIL_FCMP_OEQ = 1, 99*61046927SAndroid Build Coastguard Worker DXIL_FCMP_OGT = 2, 100*61046927SAndroid Build Coastguard Worker DXIL_FCMP_OGE = 3, 101*61046927SAndroid Build Coastguard Worker DXIL_FCMP_OLT = 4, 102*61046927SAndroid Build Coastguard Worker DXIL_FCMP_OLE = 5, 103*61046927SAndroid Build Coastguard Worker DXIL_FCMP_ONE = 6, 104*61046927SAndroid Build Coastguard Worker DXIL_FCMP_ORD = 7, 105*61046927SAndroid Build Coastguard Worker DXIL_FCMP_UNO = 8, 106*61046927SAndroid Build Coastguard Worker DXIL_FCMP_UEQ = 9, 107*61046927SAndroid Build Coastguard Worker DXIL_FCMP_UGT = 10, 108*61046927SAndroid Build Coastguard Worker DXIL_FCMP_UGE = 11, 109*61046927SAndroid Build Coastguard Worker DXIL_FCMP_ULT = 12, 110*61046927SAndroid Build Coastguard Worker DXIL_FCMP_ULE = 13, 111*61046927SAndroid Build Coastguard Worker DXIL_FCMP_UNE = 14, 112*61046927SAndroid Build Coastguard Worker DXIL_FCMP_TRUE = 15, 113*61046927SAndroid Build Coastguard Worker DXIL_ICMP_EQ = 32, 114*61046927SAndroid Build Coastguard Worker DXIL_ICMP_NE = 33, 115*61046927SAndroid Build Coastguard Worker DXIL_ICMP_UGT = 34, 116*61046927SAndroid Build Coastguard Worker DXIL_ICMP_UGE = 35, 117*61046927SAndroid Build Coastguard Worker DXIL_ICMP_ULT = 36, 118*61046927SAndroid Build Coastguard Worker DXIL_ICMP_ULE = 37, 119*61046927SAndroid Build Coastguard Worker DXIL_ICMP_SGT = 38, 120*61046927SAndroid Build Coastguard Worker DXIL_ICMP_SGE = 39, 121*61046927SAndroid Build Coastguard Worker DXIL_ICMP_SLT = 40, 122*61046927SAndroid Build Coastguard Worker DXIL_ICMP_SLE = 41, 123*61046927SAndroid Build Coastguard Worker DXIL_CMP_INSTR_COUNT 124*61046927SAndroid Build Coastguard Worker }; 125*61046927SAndroid Build Coastguard Worker 126*61046927SAndroid Build Coastguard Worker enum dxil_opt_flags { 127*61046927SAndroid Build Coastguard Worker DXIL_UNSAFE_ALGEBRA = (1 << 0), 128*61046927SAndroid Build Coastguard Worker DXIL_NO_NANS = (1 << 1), 129*61046927SAndroid Build Coastguard Worker DXIL_NO_INFS = (1 << 2), 130*61046927SAndroid Build Coastguard Worker DXIL_NO_SIGNED_ZEROS = (1 << 3), 131*61046927SAndroid Build Coastguard Worker DXIL_ALLOW_RECIPROCAL = (1 << 4) 132*61046927SAndroid Build Coastguard Worker }; 133*61046927SAndroid Build Coastguard Worker 134*61046927SAndroid Build Coastguard Worker struct dxil_features { 135*61046927SAndroid Build Coastguard Worker uint64_t doubles : 1, 136*61046927SAndroid Build Coastguard Worker cs_4x_raw_sb : 1, 137*61046927SAndroid Build Coastguard Worker uavs_at_every_stage : 1, 138*61046927SAndroid Build Coastguard Worker use_64uavs : 1, 139*61046927SAndroid Build Coastguard Worker min_precision : 1, 140*61046927SAndroid Build Coastguard Worker dx11_1_double_extensions : 1, 141*61046927SAndroid Build Coastguard Worker dx11_1_shader_extensions : 1, 142*61046927SAndroid Build Coastguard Worker dx9_comparison_filtering : 1, 143*61046927SAndroid Build Coastguard Worker tiled_resources : 1, 144*61046927SAndroid Build Coastguard Worker stencil_ref : 1, 145*61046927SAndroid Build Coastguard Worker inner_coverage : 1, 146*61046927SAndroid Build Coastguard Worker typed_uav_load_additional_formats : 1, 147*61046927SAndroid Build Coastguard Worker rovs : 1, 148*61046927SAndroid Build Coastguard Worker array_layer_from_vs_or_ds : 1, 149*61046927SAndroid Build Coastguard Worker wave_ops : 1, 150*61046927SAndroid Build Coastguard Worker int64_ops : 1, 151*61046927SAndroid Build Coastguard Worker view_id : 1, 152*61046927SAndroid Build Coastguard Worker barycentrics : 1, 153*61046927SAndroid Build Coastguard Worker native_low_precision : 1, 154*61046927SAndroid Build Coastguard Worker shading_rate : 1, 155*61046927SAndroid Build Coastguard Worker raytracing_tier_1_1 : 1, 156*61046927SAndroid Build Coastguard Worker sampler_feedback : 1, 157*61046927SAndroid Build Coastguard Worker atomic_int64_typed : 1, 158*61046927SAndroid Build Coastguard Worker atomic_int64_tgsm : 1, 159*61046927SAndroid Build Coastguard Worker derivatives_in_mesh_or_amp : 1, 160*61046927SAndroid Build Coastguard Worker resource_descriptor_heap_indexing : 1, 161*61046927SAndroid Build Coastguard Worker sampler_descriptor_heap_indexing : 1, 162*61046927SAndroid Build Coastguard Worker unnamed : 1, 163*61046927SAndroid Build Coastguard Worker atomic_int64_heap_resource : 1, 164*61046927SAndroid Build Coastguard Worker advanced_texture_ops : 1, 165*61046927SAndroid Build Coastguard Worker writable_msaa : 1, 166*61046927SAndroid Build Coastguard Worker sample_cmp_bias_gradient : 1, 167*61046927SAndroid Build Coastguard Worker extended_command_info : 1; 168*61046927SAndroid Build Coastguard Worker }; 169*61046927SAndroid Build Coastguard Worker 170*61046927SAndroid Build Coastguard Worker struct dxil_shader_info { 171*61046927SAndroid Build Coastguard Worker unsigned has_out_position:1; 172*61046927SAndroid Build Coastguard Worker unsigned has_out_depth:1; 173*61046927SAndroid Build Coastguard Worker unsigned has_per_sample_input:1; 174*61046927SAndroid Build Coastguard Worker }; 175*61046927SAndroid Build Coastguard Worker 176*61046927SAndroid Build Coastguard Worker struct dxil_func_def { 177*61046927SAndroid Build Coastguard Worker struct list_head head; 178*61046927SAndroid Build Coastguard Worker const struct dxil_func *func; 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Worker struct list_head instr_list; 181*61046927SAndroid Build Coastguard Worker int *basic_block_ids; /* maps from "user" ids to LLVM ids */ 182*61046927SAndroid Build Coastguard Worker size_t num_basic_block_ids; 183*61046927SAndroid Build Coastguard Worker unsigned curr_block; 184*61046927SAndroid Build Coastguard Worker }; 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard Worker struct dxil_module { 187*61046927SAndroid Build Coastguard Worker void *ralloc_ctx; 188*61046927SAndroid Build Coastguard Worker enum dxil_shader_kind shader_kind; 189*61046927SAndroid Build Coastguard Worker unsigned major_version, minor_version; 190*61046927SAndroid Build Coastguard Worker unsigned major_validator, minor_validator; 191*61046927SAndroid Build Coastguard Worker struct dxil_features feats; 192*61046927SAndroid Build Coastguard Worker unsigned raw_and_structured_buffers : 1; 193*61046927SAndroid Build Coastguard Worker struct dxil_shader_info info; 194*61046927SAndroid Build Coastguard Worker 195*61046927SAndroid Build Coastguard Worker struct dxil_buffer buf; 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker /* The number of entries in the arrays below */ 198*61046927SAndroid Build Coastguard Worker unsigned num_sig_inputs; 199*61046927SAndroid Build Coastguard Worker unsigned num_sig_outputs; 200*61046927SAndroid Build Coastguard Worker unsigned num_sig_patch_consts; 201*61046927SAndroid Build Coastguard Worker 202*61046927SAndroid Build Coastguard Worker /* The number of "vectors" of elements. This is used to determine the sizes 203*61046927SAndroid Build Coastguard Worker * of the dependency tables. 204*61046927SAndroid Build Coastguard Worker */ 205*61046927SAndroid Build Coastguard Worker unsigned num_psv_inputs; 206*61046927SAndroid Build Coastguard Worker unsigned num_psv_outputs[4]; 207*61046927SAndroid Build Coastguard Worker unsigned num_psv_patch_consts; 208*61046927SAndroid Build Coastguard Worker 209*61046927SAndroid Build Coastguard Worker struct dxil_signature_record inputs[DXIL_SHADER_MAX_IO_ROWS]; 210*61046927SAndroid Build Coastguard Worker struct dxil_signature_record outputs[DXIL_SHADER_MAX_IO_ROWS]; 211*61046927SAndroid Build Coastguard Worker struct dxil_signature_record patch_consts[DXIL_SHADER_MAX_IO_ROWS]; 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker /* This array is indexed using var->data.driver_location, which 214*61046927SAndroid Build Coastguard Worker * is not a direct match to IO rows, since a row is a vec4, and 215*61046927SAndroid Build Coastguard Worker * variables can occupy less than that, and several vars can 216*61046927SAndroid Build Coastguard Worker * be packed in a row. Hence the x4, but I doubt we can end up 217*61046927SAndroid Build Coastguard Worker * with more than 80x4 variables in practice. Maybe this array 218*61046927SAndroid Build Coastguard Worker * should be allocated dynamically based on on the maximum 219*61046927SAndroid Build Coastguard Worker * driver_location across all input vars. 220*61046927SAndroid Build Coastguard Worker */ 221*61046927SAndroid Build Coastguard Worker unsigned input_mappings[DXIL_SHADER_MAX_IO_ROWS * 4]; 222*61046927SAndroid Build Coastguard Worker 223*61046927SAndroid Build Coastguard Worker struct dxil_psv_signature_element psv_inputs[DXIL_SHADER_MAX_IO_ROWS]; 224*61046927SAndroid Build Coastguard Worker struct dxil_psv_signature_element psv_outputs[DXIL_SHADER_MAX_IO_ROWS]; 225*61046927SAndroid Build Coastguard Worker struct dxil_psv_signature_element psv_patch_consts[DXIL_SHADER_MAX_IO_ROWS]; 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker struct _mesa_string_buffer *sem_string_table; 228*61046927SAndroid Build Coastguard Worker struct dxil_psv_sem_index_table sem_index_table; 229*61046927SAndroid Build Coastguard Worker 230*61046927SAndroid Build Coastguard Worker /* These tables are a bitmask per input, with one bit per output 231*61046927SAndroid Build Coastguard Worker * to indicate whether or not that input contributes to the output. 232*61046927SAndroid Build Coastguard Worker * Each input's bitmask size is rounded up to a uint32 (DWORD), 233*61046927SAndroid Build Coastguard Worker * so a bitbask for one output component is the same as for 8 output vec4s. 234*61046927SAndroid Build Coastguard Worker * Sizes are in number of uint32s. 235*61046927SAndroid Build Coastguard Worker * Meaning of each array entry depends on shader stage. 236*61046927SAndroid Build Coastguard Worker * GS: [i] = output stream index 237*61046927SAndroid Build Coastguard Worker * HS: [0] = control point outputs, [1] = patch constant outputs 238*61046927SAndroid Build Coastguard Worker * DS: [0] = control point inputs, [1] = patch constant inputs (only for io table) 239*61046927SAndroid Build Coastguard Worker * PS/VS: only 0 is used. */ 240*61046927SAndroid Build Coastguard Worker uint32_t *serialized_dependency_table; 241*61046927SAndroid Build Coastguard Worker uint32_t *viewid_dependency_table[4]; 242*61046927SAndroid Build Coastguard Worker uint32_t *io_dependency_table[4]; 243*61046927SAndroid Build Coastguard Worker uint32_t dependency_table_dwords_per_input[4]; 244*61046927SAndroid Build Coastguard Worker uint32_t io_dependency_table_size[4]; 245*61046927SAndroid Build Coastguard Worker uint32_t serialized_dependency_table_size; 246*61046927SAndroid Build Coastguard Worker 247*61046927SAndroid Build Coastguard Worker struct { 248*61046927SAndroid Build Coastguard Worker unsigned abbrev_width; 249*61046927SAndroid Build Coastguard Worker intptr_t offset; 250*61046927SAndroid Build Coastguard Worker } blocks[16]; 251*61046927SAndroid Build Coastguard Worker size_t num_blocks; 252*61046927SAndroid Build Coastguard Worker 253*61046927SAndroid Build Coastguard Worker struct list_head type_list; 254*61046927SAndroid Build Coastguard Worker struct list_head gvar_list; 255*61046927SAndroid Build Coastguard Worker struct list_head func_list; 256*61046927SAndroid Build Coastguard Worker struct list_head func_def_list; 257*61046927SAndroid Build Coastguard Worker struct list_head attr_set_list; 258*61046927SAndroid Build Coastguard Worker struct list_head const_list; 259*61046927SAndroid Build Coastguard Worker struct list_head mdnode_list; 260*61046927SAndroid Build Coastguard Worker struct list_head md_named_node_list; 261*61046927SAndroid Build Coastguard Worker const struct dxil_type *void_type; 262*61046927SAndroid Build Coastguard Worker const struct dxil_type *int1_type, *int8_type, *int16_type, 263*61046927SAndroid Build Coastguard Worker *int32_type, *int64_type; 264*61046927SAndroid Build Coastguard Worker const struct dxil_type *float16_type, *float32_type, *float64_type; 265*61046927SAndroid Build Coastguard Worker 266*61046927SAndroid Build Coastguard Worker struct rb_tree *functions; 267*61046927SAndroid Build Coastguard Worker 268*61046927SAndroid Build Coastguard Worker struct dxil_func_def *cur_emitting_func; 269*61046927SAndroid Build Coastguard Worker }; 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker struct dxil_instr; 272*61046927SAndroid Build Coastguard Worker struct dxil_value; 273*61046927SAndroid Build Coastguard Worker 274*61046927SAndroid Build Coastguard Worker void 275*61046927SAndroid Build Coastguard Worker dxil_module_init(struct dxil_module *m, void *ralloc_ctx); 276*61046927SAndroid Build Coastguard Worker 277*61046927SAndroid Build Coastguard Worker void 278*61046927SAndroid Build Coastguard Worker dxil_module_release(struct dxil_module *m); 279*61046927SAndroid Build Coastguard Worker 280*61046927SAndroid Build Coastguard Worker const struct dxil_value * 281*61046927SAndroid Build Coastguard Worker dxil_add_global_var(struct dxil_module *m, const char *name, 282*61046927SAndroid Build Coastguard Worker const struct dxil_type *type, 283*61046927SAndroid Build Coastguard Worker enum dxil_address_space as, int align, 284*61046927SAndroid Build Coastguard Worker const struct dxil_value *value); 285*61046927SAndroid Build Coastguard Worker 286*61046927SAndroid Build Coastguard Worker const struct dxil_value * 287*61046927SAndroid Build Coastguard Worker dxil_add_global_ptr_var(struct dxil_module *m, const char *name, 288*61046927SAndroid Build Coastguard Worker const struct dxil_type *type, 289*61046927SAndroid Build Coastguard Worker enum dxil_address_space as, int align, 290*61046927SAndroid Build Coastguard Worker const struct dxil_value *value); 291*61046927SAndroid Build Coastguard Worker 292*61046927SAndroid Build Coastguard Worker struct dxil_func_def * 293*61046927SAndroid Build Coastguard Worker dxil_add_function_def(struct dxil_module *m, const char *name, 294*61046927SAndroid Build Coastguard Worker const struct dxil_type *type, unsigned num_blocks, 295*61046927SAndroid Build Coastguard Worker const char *const *attr_keys, const char *const *attr_values); 296*61046927SAndroid Build Coastguard Worker 297*61046927SAndroid Build Coastguard Worker const struct dxil_func * 298*61046927SAndroid Build Coastguard Worker dxil_add_function_decl(struct dxil_module *m, const char *name, 299*61046927SAndroid Build Coastguard Worker const struct dxil_type *type, 300*61046927SAndroid Build Coastguard Worker enum dxil_attr_kind attr); 301*61046927SAndroid Build Coastguard Worker 302*61046927SAndroid Build Coastguard Worker const struct dxil_type * 303*61046927SAndroid Build Coastguard Worker dxil_module_get_void_type(struct dxil_module *m); 304*61046927SAndroid Build Coastguard Worker 305*61046927SAndroid Build Coastguard Worker const struct dxil_type * 306*61046927SAndroid Build Coastguard Worker dxil_module_get_int_type(struct dxil_module *m, unsigned bit_size); 307*61046927SAndroid Build Coastguard Worker 308*61046927SAndroid Build Coastguard Worker const struct dxil_type * 309*61046927SAndroid Build Coastguard Worker dxil_module_get_float_type(struct dxil_module *m, unsigned bit_size); 310*61046927SAndroid Build Coastguard Worker 311*61046927SAndroid Build Coastguard Worker const struct dxil_type * 312*61046927SAndroid Build Coastguard Worker dxil_module_get_pointer_type(struct dxil_module *m, 313*61046927SAndroid Build Coastguard Worker const struct dxil_type *target); 314*61046927SAndroid Build Coastguard Worker 315*61046927SAndroid Build Coastguard Worker const struct dxil_type * 316*61046927SAndroid Build Coastguard Worker dxil_get_overload_type(struct dxil_module *mod, enum overload_type overload); 317*61046927SAndroid Build Coastguard Worker 318*61046927SAndroid Build Coastguard Worker const struct dxil_type * 319*61046927SAndroid Build Coastguard Worker dxil_module_get_handle_type(struct dxil_module *m); 320*61046927SAndroid Build Coastguard Worker 321*61046927SAndroid Build Coastguard Worker const struct dxil_type * 322*61046927SAndroid Build Coastguard Worker dxil_module_get_cbuf_ret_type(struct dxil_module *mod, enum overload_type overload); 323*61046927SAndroid Build Coastguard Worker 324*61046927SAndroid Build Coastguard Worker const struct dxil_type * 325*61046927SAndroid Build Coastguard Worker dxil_module_get_split_double_ret_type(struct dxil_module *mod); 326*61046927SAndroid Build Coastguard Worker 327*61046927SAndroid Build Coastguard Worker const struct dxil_type * 328*61046927SAndroid Build Coastguard Worker dxil_module_get_res_type(struct dxil_module *m, enum dxil_resource_kind kind, 329*61046927SAndroid Build Coastguard Worker enum dxil_component_type comp_type, unsigned num_comps, 330*61046927SAndroid Build Coastguard Worker bool readwrite); 331*61046927SAndroid Build Coastguard Worker 332*61046927SAndroid Build Coastguard Worker const struct dxil_type * 333*61046927SAndroid Build Coastguard Worker dxil_module_get_resret_type(struct dxil_module *m, enum overload_type overload); 334*61046927SAndroid Build Coastguard Worker 335*61046927SAndroid Build Coastguard Worker const struct dxil_type * 336*61046927SAndroid Build Coastguard Worker dxil_module_get_dimret_type(struct dxil_module *m); 337*61046927SAndroid Build Coastguard Worker 338*61046927SAndroid Build Coastguard Worker const struct dxil_type * 339*61046927SAndroid Build Coastguard Worker dxil_module_get_samplepos_type(struct dxil_module *m); 340*61046927SAndroid Build Coastguard Worker 341*61046927SAndroid Build Coastguard Worker const struct dxil_type * 342*61046927SAndroid Build Coastguard Worker dxil_module_get_res_bind_type(struct dxil_module *m); 343*61046927SAndroid Build Coastguard Worker 344*61046927SAndroid Build Coastguard Worker const struct dxil_type * 345*61046927SAndroid Build Coastguard Worker dxil_module_get_res_props_type(struct dxil_module *m); 346*61046927SAndroid Build Coastguard Worker 347*61046927SAndroid Build Coastguard Worker const struct dxil_type * 348*61046927SAndroid Build Coastguard Worker dxil_module_get_fouri32_type(struct dxil_module *m); 349*61046927SAndroid Build Coastguard Worker 350*61046927SAndroid Build Coastguard Worker const struct dxil_type * 351*61046927SAndroid Build Coastguard Worker dxil_module_get_struct_type(struct dxil_module *m, 352*61046927SAndroid Build Coastguard Worker const char *name, 353*61046927SAndroid Build Coastguard Worker const struct dxil_type **elem_types, 354*61046927SAndroid Build Coastguard Worker size_t num_elem_types); 355*61046927SAndroid Build Coastguard Worker 356*61046927SAndroid Build Coastguard Worker const struct dxil_type * 357*61046927SAndroid Build Coastguard Worker dxil_module_get_array_type(struct dxil_module *m, 358*61046927SAndroid Build Coastguard Worker const struct dxil_type *elem_type, 359*61046927SAndroid Build Coastguard Worker size_t num_elems); 360*61046927SAndroid Build Coastguard Worker 361*61046927SAndroid Build Coastguard Worker const struct dxil_type * 362*61046927SAndroid Build Coastguard Worker dxil_module_get_vector_type(struct dxil_module *m, 363*61046927SAndroid Build Coastguard Worker const struct dxil_type *elem_type, 364*61046927SAndroid Build Coastguard Worker size_t num_elems); 365*61046927SAndroid Build Coastguard Worker 366*61046927SAndroid Build Coastguard Worker const struct dxil_type * 367*61046927SAndroid Build Coastguard Worker dxil_module_add_function_type(struct dxil_module *m, 368*61046927SAndroid Build Coastguard Worker const struct dxil_type *ret_type, 369*61046927SAndroid Build Coastguard Worker const struct dxil_type **arg_types, 370*61046927SAndroid Build Coastguard Worker size_t num_arg_types); 371*61046927SAndroid Build Coastguard Worker 372*61046927SAndroid Build Coastguard Worker nir_alu_type 373*61046927SAndroid Build Coastguard Worker dxil_type_to_nir_type(const struct dxil_type *type); 374*61046927SAndroid Build Coastguard Worker 375*61046927SAndroid Build Coastguard Worker bool 376*61046927SAndroid Build Coastguard Worker dxil_value_type_equal_to(const struct dxil_value *value, 377*61046927SAndroid Build Coastguard Worker const struct dxil_type *lhs); 378*61046927SAndroid Build Coastguard Worker 379*61046927SAndroid Build Coastguard Worker bool 380*61046927SAndroid Build Coastguard Worker dxil_value_type_bitsize_equal_to(const struct dxil_value *value, unsigned bitsize); 381*61046927SAndroid Build Coastguard Worker 382*61046927SAndroid Build Coastguard Worker const struct dxil_type * 383*61046927SAndroid Build Coastguard Worker dxil_value_get_type(const struct dxil_value *value); 384*61046927SAndroid Build Coastguard Worker 385*61046927SAndroid Build Coastguard Worker const struct dxil_value * 386*61046927SAndroid Build Coastguard Worker dxil_module_get_int1_const(struct dxil_module *m, bool value); 387*61046927SAndroid Build Coastguard Worker 388*61046927SAndroid Build Coastguard Worker const struct dxil_value * 389*61046927SAndroid Build Coastguard Worker dxil_module_get_int8_const(struct dxil_module *m, int8_t value); 390*61046927SAndroid Build Coastguard Worker 391*61046927SAndroid Build Coastguard Worker const struct dxil_value * 392*61046927SAndroid Build Coastguard Worker dxil_module_get_int16_const(struct dxil_module *m, int16_t value); 393*61046927SAndroid Build Coastguard Worker 394*61046927SAndroid Build Coastguard Worker const struct dxil_value * 395*61046927SAndroid Build Coastguard Worker dxil_module_get_int32_const(struct dxil_module *m, int32_t value); 396*61046927SAndroid Build Coastguard Worker 397*61046927SAndroid Build Coastguard Worker const struct dxil_value * 398*61046927SAndroid Build Coastguard Worker dxil_module_get_int64_const(struct dxil_module *m, int64_t value); 399*61046927SAndroid Build Coastguard Worker 400*61046927SAndroid Build Coastguard Worker const struct dxil_value * 401*61046927SAndroid Build Coastguard Worker dxil_module_get_int_const(struct dxil_module *m, intmax_t value, 402*61046927SAndroid Build Coastguard Worker unsigned bit_size); 403*61046927SAndroid Build Coastguard Worker 404*61046927SAndroid Build Coastguard Worker const struct dxil_value * 405*61046927SAndroid Build Coastguard Worker dxil_module_get_float16_const(struct dxil_module *m, uint16_t); 406*61046927SAndroid Build Coastguard Worker 407*61046927SAndroid Build Coastguard Worker const struct dxil_value * 408*61046927SAndroid Build Coastguard Worker dxil_module_get_float_const(struct dxil_module *m, float value); 409*61046927SAndroid Build Coastguard Worker 410*61046927SAndroid Build Coastguard Worker const struct dxil_value * 411*61046927SAndroid Build Coastguard Worker dxil_module_get_double_const(struct dxil_module *m, double value); 412*61046927SAndroid Build Coastguard Worker 413*61046927SAndroid Build Coastguard Worker const struct dxil_value * 414*61046927SAndroid Build Coastguard Worker dxil_module_get_array_const(struct dxil_module *m, const struct dxil_type *type, 415*61046927SAndroid Build Coastguard Worker const struct dxil_value **values); 416*61046927SAndroid Build Coastguard Worker 417*61046927SAndroid Build Coastguard Worker const struct dxil_value * 418*61046927SAndroid Build Coastguard Worker dxil_module_get_vector_const(struct dxil_module *m, const struct dxil_type *type, 419*61046927SAndroid Build Coastguard Worker const struct dxil_value **values); 420*61046927SAndroid Build Coastguard Worker 421*61046927SAndroid Build Coastguard Worker const struct dxil_value * 422*61046927SAndroid Build Coastguard Worker dxil_module_get_struct_const(struct dxil_module *m, const struct dxil_type *type, 423*61046927SAndroid Build Coastguard Worker const struct dxil_value **values); 424*61046927SAndroid Build Coastguard Worker 425*61046927SAndroid Build Coastguard Worker const struct dxil_value * 426*61046927SAndroid Build Coastguard Worker dxil_module_get_undef(struct dxil_module *m, const struct dxil_type *type); 427*61046927SAndroid Build Coastguard Worker 428*61046927SAndroid Build Coastguard Worker const struct dxil_value * 429*61046927SAndroid Build Coastguard Worker dxil_module_get_res_bind_const(struct dxil_module *m, 430*61046927SAndroid Build Coastguard Worker uint32_t lower_bound, 431*61046927SAndroid Build Coastguard Worker uint32_t upper_bound, 432*61046927SAndroid Build Coastguard Worker uint32_t space, 433*61046927SAndroid Build Coastguard Worker uint8_t class); 434*61046927SAndroid Build Coastguard Worker 435*61046927SAndroid Build Coastguard Worker const struct dxil_value * 436*61046927SAndroid Build Coastguard Worker dxil_module_get_res_props_const(struct dxil_module *m, 437*61046927SAndroid Build Coastguard Worker enum dxil_resource_class class, 438*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode *mdnode); 439*61046927SAndroid Build Coastguard Worker 440*61046927SAndroid Build Coastguard Worker const struct dxil_value * 441*61046927SAndroid Build Coastguard Worker dxil_module_get_srv_res_props_const(struct dxil_module *m, 442*61046927SAndroid Build Coastguard Worker const nir_tex_instr *tex); 443*61046927SAndroid Build Coastguard Worker 444*61046927SAndroid Build Coastguard Worker const struct dxil_value * 445*61046927SAndroid Build Coastguard Worker dxil_module_get_sampler_res_props_const(struct dxil_module *m, 446*61046927SAndroid Build Coastguard Worker bool is_shadow); 447*61046927SAndroid Build Coastguard Worker 448*61046927SAndroid Build Coastguard Worker const struct dxil_value * 449*61046927SAndroid Build Coastguard Worker dxil_module_get_uav_res_props_const(struct dxil_module *m, 450*61046927SAndroid Build Coastguard Worker nir_intrinsic_instr *intr); 451*61046927SAndroid Build Coastguard Worker 452*61046927SAndroid Build Coastguard Worker const struct dxil_value * 453*61046927SAndroid Build Coastguard Worker dxil_module_get_buffer_res_props_const(struct dxil_module *m, 454*61046927SAndroid Build Coastguard Worker enum dxil_resource_class class, 455*61046927SAndroid Build Coastguard Worker enum dxil_resource_kind kind); 456*61046927SAndroid Build Coastguard Worker 457*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 458*61046927SAndroid Build Coastguard Worker dxil_get_metadata_string(struct dxil_module *m, const char *str); 459*61046927SAndroid Build Coastguard Worker 460*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 461*61046927SAndroid Build Coastguard Worker dxil_get_metadata_value(struct dxil_module *m, const struct dxil_type *type, 462*61046927SAndroid Build Coastguard Worker const struct dxil_value *value); 463*61046927SAndroid Build Coastguard Worker 464*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 465*61046927SAndroid Build Coastguard Worker dxil_get_metadata_func(struct dxil_module *m, const struct dxil_func *func); 466*61046927SAndroid Build Coastguard Worker 467*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 468*61046927SAndroid Build Coastguard Worker dxil_get_metadata_int1(struct dxil_module *m, bool value); 469*61046927SAndroid Build Coastguard Worker 470*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 471*61046927SAndroid Build Coastguard Worker dxil_get_metadata_int8(struct dxil_module *m, int8_t value); 472*61046927SAndroid Build Coastguard Worker 473*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 474*61046927SAndroid Build Coastguard Worker dxil_get_metadata_int32(struct dxil_module *m, int32_t value); 475*61046927SAndroid Build Coastguard Worker 476*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 477*61046927SAndroid Build Coastguard Worker dxil_get_metadata_int64(struct dxil_module *m, int64_t value); 478*61046927SAndroid Build Coastguard Worker 479*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 480*61046927SAndroid Build Coastguard Worker dxil_get_metadata_float32(struct dxil_module *m, float value); 481*61046927SAndroid Build Coastguard Worker 482*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode * 483*61046927SAndroid Build Coastguard Worker dxil_get_metadata_node(struct dxil_module *m, 484*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode *subnodes[], 485*61046927SAndroid Build Coastguard Worker size_t num_subnodes); 486*61046927SAndroid Build Coastguard Worker 487*61046927SAndroid Build Coastguard Worker bool 488*61046927SAndroid Build Coastguard Worker dxil_add_metadata_named_node(struct dxil_module *m, const char *name, 489*61046927SAndroid Build Coastguard Worker const struct dxil_mdnode *subnodes[], 490*61046927SAndroid Build Coastguard Worker size_t num_subnodes); 491*61046927SAndroid Build Coastguard Worker 492*61046927SAndroid Build Coastguard Worker const struct dxil_value * 493*61046927SAndroid Build Coastguard Worker dxil_emit_binop(struct dxil_module *m, enum dxil_bin_opcode opcode, 494*61046927SAndroid Build Coastguard Worker const struct dxil_value *op0, const struct dxil_value *op1, 495*61046927SAndroid Build Coastguard Worker enum dxil_opt_flags flags); 496*61046927SAndroid Build Coastguard Worker 497*61046927SAndroid Build Coastguard Worker const struct dxil_value * 498*61046927SAndroid Build Coastguard Worker dxil_emit_cmp(struct dxil_module *m, enum dxil_cmp_pred pred, 499*61046927SAndroid Build Coastguard Worker const struct dxil_value *op0, const struct dxil_value *op1); 500*61046927SAndroid Build Coastguard Worker 501*61046927SAndroid Build Coastguard Worker const struct dxil_value * 502*61046927SAndroid Build Coastguard Worker dxil_emit_select(struct dxil_module *m, 503*61046927SAndroid Build Coastguard Worker const struct dxil_value *op0, 504*61046927SAndroid Build Coastguard Worker const struct dxil_value *op1, 505*61046927SAndroid Build Coastguard Worker const struct dxil_value *op2); 506*61046927SAndroid Build Coastguard Worker 507*61046927SAndroid Build Coastguard Worker const struct dxil_value * 508*61046927SAndroid Build Coastguard Worker dxil_emit_extractval(struct dxil_module *m, const struct dxil_value *src, 509*61046927SAndroid Build Coastguard Worker const unsigned int index); 510*61046927SAndroid Build Coastguard Worker 511*61046927SAndroid Build Coastguard Worker const struct dxil_value * 512*61046927SAndroid Build Coastguard Worker dxil_emit_cast(struct dxil_module *m, enum dxil_cast_opcode opcode, 513*61046927SAndroid Build Coastguard Worker const struct dxil_type *type, 514*61046927SAndroid Build Coastguard Worker const struct dxil_value *value); 515*61046927SAndroid Build Coastguard Worker 516*61046927SAndroid Build Coastguard Worker bool 517*61046927SAndroid Build Coastguard Worker dxil_emit_branch(struct dxil_module *m, const struct dxil_value *cond, 518*61046927SAndroid Build Coastguard Worker unsigned true_block, unsigned false_block); 519*61046927SAndroid Build Coastguard Worker 520*61046927SAndroid Build Coastguard Worker const struct dxil_value * 521*61046927SAndroid Build Coastguard Worker dxil_instr_get_return_value(struct dxil_instr *instr); 522*61046927SAndroid Build Coastguard Worker 523*61046927SAndroid Build Coastguard Worker struct dxil_instr * 524*61046927SAndroid Build Coastguard Worker dxil_emit_phi(struct dxil_module *m, const struct dxil_type *type); 525*61046927SAndroid Build Coastguard Worker 526*61046927SAndroid Build Coastguard Worker bool 527*61046927SAndroid Build Coastguard Worker dxil_phi_add_incoming(struct dxil_instr *instr, 528*61046927SAndroid Build Coastguard Worker const struct dxil_value *incoming_values[], 529*61046927SAndroid Build Coastguard Worker const unsigned incoming_blocks[], 530*61046927SAndroid Build Coastguard Worker size_t num_incoming); 531*61046927SAndroid Build Coastguard Worker 532*61046927SAndroid Build Coastguard Worker const struct dxil_value * 533*61046927SAndroid Build Coastguard Worker dxil_emit_call(struct dxil_module *m, 534*61046927SAndroid Build Coastguard Worker const struct dxil_func *func, 535*61046927SAndroid Build Coastguard Worker const struct dxil_value **args, size_t num_args); 536*61046927SAndroid Build Coastguard Worker 537*61046927SAndroid Build Coastguard Worker bool 538*61046927SAndroid Build Coastguard Worker dxil_emit_call_void(struct dxil_module *m, 539*61046927SAndroid Build Coastguard Worker const struct dxil_func *func, 540*61046927SAndroid Build Coastguard Worker const struct dxil_value **args, size_t num_args); 541*61046927SAndroid Build Coastguard Worker 542*61046927SAndroid Build Coastguard Worker bool 543*61046927SAndroid Build Coastguard Worker dxil_emit_ret_void(struct dxil_module *m); 544*61046927SAndroid Build Coastguard Worker 545*61046927SAndroid Build Coastguard Worker const struct dxil_value * 546*61046927SAndroid Build Coastguard Worker dxil_emit_alloca(struct dxil_module *m, const struct dxil_type *alloc_type, 547*61046927SAndroid Build Coastguard Worker const struct dxil_value *size, 548*61046927SAndroid Build Coastguard Worker unsigned int align); 549*61046927SAndroid Build Coastguard Worker 550*61046927SAndroid Build Coastguard Worker const struct dxil_value * 551*61046927SAndroid Build Coastguard Worker dxil_emit_gep_inbounds(struct dxil_module *m, 552*61046927SAndroid Build Coastguard Worker const struct dxil_value **operands, 553*61046927SAndroid Build Coastguard Worker size_t num_operands); 554*61046927SAndroid Build Coastguard Worker 555*61046927SAndroid Build Coastguard Worker const struct dxil_value * 556*61046927SAndroid Build Coastguard Worker dxil_emit_load(struct dxil_module *m, const struct dxil_value *ptr, 557*61046927SAndroid Build Coastguard Worker unsigned align, 558*61046927SAndroid Build Coastguard Worker bool is_volatile); 559*61046927SAndroid Build Coastguard Worker 560*61046927SAndroid Build Coastguard Worker bool 561*61046927SAndroid Build Coastguard Worker dxil_emit_store(struct dxil_module *m, const struct dxil_value *value, 562*61046927SAndroid Build Coastguard Worker const struct dxil_value *ptr, unsigned align, 563*61046927SAndroid Build Coastguard Worker bool is_volatile); 564*61046927SAndroid Build Coastguard Worker 565*61046927SAndroid Build Coastguard Worker const struct dxil_value * 566*61046927SAndroid Build Coastguard Worker dxil_emit_cmpxchg(struct dxil_module *m, const struct dxil_value *cmpval, 567*61046927SAndroid Build Coastguard Worker const struct dxil_value *newval, 568*61046927SAndroid Build Coastguard Worker const struct dxil_value *ptr, bool is_volatile, 569*61046927SAndroid Build Coastguard Worker enum dxil_atomic_ordering ordering, 570*61046927SAndroid Build Coastguard Worker enum dxil_sync_scope syncscope); 571*61046927SAndroid Build Coastguard Worker 572*61046927SAndroid Build Coastguard Worker const struct dxil_value * 573*61046927SAndroid Build Coastguard Worker dxil_emit_atomicrmw(struct dxil_module *m, const struct dxil_value *value, 574*61046927SAndroid Build Coastguard Worker const struct dxil_value *ptr, enum dxil_rmw_op op, 575*61046927SAndroid Build Coastguard Worker bool is_volatile, enum dxil_atomic_ordering ordering, 576*61046927SAndroid Build Coastguard Worker enum dxil_sync_scope syncscope); 577*61046927SAndroid Build Coastguard Worker 578*61046927SAndroid Build Coastguard Worker bool 579*61046927SAndroid Build Coastguard Worker dxil_emit_module(struct dxil_module *m); 580*61046927SAndroid Build Coastguard Worker 581*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 582*61046927SAndroid Build Coastguard Worker } 583*61046927SAndroid Build Coastguard Worker #endif 584*61046927SAndroid Build Coastguard Worker 585*61046927SAndroid Build Coastguard Worker #endif 586