Home | History | Annotate | Download | only in common
      1 /*
      2  * Copyright  2016 Bas Nieuwenhuizen
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 #ifndef AC_NIR_TO_LLVM_H
     25 #define AC_NIR_TO_LLVM_H
     26 
     27 #include <stdbool.h>
     28 #include "llvm-c/Core.h"
     29 #include "llvm-c/TargetMachine.h"
     30 #include "amd_family.h"
     31 #include "../vulkan/radv_descriptor_set.h"
     32 #include "ac_shader_info.h"
     33 #include "compiler/shader_enums.h"
     34 struct ac_shader_binary;
     35 struct ac_shader_config;
     36 struct nir_shader;
     37 struct radv_pipeline_layout;
     38 
     39 struct ac_llvm_context;
     40 struct ac_shader_abi;
     41 
     42 struct ac_vs_variant_key {
     43 	uint32_t instance_rate_inputs;
     44 	uint32_t as_es:1;
     45 	uint32_t as_ls:1;
     46 	uint32_t export_prim_id:1;
     47 };
     48 
     49 struct ac_tes_variant_key {
     50 	uint32_t as_es:1;
     51 	uint32_t export_prim_id:1;
     52 };
     53 
     54 struct ac_tcs_variant_key {
     55 	struct ac_vs_variant_key vs_key;
     56 	unsigned primitive_mode;
     57 	unsigned input_vertices;
     58 	uint32_t tes_reads_tess_factors:1;
     59 };
     60 
     61 struct ac_fs_variant_key {
     62 	uint32_t col_format;
     63 	uint8_t log2_ps_iter_samples;
     64 	uint8_t log2_num_samples;
     65 	uint32_t is_int8;
     66 	uint32_t is_int10;
     67 	uint32_t multisample : 1;
     68 };
     69 
     70 struct ac_shader_variant_key {
     71 	union {
     72 		struct ac_vs_variant_key vs;
     73 		struct ac_fs_variant_key fs;
     74 		struct ac_tes_variant_key tes;
     75 		struct ac_tcs_variant_key tcs;
     76 	};
     77 	bool has_multiview_view_index;
     78 };
     79 
     80 struct ac_nir_compiler_options {
     81 	struct radv_pipeline_layout *layout;
     82 	struct ac_shader_variant_key key;
     83 	bool unsafe_math;
     84 	bool supports_spill;
     85 	bool clamp_shadow_reference;
     86 	bool dump_preoptir;
     87 	enum radeon_family family;
     88 	enum chip_class chip_class;
     89 };
     90 
     91 struct ac_userdata_info {
     92 	int8_t sgpr_idx;
     93 	uint8_t num_sgprs;
     94 	bool indirect;
     95 	uint32_t indirect_offset;
     96 };
     97 
     98 enum ac_ud_index {
     99 	AC_UD_SCRATCH_RING_OFFSETS = 0,
    100 	AC_UD_PUSH_CONSTANTS = 1,
    101 	AC_UD_INDIRECT_DESCRIPTOR_SETS = 2,
    102 	AC_UD_VIEW_INDEX = 3,
    103 	AC_UD_SHADER_START = 4,
    104 	AC_UD_VS_VERTEX_BUFFERS = AC_UD_SHADER_START,
    105 	AC_UD_VS_BASE_VERTEX_START_INSTANCE,
    106 	AC_UD_VS_LS_TCS_IN_LAYOUT,
    107 	AC_UD_VS_MAX_UD,
    108 	AC_UD_PS_SAMPLE_POS_OFFSET = AC_UD_SHADER_START,
    109 	AC_UD_PS_MAX_UD,
    110 	AC_UD_CS_GRID_SIZE = AC_UD_SHADER_START,
    111 	AC_UD_CS_MAX_UD,
    112 	AC_UD_GS_VS_RING_STRIDE_ENTRIES = AC_UD_VS_MAX_UD,
    113 	AC_UD_GS_MAX_UD,
    114 	AC_UD_TCS_OFFCHIP_LAYOUT = AC_UD_VS_MAX_UD,
    115 	AC_UD_TCS_MAX_UD,
    116 	AC_UD_TES_OFFCHIP_LAYOUT = AC_UD_SHADER_START,
    117 	AC_UD_TES_MAX_UD,
    118 	AC_UD_MAX_UD = AC_UD_TCS_MAX_UD,
    119 };
    120 
    121 /* descriptor index into scratch ring offsets */
    122 #define RING_SCRATCH 0
    123 #define RING_ESGS_VS 1
    124 #define RING_ESGS_GS 2
    125 #define RING_GSVS_VS 3
    126 #define RING_GSVS_GS 4
    127 #define RING_HS_TESS_FACTOR 5
    128 #define RING_HS_TESS_OFFCHIP 6
    129 #define RING_PS_SAMPLE_POSITIONS 7
    130 
    131 // Match MAX_SETS from radv_descriptor_set.h
    132 #define AC_UD_MAX_SETS MAX_SETS
    133 
    134 struct ac_userdata_locations {
    135 	struct ac_userdata_info descriptor_sets[AC_UD_MAX_SETS];
    136 	struct ac_userdata_info shader_data[AC_UD_MAX_UD];
    137 };
    138 
    139 struct ac_vs_output_info {
    140 	uint8_t	vs_output_param_offset[VARYING_SLOT_MAX];
    141 	uint8_t clip_dist_mask;
    142 	uint8_t cull_dist_mask;
    143 	uint8_t param_exports;
    144 	bool writes_pointsize;
    145 	bool writes_layer;
    146 	bool writes_viewport_index;
    147 	bool export_prim_id;
    148 	uint32_t export_mask;
    149 	unsigned pos_exports;
    150 };
    151 
    152 struct ac_es_output_info {
    153 	uint32_t esgs_itemsize;
    154 };
    155 
    156 struct ac_shader_variant_info {
    157 	struct ac_userdata_locations user_sgprs_locs;
    158 	struct ac_shader_info info;
    159 	unsigned num_user_sgprs;
    160 	unsigned num_input_sgprs;
    161 	unsigned num_input_vgprs;
    162 	bool need_indirect_descriptor_sets;
    163 	struct {
    164 		struct {
    165 			struct ac_vs_output_info outinfo;
    166 			struct ac_es_output_info es_info;
    167 			unsigned vgpr_comp_cnt;
    168 			bool as_es;
    169 			bool as_ls;
    170 			uint64_t outputs_written;
    171 		} vs;
    172 		struct {
    173 			unsigned num_interp;
    174 			uint32_t input_mask;
    175 			uint32_t flat_shaded_mask;
    176 			bool has_pcoord;
    177 			bool can_discard;
    178 			bool writes_z;
    179 			bool writes_stencil;
    180 			bool writes_sample_mask;
    181 			bool early_fragment_test;
    182 			bool writes_memory;
    183 			bool prim_id_input;
    184 			bool layer_input;
    185 		} fs;
    186 		struct {
    187 			unsigned block_size[3];
    188 		} cs;
    189 		struct {
    190 			unsigned vertices_in;
    191 			unsigned vertices_out;
    192 			unsigned output_prim;
    193 			unsigned invocations;
    194 			unsigned gsvs_vertex_size;
    195 			unsigned max_gsvs_emit_size;
    196 			unsigned es_type; /* GFX9: VS or TES */
    197 		} gs;
    198 		struct {
    199 			unsigned tcs_vertices_out;
    200 			/* Which outputs are actually written */
    201 			uint64_t outputs_written;
    202 			/* Which patch outputs are actually written */
    203 			uint32_t patch_outputs_written;
    204 
    205 		} tcs;
    206 		struct {
    207 			struct ac_vs_output_info outinfo;
    208 			struct ac_es_output_info es_info;
    209 			bool as_es;
    210 			unsigned primitive_mode;
    211 			enum gl_tess_spacing spacing;
    212 			bool ccw;
    213 			bool point_mode;
    214 		} tes;
    215 	};
    216 };
    217 
    218 void ac_compile_nir_shader(LLVMTargetMachineRef tm,
    219                            struct ac_shader_binary *binary,
    220                            struct ac_shader_config *config,
    221                            struct ac_shader_variant_info *shader_info,
    222                            struct nir_shader *const *nir,
    223                            int nir_count,
    224                            const struct ac_nir_compiler_options *options,
    225 			   bool dump_shader);
    226 
    227 void ac_create_gs_copy_shader(LLVMTargetMachineRef tm,
    228 			      struct nir_shader *geom_shader,
    229 			      struct ac_shader_binary *binary,
    230 			      struct ac_shader_config *config,
    231 			      struct ac_shader_variant_info *shader_info,
    232 			      const struct ac_nir_compiler_options *options,
    233 			      bool dump_shader);
    234 
    235 struct nir_to_llvm_context;
    236 void ac_nir_translate(struct ac_llvm_context *ac, struct ac_shader_abi *abi,
    237 		      struct nir_shader *nir, struct nir_to_llvm_context *nctx);
    238 
    239 #endif /* AC_NIR_TO_LLVM_H */
    240