radeonsi/nir: implement pipe_screen::finalize_nir
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.h
index 211e2db169782280794b84bc9c34dd0e7011cabb..1d41b7aa042cb25d2affe6a12f2435adb573b715 100644 (file)
 #include "tgsi/tgsi_scan.h"
 #include "util/u_inlines.h"
 #include "util/u_queue.h"
+#include "util/simple_mtx.h"
 
 #include "ac_binary.h"
 #include "ac_llvm_build.h"
@@ -256,26 +257,10 @@ enum {
 #define S_VS_STATE_LS_OUT_VERTEX_SIZE(x)       (((unsigned)(x) & 0xFF) << 24)
 #define C_VS_STATE_LS_OUT_VERTEX_SIZE          0x00FFFFFF
 
-/* Driver-specific system values. */
-enum {
-       /* Values from set_tess_state. */
-       TGSI_SEMANTIC_DEFAULT_TESSOUTER_SI = TGSI_SEMANTIC_COUNT,
-       TGSI_SEMANTIC_DEFAULT_TESSINNER_SI,
-
-       /* Up to 4 dwords in user SGPRs for compute shaders. */
-       TGSI_SEMANTIC_CS_USER_DATA,
-};
-
 enum {
        /* Use a property enum that CS wouldn't use. */
        TGSI_PROPERTY_CS_LOCAL_SIZE = TGSI_PROPERTY_FS_COORD_ORIGIN,
 
-       /* The number of used user data dwords in the range [1, 4]. */
-       TGSI_PROPERTY_CS_USER_DATA_DWORDS = TGSI_PROPERTY_FS_COORD_PIXEL_CENTER,
-
-       /* 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,
@@ -326,7 +311,7 @@ struct si_shader_selector {
        struct util_queue_fence ready;
        struct si_compiler_ctx_state compiler_ctx_state;
 
-       mtx_t           mutex;
+       simple_mtx_t            mutex;
        struct si_shader        *first_variant; /* immutable after the first variant */
        struct si_shader        *last_variant; /* mutable */
 
@@ -337,6 +322,7 @@ struct si_shader_selector {
        struct si_shader        *main_shader_part_ls; /* as_ls is set in the key */
        struct si_shader        *main_shader_part_es; /* as_es is set in the key */
        struct si_shader        *main_shader_part_ngg; /* as_ngg is set in the key */
+       struct si_shader        *main_shader_part_ngg_es; /* for Wave32 TES before legacy GS */
 
        struct si_shader        *gs_copy_shader;
 
@@ -351,8 +337,6 @@ struct si_shader_selector {
        bool            vs_needs_prolog;
        bool            force_correct_derivs_after_kill;
        bool            prim_discard_cs_allowed;
-       bool            ngg_writes_edgeflag;
-       bool            pos_writes_edgeflag;
        unsigned        pa_cl_vs_out_cntl;
        ubyte           clipdist_mask;
        ubyte           culldist_mask;
@@ -490,6 +474,7 @@ union si_shader_part_key {
                struct si_gs_prolog_bits states;
                /* Prologs of monolithic shaders shouldn't set EXEC. */
                unsigned        is_monolithic:1;
+               unsigned        as_ngg:1;
        } gs_prolog;
        struct {
                struct si_ps_prolog_bits states;
@@ -556,9 +541,9 @@ struct si_shader_key {
                        unsigned        vs_export_prim_id:1;
                        struct {
                                unsigned interpolate_at_sample_force_center:1;
-                               unsigned fbfetch_msaa;
-                               unsigned fbfetch_is_1D;
-                               unsigned fbfetch_layered;
+                               unsigned fbfetch_msaa:1;
+                               unsigned fbfetch_is_1D:1;
+                               unsigned fbfetch_layered:1;
                        } ps;
                } u;
        } mono;
@@ -694,7 +679,6 @@ struct si_shader {
                        unsigned        vgt_gs_onchip_cntl;
                        unsigned        vgt_gs_instance_cnt;
                        unsigned        vgt_esgs_ring_itemsize;
-                       unsigned        vgt_reuse_off;
                        unsigned        spi_vs_out_config;
                        unsigned        spi_shader_idx_format;
                        unsigned        spi_shader_pos_format;
@@ -726,6 +710,7 @@ struct si_shader {
        /*For save precompute registers value */
        unsigned vgt_tf_param; /* VGT_TF_PARAM */
        unsigned vgt_vertex_reuse_block_cntl; /* VGT_VERTEX_REUSE_BLOCK_CNTL */
+       unsigned pa_cl_vs_out_cntl;
        unsigned ge_cntl;
 };
 
@@ -771,8 +756,8 @@ 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);
-void si_lower_nir(struct si_shader_selector *sel);
-void si_nir_opts(struct nir_shader *nir);
+void si_nir_adjust_driver_locations(struct nir_shader *nir);
+void si_finalize_nir(struct pipe_screen *screen, void *nirptr, bool optimize);
 
 /* si_state_shaders.c */
 void gfx9_get_gs_info(struct si_shader_selector *es,
@@ -788,6 +773,8 @@ si_get_main_shader_part(struct si_shader_selector *sel,
 {
        if (key->as_ls)
                return &sel->main_shader_part_ls;
+       if (key->as_es && key->as_ngg)
+               return &sel->main_shader_part_ngg_es;
        if (key->as_es)
                return &sel->main_shader_part_es;
        if (key->as_ngg)