radeonsi: set current_rast_prim at bind time for tess and GS
authorMarek Olšák <marek.olsak@amd.com>
Thu, 14 Jan 2021 12:22:20 +0000 (07:22 -0500)
committerMarge Bot <eric+marge@anholt.net>
Tue, 2 Feb 2021 05:42:32 +0000 (05:42 +0000)
It doesn't have to be done in draw_vbo.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Zoltán Böszörményi <zboszor@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8434>

src/gallium/drivers/radeonsi/si_state_draw.cpp
src/gallium/drivers/radeonsi/si_state_shaders.c

index 33d5496..b4ef3ea 100644 (file)
@@ -1949,36 +1949,33 @@ static void si_draw_vbo(struct pipe_context *ctx,
     *
     * This must be done after si_decompress_textures, which can call
     * draw_vbo recursively, and before si_update_shaders, which uses
-    * current_rast_prim for this draw_vbo call. */
-   enum pipe_prim_type rast_prim;
+    * current_rast_prim for this draw_vbo call.
+    */
+   if (!HAS_GS && !HAS_TESS) {
+      enum pipe_prim_type rast_prim;
 
-   if (HAS_GS) {
-      /* Only possibilities: POINTS, LINE_STRIP, TRIANGLES */
-      rast_prim = sctx->gs_shader.cso->rast_prim;
-   } else if (HAS_TESS) {
-      /* Only possibilities: POINTS, LINE_STRIP, TRIANGLES */
-      rast_prim = sctx->tes_shader.cso->rast_prim;
-   } else if (util_rast_prim_is_triangles(prim)) {
-      rast_prim = PIPE_PRIM_TRIANGLES;
-   } else {
-      /* Only possibilities, POINTS, LINE*, RECTANGLES */
-      rast_prim = prim;
-   }
+      if (util_rast_prim_is_triangles(prim)) {
+         rast_prim = PIPE_PRIM_TRIANGLES;
+      } else {
+         /* Only possibilities, POINTS, LINE*, RECTANGLES */
+         rast_prim = prim;
+      }
 
-   if (rast_prim != sctx->current_rast_prim) {
-      if (util_prim_is_points_or_lines(sctx->current_rast_prim) !=
-          util_prim_is_points_or_lines(rast_prim))
-         si_mark_atom_dirty(sctx, &sctx->atoms.s.guardband);
+      if (rast_prim != sctx->current_rast_prim) {
+         if (util_prim_is_points_or_lines(sctx->current_rast_prim) !=
+             util_prim_is_points_or_lines(rast_prim))
+            si_mark_atom_dirty(sctx, &sctx->atoms.s.guardband);
 
-      sctx->current_rast_prim = rast_prim;
-      sctx->do_update_shaders = true;
+         sctx->current_rast_prim = rast_prim;
+         sctx->do_update_shaders = true;
+      }
    }
 
    /* Update NGG culling settings. */
    uint8_t old_ngg_culling = sctx->ngg_culling;
    if (GFX_VERSION >= GFX10) {
       struct si_shader_selector *hw_vs;
-      if (NGG && !dispatch_prim_discard_cs && rast_prim == PIPE_PRIM_TRIANGLES &&
+      if (NGG && !dispatch_prim_discard_cs && sctx->current_rast_prim == PIPE_PRIM_TRIANGLES &&
           (hw_vs = si_get_vs_inline(sctx, HAS_TESS, HAS_GS)->cso) &&
           (total_direct_count > hw_vs->ngg_cull_vert_threshold ||
            (!index_size &&
index 3809dce..50257c0 100644 (file)
@@ -2942,6 +2942,30 @@ static void si_update_clip_regs(struct si_context *sctx, struct si_shader_select
       si_mark_atom_dirty(sctx, &sctx->atoms.s.clip_regs);
 }
 
+static void si_update_rasterized_prim(struct si_context *sctx)
+{
+   enum pipe_prim_type rast_prim;
+
+   if (sctx->gs_shader.cso) {
+      /* Only possibilities: POINTS, LINE_STRIP, TRIANGLES */
+      rast_prim = sctx->gs_shader.cso->rast_prim;
+   } else if (sctx->tes_shader.cso) {
+      /* Only possibilities: POINTS, LINE_STRIP, TRIANGLES */
+      rast_prim = sctx->tes_shader.cso->rast_prim;
+   } else {
+      /* Determined by draw calls. */
+      return;
+   }
+
+   if (rast_prim != sctx->current_rast_prim) {
+      if (util_prim_is_points_or_lines(sctx->current_rast_prim) !=
+          util_prim_is_points_or_lines(rast_prim))
+         si_mark_atom_dirty(sctx, &sctx->atoms.s.guardband);
+
+      sctx->current_rast_prim = rast_prim;
+   }
+}
+
 static void si_update_common_shader_state(struct si_context *sctx, struct si_shader_selector *sel,
                                           enum pipe_shader_type type)
 {
@@ -2988,6 +3012,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state)
    si_update_streamout_state(sctx);
    si_update_clip_regs(sctx, old_hw_vs, old_hw_vs_variant, si_get_vs(sctx)->cso,
                        si_get_vs(sctx)->current);
+   si_update_rasterized_prim(sctx);
 }
 
 static void si_update_tess_uses_prim_id(struct si_context *sctx)
@@ -3069,6 +3094,7 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
    si_update_streamout_state(sctx);
    si_update_clip_regs(sctx, old_hw_vs, old_hw_vs_variant, si_get_vs(sctx)->cso,
                        si_get_vs(sctx)->current);
+   si_update_rasterized_prim(sctx);
 }
 
 static void si_bind_tcs_shader(struct pipe_context *ctx, void *state)
@@ -3119,6 +3145,7 @@ static void si_bind_tes_shader(struct pipe_context *ctx, void *state)
    si_update_streamout_state(sctx);
    si_update_clip_regs(sctx, old_hw_vs, old_hw_vs_variant, si_get_vs(sctx)->cso,
                        si_get_vs(sctx)->current);
+   si_update_rasterized_prim(sctx);
 }
 
 static void si_bind_ps_shader(struct pipe_context *ctx, void *state)