radeonsi/gfx10: jump over the shader query atomic if the queries are disabled
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.h
index 43d1b0d1bc1e1525e6785d2266012a3d6bd674b2..2649a7cd5b7496062e72c7fc6e937040f5971544 100644 (file)
@@ -241,11 +241,16 @@ enum {
 };
 
 /* Fields of driver-defined VS state SGPR. */
-/* Clamp vertex color output (only used in VS as VS). */
 #define S_VS_STATE_CLAMP_VERTEX_COLOR(x)       (((unsigned)(x) & 0x1) << 0)
 #define C_VS_STATE_CLAMP_VERTEX_COLOR          0xFFFFFFFE
 #define S_VS_STATE_INDEXED(x)                  (((unsigned)(x) & 0x1) << 1)
 #define C_VS_STATE_INDEXED                     0xFFFFFFFD
+#define S_VS_STATE_OUTPRIM(x)                  (((unsigned)(x) & 0x3) << 2)
+#define C_VS_STATE_OUTPRIM                     0xFFFFFFF3
+#define S_VS_STATE_PROVOKING_VTX_INDEX(x)      (((unsigned)(x) & 0x3) << 4)
+#define C_VS_STATE_PROVOKING_VTX_INDEX         0xFFFFFFCF
+#define S_VS_STATE_STREAMOUT_QUERY_ENABLED(x)  (((unsigned)(x) & 0x1) << 6)
+#define C_VS_STATE_STREAMOUT_QUERY_ENABLED     0xFFFFFFBF
 #define S_VS_STATE_LS_OUT_PATCH_SIZE(x)                (((unsigned)(x) & 0x1FFF) << 8)
 #define C_VS_STATE_LS_OUT_PATCH_SIZE           0xFFE000FF
 #define S_VS_STATE_LS_OUT_VERTEX_SIZE(x)       (((unsigned)(x) & 0xFF) << 24)
@@ -331,6 +336,7 @@ struct si_shader_selector {
        struct si_shader        *main_shader_part;
        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        *gs_copy_shader;
 
@@ -469,6 +475,7 @@ union si_shader_part_key {
                unsigned        last_input:4;
                unsigned        as_ls:1;
                unsigned        as_es:1;
+               unsigned        as_ngg:1;
                /* Prologs for monolithic shaders shouldn't set EXEC. */
                unsigned        is_monolithic:1;
        } vs_prolog;
@@ -524,11 +531,12 @@ struct si_shader_key {
                } ps;
        } part;
 
-       /* These two are initially set according to the NEXT_SHADER property,
+       /* These three are initially set according to the NEXT_SHADER property,
         * or guessed if the property doesn't seem correct.
         */
        unsigned as_es:1; /* export shader, which precedes GS */
        unsigned as_ls:1; /* local shader, which precedes TCS */
+       unsigned as_ngg:1; /* VS, TES, or GS compiled as NGG primitive shader */
 
        /* Flags for monolithic compilation only. */
        struct {
@@ -640,6 +648,15 @@ struct si_shader {
        struct ac_shader_config         config;
        struct si_shader_info           info;
 
+       struct {
+               uint16_t ngg_emit_size; /* in dwords */
+               uint16_t hw_max_esverts;
+               uint16_t max_gsprims;
+               uint16_t max_out_verts;
+               uint16_t prim_amp_factor;
+               bool max_vert_out_per_gs_instance;
+       } ngg;
+
        /* Shader key + LLVM IR + disassembly + statistics.
         * Generated for debug contexts only.
         */
@@ -654,7 +671,6 @@ struct si_shader {
                        unsigned        vgt_gsvs_ring_offset_1;
                        unsigned        vgt_gsvs_ring_offset_2;
                        unsigned        vgt_gsvs_ring_offset_3;
-                       unsigned        vgt_gs_out_prim_type;
                        unsigned        vgt_gsvs_ring_itemsize;
                        unsigned        vgt_gs_max_vert_out;
                        unsigned        vgt_gs_vert_itemsize;
@@ -667,6 +683,22 @@ struct si_shader {
                        unsigned        vgt_esgs_ring_itemsize;
                } gs;
 
+               struct {
+                       unsigned        ge_max_output_per_subgroup;
+                       unsigned        ge_ngg_subgrp_cntl;
+                       unsigned        vgt_primitiveid_en;
+                       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;
+                       unsigned        pa_cl_vte_cntl;
+                       unsigned        pa_cl_ngg_cntl;
+                       unsigned        vgt_gs_max_vert_out; /* for API GS */
+               } ngg;
+
                struct {
                        unsigned        vgt_gs_mode;
                        unsigned        vgt_primitiveid_en;
@@ -690,6 +722,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 ge_cntl;
 };
 
 struct si_shader_part {
@@ -753,6 +786,8 @@ si_get_main_shader_part(struct si_shader_selector *sel,
                return &sel->main_shader_part_ls;
        if (key->as_es)
                return &sel->main_shader_part_es;
+       if (key->as_ngg)
+               return &sel->main_shader_part_ngg;
        return &sel->main_shader_part;
 }