svga: encode sample count in resource declarations
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.h
index 555ca598d2c6d4498de3e5680f3a2895697244f2..14230b8207307b3ee242cd766366cf0a13d5676a 100644 (file)
 
 #include "ac_binary.h"
 #include "ac_llvm_build.h"
+#include "ac_llvm_util.h"
 
 #include <stdio.h>
 
@@ -152,7 +153,7 @@ struct si_context;
 /* Shader IO unique indices are supported for TGSI_SEMANTIC_GENERIC with an
  * index smaller than this.
  */
-#define SI_MAX_IO_GENERIC       44
+#define SI_MAX_IO_GENERIC       43
 
 /* SGPR user data indices */
 enum {
@@ -174,17 +175,20 @@ enum {
 #endif
        SI_NUM_RESOURCE_SGPRS,
 
+       /* API VS, TES without GS, GS copy shader */
+       SI_SGPR_VS_STATE_BITS = SI_NUM_RESOURCE_SGPRS,
+       SI_NUM_VS_STATE_RESOURCE_SGPRS,
+
        /* all VS variants */
-       SI_SGPR_BASE_VERTEX = SI_NUM_RESOURCE_SGPRS,
+       SI_SGPR_BASE_VERTEX = SI_NUM_VS_STATE_RESOURCE_SGPRS,
        SI_SGPR_START_INSTANCE,
        SI_SGPR_DRAWID,
-       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_LAYOUT = SI_NUM_VS_STATE_RESOURCE_SGPRS,
        SI_SGPR_TES_OFFCHIP_ADDR,
        SI_TES_NUM_USER_SGPR,
 
@@ -225,7 +229,7 @@ enum {
        GFX9_VSGS_NUM_USER_SGPR = GFX9_MERGED_NUM_USER_SGPR,
        GFX9_TESGS_NUM_USER_SGPR = GFX9_MERGED_NUM_USER_SGPR,
 #endif
-       SI_GSCOPY_NUM_USER_SGPR = SI_SGPR_RW_BUFFERS + (HAVE_32BIT_POINTERS ? 1 : 2),
+       SI_GSCOPY_NUM_USER_SGPR = SI_NUM_VS_STATE_RESOURCE_SGPRS,
 
        /* PS only */
        SI_SGPR_ALPHA_REF       = SI_NUM_RESOURCE_SGPRS,
@@ -272,11 +276,21 @@ enum {
 
 /* SI-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,
 
@@ -311,20 +325,11 @@ enum {
 
 struct si_shader;
 
-/* Per-thread persistent LLVM objects. */
-struct si_compiler {
-       LLVMTargetMachineRef            tm;
-       const char                      *triple;
-       const char                      *data_layout;
-       LLVMTargetLibraryInfoRef        target_library_info;
-       LLVMPassManagerRef              passmgr;
-};
-
 /* 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). */
-       struct si_compiler              *compiler;
+       struct ac_llvm_compiler         *compiler;
 
        /* Used if thread_index == -1 or if debug.async is true. */
        struct pipe_debug_callback      debug;
@@ -370,7 +375,8 @@ struct si_shader_selector {
        ubyte           culldist_mask;
 
        /* ES parameters. */
-       unsigned        esgs_itemsize;
+       unsigned        esgs_itemsize; /* vertex stride */
+       unsigned        lshs_vertex_stride;
 
        /* GS parameters. */
        unsigned        gs_input_verts_per_prim;
@@ -390,9 +396,6 @@ struct si_shader_selector {
         */
        unsigned        colors_written_4bit;
 
-       /* CS parameters */
-       unsigned local_size;
-
        uint64_t        outputs_written_before_ps; /* "get_unique_index" bits */
        uint64_t        outputs_written;        /* "get_unique_index" bits */
        uint32_t        patch_outputs_written;  /* "get_unique_index_patch" bits */
@@ -507,7 +510,7 @@ union si_shader_part_key {
                unsigned        ancillary_vgpr_index:5;
                unsigned        wqm:1;
                char            color_attr_index[2];
-               char            color_interp_vgpr_index[2]; /* -1 == constant */
+               signed char     color_interp_vgpr_index[2]; /* -1 == constant */
        } ps_prolog;
        struct {
                struct si_ps_epilog_bits states;
@@ -656,15 +659,14 @@ struct si_shader_part {
 /* si_shader.c */
 struct si_shader *
 si_generate_gs_copy_shader(struct si_screen *sscreen,
-                          struct si_compiler *compiler,
+                          struct ac_llvm_compiler *compiler,
                           struct si_shader_selector *gs_selector,
                           struct pipe_debug_callback *debug);
 int si_compile_tgsi_shader(struct si_screen *sscreen,
-                          struct si_compiler *compiler,
+                          struct ac_llvm_compiler *compiler,
                           struct si_shader *shader,
-                          bool is_monolithic,
                           struct pipe_debug_callback *debug);
-int si_shader_create(struct si_screen *sscreen, struct si_compiler *compiler,
+int si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler *compiler,
                     struct si_shader *shader,
                     struct pipe_debug_callback *debug);
 void si_shader_destroy(struct si_shader *shader);