#include <llvm-c/Core.h> /* LLVMModuleRef */
#include <llvm-c/TargetMachine.h>
-#include "tgsi/tgsi_scan.h"
#include "util/u_inlines.h"
#include "util/u_queue.h"
#include "util/simple_mtx.h"
bool is_debug_context;
};
+struct si_shader_info {
+ ubyte num_inputs;
+ ubyte num_outputs;
+ ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; /**< TGSI_SEMANTIC_x */
+ ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
+ ubyte input_interpolate[PIPE_MAX_SHADER_INPUTS];
+ ubyte input_interpolate_loc[PIPE_MAX_SHADER_INPUTS];
+ ubyte input_usage_mask[PIPE_MAX_SHADER_INPUTS];
+ ubyte output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; /**< TGSI_SEMANTIC_x */
+ ubyte output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
+ ubyte output_usagemask[PIPE_MAX_SHADER_OUTPUTS];
+ ubyte output_streams[PIPE_MAX_SHADER_OUTPUTS];
+
+ ubyte processor;
+
+ int constbuf0_num_slots;
+ unsigned const_buffers_declared; /**< bitmask of declared const buffers */
+ unsigned samplers_declared; /**< bitmask of declared samplers */
+ ubyte num_stream_output_components[4];
+
+ uint num_memory_instructions; /**< sampler, buffer, and image instructions */
+
+ /**
+ * If a tessellation control shader reads outputs, this describes which ones.
+ */
+ bool reads_pervertex_outputs;
+ bool reads_perpatch_outputs;
+ bool reads_tessfactor_outputs;
+
+ ubyte colors_read; /**< which color components are read by the FS */
+ ubyte colors_written;
+ bool reads_samplemask; /**< does fragment shader read sample mask? */
+ bool reads_tess_factors; /**< If TES reads TESSINNER or TESSOUTER */
+ bool writes_z; /**< does fragment shader write Z value? */
+ bool writes_stencil; /**< does fragment shader write stencil value? */
+ bool writes_samplemask; /**< does fragment shader write sample mask? */
+ bool writes_edgeflag; /**< vertex shader outputs edgeflag */
+ bool uses_kill; /**< KILL or KILL_IF instruction used? */
+ bool uses_persp_center;
+ bool uses_persp_centroid;
+ bool uses_persp_sample;
+ bool uses_linear_center;
+ bool uses_linear_centroid;
+ bool uses_linear_sample;
+ bool uses_persp_opcode_interp_sample;
+ bool uses_linear_opcode_interp_sample;
+ bool uses_instanceid;
+ bool uses_vertexid;
+ bool uses_vertexid_nobase;
+ bool uses_basevertex;
+ bool uses_drawid;
+ bool uses_primid;
+ bool uses_frontface;
+ bool uses_invocationid;
+ bool uses_thread_id[3];
+ bool uses_block_id[3];
+ bool uses_block_size;
+ bool uses_grid_size;
+ bool uses_subgroup_info;
+ bool writes_position;
+ bool writes_psize;
+ bool writes_clipvertex;
+ bool writes_primid;
+ bool writes_viewport_index;
+ bool writes_layer;
+ bool writes_memory; /**< contains stores or atomics to buffers or images */
+ bool uses_derivatives;
+ bool uses_bindless_samplers;
+ bool uses_bindless_images;
+ bool uses_fbfetch;
+ unsigned clipdist_writemask;
+ unsigned culldist_writemask;
+ unsigned num_written_culldistance;
+ unsigned num_written_clipdistance;
+
+ unsigned images_declared; /**< bitmask of declared images */
+ unsigned msaa_images_declared; /**< bitmask of declared MSAA images */
+ unsigned shader_buffers_declared; /**< bitmask of declared shader buffers */
+
+ unsigned properties[TGSI_PROPERTY_COUNT]; /* index with TGSI_PROPERTY_ */
+
+ /** Whether all codepaths write tess factors in all invocations. */
+ bool tessfactors_are_def_in_all_invocs;
+};
+
/* A shader selector is a gallium CSO and contains shader variants and
* binaries for one NIR program. This can be shared by multiple contexts.
*/
unsigned nir_size;
struct pipe_stream_output_info so;
- struct tgsi_shader_info info;
- struct tgsi_tessctrl_info tcs_info;
+ struct si_shader_info info;
/* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
enum pipe_shader_type type;
/* si_shader_nir.c */
void si_nir_scan_shader(const struct nir_shader *nir,
- struct tgsi_shader_info *info);
-void si_nir_scan_tess_ctrl(const struct nir_shader *nir,
- struct tgsi_tessctrl_info *out);
+ struct si_shader_info *info);
void si_nir_adjust_driver_locations(struct nir_shader *nir);
void si_finalize_nir(struct pipe_screen *screen, void *nirptr, bool optimize);