radeonsi: rename si_update_gs_rings
[mesa.git] / src / gallium / drivers / radeonsi / si_state_shaders.c
index 7a2cafeb9dc8af0150b3ee1bfcbd63d0b04515a3..6206dc62c1b6ba296664de8f8ce6371df65d02f5 100644 (file)
@@ -209,21 +209,6 @@ static void si_shader_es(struct si_shader *shader)
                si_set_tesseval_regs(shader, pm4);
 }
 
-static unsigned si_gs_get_max_stream(struct si_shader *shader)
-{
-       struct pipe_stream_output_info *so = &shader->selector->so;
-       unsigned max_stream = 0, i;
-
-       if (so->num_outputs == 0)
-               return 0;
-
-       for (i = 0; i < so->num_outputs; i++) {
-               if (so->output[i].stream > max_stream)
-                       max_stream = so->output[i].stream;
-       }
-       return max_stream;
-}
-
 static void si_shader_gs(struct si_shader *shader)
 {
        unsigned gs_vert_itemsize = shader->selector->gsvs_vertex_size;
@@ -234,7 +219,7 @@ static void si_shader_gs(struct si_shader *shader)
        struct si_pm4_state *pm4;
        unsigned num_sgprs, num_user_sgprs;
        uint64_t va;
-       unsigned max_stream = si_gs_get_max_stream(shader);
+       unsigned max_stream = shader->selector->max_gs_stream;
 
        /* The GSVS_RING_ITEMSIZE register takes 15 bits */
        assert(gsvs_itemsize < (1 << 15));
@@ -266,7 +251,7 @@ static void si_shader_gs(struct si_shader *shader)
        si_pm4_set_reg(pm4, R_028A68_VGT_GSVS_RING_OFFSET_3, gsvs_itemsize * ((max_stream >= 3) ? 3 : 1));
 
        si_pm4_set_reg(pm4, R_028AAC_VGT_ESGS_RING_ITEMSIZE,
-                      util_bitcount64(shader->selector->inputs_read) * (16 >> 2));
+                      shader->selector->esgs_itemsize / 4);
        si_pm4_set_reg(pm4, R_028AB0_VGT_GSVS_RING_ITEMSIZE, gsvs_itemsize * (max_stream + 1));
 
        si_pm4_set_reg(pm4, R_028B38_VGT_GS_MAX_VERT_OUT, gs_max_vert_out);
@@ -717,6 +702,11 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
                sel->max_gsvs_emit_size = sel->gsvs_vertex_size *
                                          sel->gs_max_out_vertices;
 
+               sel->max_gs_stream = 0;
+               for (i = 0; i < sel->so.num_outputs; i++)
+                       sel->max_gs_stream = MAX2(sel->max_gs_stream,
+                                                 sel->so.output[i].stream);
+
                for (i = 0; i < sel->info.num_inputs; i++) {
                        unsigned name = sel->info.input_semantic_name[i];
                        unsigned index = sel->info.input_semantic_index[i];
@@ -749,6 +739,7 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
                                        1llu << si_shader_io_get_unique_index(name, index);
                        }
                }
+               sel->esgs_itemsize = util_last_bit64(sel->outputs_written) * 16;
                break;
        case PIPE_SHADER_FRAGMENT:
                for (i = 0; i < sel->info.num_outputs; i++) {
@@ -1143,7 +1134,7 @@ static void si_init_gs_rings(struct si_context *sctx)
                           false, false, 0, 0, 0);
 }
 
-static void si_update_gs_rings(struct si_context *sctx)
+static void si_update_gsvs_ring_bindings(struct si_context *sctx)
 {
        unsigned gsvs_itemsize = sctx->gs_shader.cso->max_gsvs_emit_size;
        uint64_t offset;
@@ -1515,7 +1506,7 @@ bool si_update_shaders(struct si_context *sctx)
                                return false;
                }
 
-               si_update_gs_rings(sctx);
+               si_update_gsvs_ring_bindings(sctx);
        } else {
                si_pm4_bind_state(sctx, gs, NULL);
                si_pm4_bind_state(sctx, es, NULL);