radeonsi: set number of userdata SGPRs of GS copy shader to 4
[mesa.git] / src / gallium / drivers / radeonsi / si_state_draw.c
index a47534429b8637c0d2f5fb3adca00b3b5dc4d0a8..e8d84a90d573ec9a9640db314db62b5a2922fec0 100644 (file)
@@ -75,15 +75,13 @@ static void si_shader_es(struct pipe_context *ctx, struct si_shader *shader)
                       S_00B328_VGPR_COMP_CNT(vgpr_comp_cnt));
        si_pm4_set_reg(pm4, R_00B32C_SPI_SHADER_PGM_RSRC2_ES,
                       S_00B32C_USER_SGPR(num_user_sgprs));
-
-       sctx->b.flags |= R600_CONTEXT_INV_SHADER_CACHE;
 }
 
 static void si_shader_gs(struct pipe_context *ctx, struct si_shader *shader)
 {
        struct si_context *sctx = (struct si_context *)ctx;
        unsigned gs_vert_itemsize = shader->noutput * (16 >> 2);
-       unsigned gs_max_vert_out = shader->gs_max_out_vertices;
+       unsigned gs_max_vert_out = shader->selector->gs_max_out_vertices;
        unsigned gsvs_itemsize = gs_vert_itemsize * gs_max_vert_out;
        unsigned cut_mode;
        struct si_pm4_state *pm4;
@@ -121,7 +119,7 @@ static void si_shader_gs(struct pipe_context *ctx, struct si_shader *shader)
        si_pm4_set_reg(pm4, R_028A68_VGT_GSVS_RING_OFFSET_3, gsvs_itemsize);
 
        si_pm4_set_reg(pm4, R_028AAC_VGT_ESGS_RING_ITEMSIZE,
-                      shader->nparam * (16 >> 2));
+                      util_bitcount64(shader->selector->gs_used_inputs) * (16 >> 2));
        si_pm4_set_reg(pm4, R_028AB0_VGT_GSVS_RING_ITEMSIZE, gsvs_itemsize);
 
        si_pm4_set_reg(pm4, R_028B38_VGT_GS_MAX_VERT_OUT, gs_max_vert_out);
@@ -147,8 +145,6 @@ static void si_shader_gs(struct pipe_context *ctx, struct si_shader *shader)
                       S_00B228_SGPRS((num_sgprs - 1) / 8));
        si_pm4_set_reg(pm4, R_00B22C_SPI_SHADER_PGM_RSRC2_GS,
                       S_00B22C_USER_SGPR(num_user_sgprs));
-
-       sctx->b.flags |= R600_CONTEXT_INV_SHADER_CACHE;
 }
 
 static void si_shader_vs(struct pipe_context *ctx, struct si_shader *shader)
@@ -170,7 +166,11 @@ static void si_shader_vs(struct pipe_context *ctx, struct si_shader *shader)
 
        vgpr_comp_cnt = shader->uses_instanceid ? 3 : 0;
 
-       num_user_sgprs = SI_VS_NUM_USER_SGPR;
+       if (shader->is_gs_copy_shader)
+               num_user_sgprs = SI_GSCOPY_NUM_USER_SGPR;
+       else
+               num_user_sgprs = SI_VS_NUM_USER_SGPR;
+
        num_sgprs = shader->num_sgprs;
        if (num_user_sgprs > num_sgprs) {
                /* Last 2 reserved SGPRs are used for VCC */
@@ -223,8 +223,6 @@ static void si_shader_vs(struct pipe_context *ctx, struct si_shader *shader)
                       S_00B12C_SO_BASE2_EN(!!shader->selector->so.stride[2]) |
                       S_00B12C_SO_BASE3_EN(!!shader->selector->so.stride[3]) |
                       S_00B12C_SO_EN(!!shader->selector->so.num_outputs));
-
-       sctx->b.flags |= R600_CONTEXT_INV_SHADER_CACHE;
 }
 
 static void si_shader_ps(struct pipe_context *ctx, struct si_shader *shader)
@@ -305,8 +303,6 @@ static void si_shader_ps(struct pipe_context *ctx, struct si_shader *shader)
        si_pm4_set_reg(pm4, R_00B02C_SPI_SHADER_PGM_RSRC2_PS,
                       S_00B02C_EXTRA_LDS_SIZE(shader->lds_size) |
                       S_00B02C_USER_SGPR(num_user_sgprs));
-
-       sctx->b.flags |= R600_CONTEXT_INV_SHADER_CACHE;
 }
 
 /*
@@ -427,7 +423,7 @@ static bool si_update_draw_info_state(struct si_context *sctx,
        unsigned prim = si_conv_pipe_prim(info->mode);
        unsigned gs_out_prim =
                si_conv_prim_to_gs_out(sctx->gs_shader ?
-                                      sctx->gs_shader->current->gs_output_prim :
+                                      sctx->gs_shader->gs_output_prim :
                                       info->mode);
        unsigned ls_mask = 0;
        unsigned ia_multi_vgt_param = si_get_ia_multi_vgt_param(sctx, info);
@@ -629,7 +625,7 @@ static void si_update_derived_state(struct si_context *sctx)
 
                si_set_ring_buffer(ctx, PIPE_SHADER_GEOMETRY, SI_RING_GSVS,
                                   sctx->gsvs_ring,
-                                  sctx->gs_shader->current->gs_max_out_vertices *
+                                  sctx->gs_shader->gs_max_out_vertices *
                                   sctx->gs_shader->current->noutput * 16,
                                   64, true, true, 4, 16);