radeonsi: use postponed KILL only when derivatives are used
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.h
index 64321265cf9181c58d41fd95aa829b7ff1804156..78a2ee14c13a895f74a2e531a3f737cf278cae03 100644 (file)
 #include "ac_binary.h"
 #include "si_state.h"
 
+struct nir_shader;
+
 #define SI_MAX_VS_OUTPUTS      40
 
 /* Shader IO unique indices are supported for TGSI_SEMANTIC_GENERIC with an
@@ -157,7 +159,9 @@ enum {
         */
        SI_SGPR_RW_BUFFERS,  /* rings (& stream-out, VS only) */
        SI_SGPR_RW_BUFFERS_HI,
-       SI_SGPR_CONST_AND_SHADER_BUFFERS,
+       SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES,
+       SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES_HI,
+       SI_SGPR_CONST_AND_SHADER_BUFFERS, /* or just a constant buffer 0 pointer */
        SI_SGPR_CONST_AND_SHADER_BUFFERS_HI,
        SI_SGPR_SAMPLERS_AND_IMAGES,
        SI_SGPR_SAMPLERS_AND_IMAGES_HI,
@@ -172,6 +176,8 @@ enum {
        SI_SGPR_VS_STATE_BITS,
        SI_VS_NUM_USER_SGPR,
 
+       SI_SGPR_VS_BLIT_DATA = SI_SGPR_CONST_AND_SHADER_BUFFERS,
+
        /* TES */
        SI_SGPR_TES_OFFCHIP_LAYOUT = SI_NUM_RESOURCE_SGPRS,
        SI_SGPR_TES_OFFCHIP_ADDR_BASE64K,
@@ -217,7 +223,7 @@ enum {
 
 /* LLVM function parameter indices */
 enum {
-       SI_NUM_RESOURCE_PARAMS = 3,
+       SI_NUM_RESOURCE_PARAMS = 4,
 
        /* PS only parameters */
        SI_PARAM_ALPHA_REF = SI_NUM_RESOURCE_PARAMS,
@@ -259,6 +265,16 @@ enum {
        TGSI_SEMANTIC_DEFAULT_TESSINNER_SI,
 };
 
+enum {
+       /* Use a property enum that VS wouldn't use. */
+       TGSI_PROPERTY_VS_BLIT_SGPRS = TGSI_PROPERTY_FS_COORD_ORIGIN,
+
+       /* These represent the number of SGPRs the shader uses. */
+       SI_VS_BLIT_SGPRS_POS = 3,
+       SI_VS_BLIT_SGPRS_POS_COLOR = 7,
+       SI_VS_BLIT_SGPRS_POS_TEXCOORD = 9,
+};
+
 /* For VS shader key fix_fetch. */
 enum {
        SI_FIX_FETCH_NONE = 0,
@@ -320,12 +336,15 @@ struct si_shader_selector {
        struct si_shader        *gs_copy_shader;
 
        struct tgsi_token       *tokens;
+       struct nir_shader       *nir;
        struct pipe_stream_output_info  so;
        struct tgsi_shader_info         info;
+       struct tgsi_tessctrl_info       tcs_info;
 
        /* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
        unsigned        type;
        bool            vs_needs_prolog;
+       bool            force_correct_derivs_after_kill;
        unsigned        pa_cl_vs_out_cntl;
        ubyte           clipdist_mask;
        ubyte           culldist_mask;
@@ -385,12 +404,21 @@ struct si_shader_selector {
 
 /* Common VS bits between the shader key and the prolog key. */
 struct si_vs_prolog_bits {
-       unsigned        instance_divisors[SI_MAX_ATTRIBS];
+       /* - If neither "is_one" nor "is_fetched" has a bit set, the instance
+        *   divisor is 0.
+        * - If "is_one" has a bit set, the instance divisor is 1.
+        * - If "is_fetched" has a bit set, the instance divisor will be loaded
+        *   from the constant buffer.
+        */
+       uint16_t        instance_divisor_is_one;     /* bitmask of inputs */
+       uint16_t        instance_divisor_is_fetched; /* bitmask of inputs */
+       unsigned        ls_vgpr_fix:1;
 };
 
 /* Common TCS bits between the shader key and the epilog key. */
 struct si_tcs_epilog_bits {
        unsigned        prim_mode:3;
+       unsigned        invoc0_tess_factors_are_def:1;
        unsigned        tes_reads_tess_factors:1;
 };
 
@@ -409,6 +437,7 @@ struct si_ps_prolog_bits {
        unsigned        force_linear_center_interp:1;
        unsigned        bc_optimize_for_persp:1;
        unsigned        bc_optimize_for_linear:1;
+       unsigned        samplemask_log_ps_iter:3;
 };
 
 /* Common PS bits between the shader key and the epilog key. */
@@ -450,6 +479,7 @@ union si_shader_part_key {
                unsigned        colors_read:8; /* color input components read */
                unsigned        num_interp_inputs:5; /* BCOLOR is at this location */
                unsigned        face_vgpr_index:5;
+               unsigned        ancillary_vgpr_index:5;
                unsigned        wqm:1;
                char            color_attr_index[2];
                char            color_interp_vgpr_index[2]; /* -1 == constant */
@@ -500,6 +530,9 @@ struct si_shader_key {
                        uint64_t        ff_tcs_inputs_to_copy; /* for fixed-func TCS */
                        /* When PS needs PrimID and GS is disabled. */
                        unsigned        vs_export_prim_id:1;
+                       struct {
+                               unsigned interpolate_at_sample_force_center:1;
+                       } ps;
                } u;
        } mono;
 
@@ -542,7 +575,8 @@ struct si_shader_info {
        ubyte                   vs_output_param_offset[SI_MAX_VS_OUTPUTS];
        ubyte                   num_input_sgprs;
        ubyte                   num_input_vgprs;
-       char                    face_vgpr_index;
+       signed char             face_vgpr_index;
+       signed char             ancillary_vgpr_index;
        bool                    uses_instanceid;
        ubyte                   nr_pos_exports;
        ubyte                   nr_param_exports;
@@ -622,6 +656,11 @@ unsigned si_get_spi_shader_z_format(bool writes_z, bool writes_stencil,
                                    bool writes_samplemask);
 const char *si_get_shader_name(const struct si_shader *shader, unsigned processor);
 
+/* si_shader_nir.c */
+void si_nir_scan_shader(const struct nir_shader *nir,
+                       struct tgsi_shader_info *info);
+void si_lower_nir(struct si_shader_selector *sel);
+
 /* Inline helpers. */
 
 /* Return the pointer to the main shader part's pointer. */
@@ -648,4 +687,18 @@ si_shader_uses_bindless_images(struct si_shader_selector *selector)
        return selector ? selector->info.uses_bindless_images : false;
 }
 
+void si_destroy_shader_selector(struct si_context *sctx,
+                               struct si_shader_selector *sel);
+
+static inline void
+si_shader_selector_reference(struct si_context *sctx,
+                            struct si_shader_selector **dst,
+                            struct si_shader_selector *src)
+{
+       if (pipe_reference(&(*dst)->reference, &src->reference))
+               si_destroy_shader_selector(sctx, *dst);
+
+       *dst = src;
+}
+
 #endif