radeonsi: add si_shader_selector::vs_needs_prolog
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.h
index c38e7f560b6aeb2669ed0baa1abefe03bc40ca76..cfa691b0589555d832ec69cec6fab937c8a41781 100644 (file)
@@ -98,16 +98,9 @@ enum {
        SI_SGPR_BASE_VERTEX,
        SI_SGPR_START_INSTANCE,
        SI_SGPR_DRAWID,
-       SI_ES_NUM_USER_SGPR,
-
-       /* hw VS only */
-       SI_SGPR_VS_STATE_BITS   = SI_ES_NUM_USER_SGPR,
+       SI_SGPR_VS_STATE_BITS,
        SI_VS_NUM_USER_SGPR,
 
-       /* hw LS only */
-       SI_SGPR_LS_OUT_LAYOUT   = SI_ES_NUM_USER_SGPR,
-       SI_LS_NUM_USER_SGPR,
-
        /* both TCS and TES */
        SI_SGPR_TCS_OFFCHIP_LAYOUT = SI_NUM_RESOURCE_SGPRS,
        SI_TES_NUM_USER_SGPR,
@@ -146,11 +139,7 @@ enum {
        SI_PARAM_BASE_VERTEX,
        SI_PARAM_START_INSTANCE,
        SI_PARAM_DRAWID,
-       /* [0] = clamp vertex color, VS as VS only */
        SI_PARAM_VS_STATE_BITS,
-       /* same value as TCS_IN_LAYOUT, VS as LS only */
-       SI_PARAM_LS_OUT_LAYOUT = SI_PARAM_DRAWID + 1,
-       /* the other VS parameters are assigned dynamically */
 
        /* Layout of TCS outputs in the offchip buffer
         *   [0:8] = the number of patches per threadgroup.
@@ -175,8 +164,9 @@ enum {
        SI_PARAM_TCS_OUT_LAYOUT,
 
        /* Layout of LS outputs / TCS inputs
-        *   [0:12] = stride between patches in dwords = num_inputs * num_vertices * 4, max = 32*32*4
-        *   [13:20] = stride between vertices in dwords = num_inputs * 4, max = 32*4
+        *   [8:20] = stride between patches in dwords = num_inputs * num_vertices * 4, max = 32*32*4
+        *   [24:31] = stride between vertices in dwords = num_inputs * 4, max = 32*4
+        * (same layout as SI_PARAM_VS_STATE_BITS)
         */
        SI_PARAM_TCS_IN_LAYOUT,
 
@@ -226,6 +216,17 @@ enum {
        SI_NUM_PARAMS = SI_PARAM_POS_FIXED_PT + 9, /* +8 for COLOR[0..1] */
 };
 
+/* 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_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)
+#define C_VS_STATE_LS_OUT_VERTEX_SIZE          0x00FFFFFF
+
 /* SI-specific system values. */
 enum {
        TGSI_SEMANTIC_DEFAULT_TESSOUTER_SI = TGSI_SEMANTIC_COUNT,
@@ -278,7 +279,7 @@ struct si_shader_selector {
        struct util_queue_fence ready;
        struct si_compiler_ctx_state compiler_ctx_state;
 
-       pipe_mutex              mutex;
+       mtx_t           mutex;
        struct si_shader        *first_variant; /* immutable after the first variant */
        struct si_shader        *last_variant; /* mutable */
 
@@ -297,6 +298,7 @@ struct si_shader_selector {
 
        /* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
        unsigned        type;
+       bool            vs_needs_prolog;
 
        /* GS parameters. */
        unsigned        esgs_itemsize;