radeonsi: have separate LS and ES main shader parts in the shader selector
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.h
index 2ed0cb783ff661b0570dfd025ad1b9ab6e040b99..d4b57c97d59ecf32c2b79fff4bf41064de2b9d51 100644 (file)
@@ -236,25 +236,48 @@ enum {
 /* For VS shader key fix_fetch. */
 enum {
        SI_FIX_FETCH_NONE = 0,
-       SI_FIX_FETCH_A2_SNORM = 1,
-       SI_FIX_FETCH_A2_SSCALED = 2,
-       SI_FIX_FETCH_A2_SINT = 3,
+       SI_FIX_FETCH_A2_SNORM,
+       SI_FIX_FETCH_A2_SSCALED,
+       SI_FIX_FETCH_A2_SINT,
+       SI_FIX_FETCH_RGBA_32_UNORM,
+       SI_FIX_FETCH_RGBX_32_UNORM,
+       SI_FIX_FETCH_RGBA_32_SNORM,
+       SI_FIX_FETCH_RGBX_32_SNORM,
+       SI_FIX_FETCH_RGBA_32_USCALED,
+       SI_FIX_FETCH_RGBA_32_SSCALED,
+       SI_FIX_FETCH_RGBA_32_FIXED,
+       SI_FIX_FETCH_RGBX_32_FIXED,
+       SI_FIX_FETCH_RG_64_FLOAT,
+       SI_FIX_FETCH_RGB_64_FLOAT,
+       SI_FIX_FETCH_RGBA_64_FLOAT,
+       SI_FIX_FETCH_RGB_8,     /* A = 1.0 */
+       SI_FIX_FETCH_RGB_8_INT, /* A = 1 */
+       SI_FIX_FETCH_RGB_16,
+       SI_FIX_FETCH_RGB_16_INT,
 };
 
 struct si_shader;
 
+/* State of the context creating the shader object. */
+struct si_compiler_ctx_state {
+       /* Should only be used by si_init_shader_selector_async and
+        * si_build_shader_variant if thread_index == -1 (non-threaded). */
+       LLVMTargetMachineRef            tm;
+
+       /* Used if thread_index == -1 or if debug.async is true. */
+       struct pipe_debug_callback      debug;
+
+       /* Used for creating the log string for gallium/ddebug. */
+       bool                            is_debug_context;
+};
+
 /* A shader selector is a gallium CSO and contains shader variants and
  * binaries for one TGSI program. This can be shared by multiple contexts.
  */
 struct si_shader_selector {
        struct si_screen        *screen;
        struct util_queue_fence ready;
-
-       /* Should only be used by si_init_shader_selector_async
-        * if thread_index == -1 (non-threaded). */
-       LLVMTargetMachineRef    tm;
-       struct pipe_debug_callback debug;
-       bool                    is_debug_context;
+       struct si_compiler_ctx_state compiler_ctx_state;
 
        pipe_mutex              mutex;
        struct si_shader        *first_variant; /* immutable after the first variant */
@@ -264,6 +287,8 @@ struct si_shader_selector {
         * uploaded to a buffer).
         */
        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        *gs_copy_shader;
 
@@ -295,9 +320,12 @@ struct si_shader_selector {
        /* CS parameters */
        unsigned local_size;
 
-       /* masks of "get_unique_index" bits */
-       uint64_t        outputs_written;
-       uint32_t        patch_outputs_written;
+       uint64_t        outputs_written;        /* "get_unique_index" bits */
+       uint32_t        patch_outputs_written;  /* "get_unique_index" bits */
+       uint32_t        outputs_written2;       /* "get_unique_index2" bits */
+
+       uint64_t        inputs_read;            /* "get_unique_index" bits */
+       uint32_t        inputs_read2;           /* "get_unique_index2" bits */
 };
 
 /* Valid shader configurations:
@@ -319,12 +347,6 @@ struct si_vs_prolog_bits {
 /* Common VS bits between the shader key and the epilog key. */
 struct si_vs_epilog_bits {
        unsigned        export_prim_id:1; /* when PS needs it and GS is disabled */
-       /* TODO:
-        * - skip clipdist, culldist (including clipvertex code) exports based
-        *   on which clip_plane_enable bits are set
-        * - skip layer, viewport, clipdist, and culldist parameter exports
-        *   if PS doesn't read them
-        */
 };
 
 /* Common TCS bits between the shader key and the epilog key. */
@@ -428,13 +450,22 @@ struct si_shader_key {
        /* Flags for monolithic compilation only. */
        union {
                struct {
-                       /* One pair of bits for every input: SI_FIX_FETCH_* enums. */
-                       uint32_t        fix_fetch;
+                       /* One byte for every input: SI_FIX_FETCH_* enums. */
+                       uint8_t         fix_fetch[SI_MAX_ATTRIBS];
                } vs;
                struct {
                        uint64_t        inputs_to_copy; /* for fixed-func TCS */
                } tcs;
        } mono;
+
+       /* Optimization flags for asynchronous compilation only. */
+       union {
+               struct {
+                       uint64_t        kill_outputs; /* "get_unique_index" bits */
+                       uint32_t        kill_outputs2; /* "get_unique_index2" bits */
+                       unsigned        clip_disable:1;
+               } hw_vs; /* HW VS (it can be VS, TES, GS) */
+       } opt;
 };
 
 struct si_shader_config {
@@ -442,6 +473,7 @@ struct si_shader_config {
        unsigned                        num_vgprs;
        unsigned                        spilled_sgprs;
        unsigned                        spilled_vgprs;
+       unsigned                        private_mem_vgprs;
        unsigned                        lds_size;
        unsigned                        spi_ps_input_ena;
        unsigned                        spi_ps_input_addr;
@@ -460,6 +492,7 @@ enum {
        EXP_PARAM_DEFAULT_VAL_0001,
        EXP_PARAM_DEFAULT_VAL_1110,
        EXP_PARAM_DEFAULT_VAL_1111,
+       EXP_PARAM_UNDEFINED = 255,
 };
 
 /* GCN-specific shader info. */
@@ -474,6 +507,8 @@ struct si_shader_info {
 };
 
 struct si_shader {
+       struct si_compiler_ctx_state    compiler_ctx_state;
+
        struct si_shader_selector       *selector;
        struct si_shader                *next_variant;
 
@@ -484,7 +519,10 @@ struct si_shader {
        struct r600_resource            *bo;
        struct r600_resource            *scratch_bo;
        struct si_shader_key            key;
+       struct util_queue_fence         optimized_ready;
+       bool                            compilation_failed;
        bool                            is_monolithic;
+       bool                            is_optimized;
        bool                            is_binary_shared;
        bool                            is_gs_copy_shader;
 
@@ -531,10 +569,13 @@ int si_compile_llvm(struct si_screen *sscreen,
                    const char *name);
 void si_shader_destroy(struct si_shader *shader);
 unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
+unsigned si_shader_io_get_unique_index2(unsigned name, unsigned index);
 int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader);
 void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader,
                    struct pipe_debug_callback *debug, unsigned processor,
-                   FILE *f);
+                   FILE *f, bool check_debug_option);
+void si_multiwave_lds_size_workaround(struct si_screen *sscreen,
+                                     unsigned *lds_size);
 void si_shader_apply_scratch_relocs(struct si_context *sctx,
                        struct si_shader *shader,
                        struct si_shader_config *config,
@@ -544,5 +585,20 @@ void si_shader_binary_read_config(struct radeon_shader_binary *binary,
                                  unsigned symbol_offset);
 unsigned si_get_spi_shader_z_format(bool writes_z, bool writes_stencil,
                                    bool writes_samplemask);
+const char *si_get_shader_name(struct si_shader *shader, unsigned processor);
+
+/* Inline helpers. */
+
+/* Return the pointer to the main shader part's pointer. */
+static inline struct si_shader **
+si_get_main_shader_part(struct si_shader_selector *sel,
+                       struct si_shader_key *key)
+{
+       if (key->as_ls)
+               return &sel->main_shader_part_ls;
+       if (key->as_es)
+               return &sel->main_shader_part_es;
+       return &sel->main_shader_part;
+}
 
 #endif