From 75817435108bc4a2109074fb6c1d25defe38f5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Thu, 14 Jan 2021 07:22:20 -0500 Subject: [PATCH] radeonsi: set current_rast_prim at bind time for tess and GS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It doesn't have to be done in draw_vbo. Acked-by: Pierre-Eric Pelloux-Prayer Reviewed-by: Zoltán Böszörményi Part-of: --- .../drivers/radeonsi/si_state_draw.cpp | 39 +++++++++---------- .../drivers/radeonsi/si_state_shaders.c | 27 +++++++++++++ 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index 33d54960e12..b4ef3ea1ae5 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -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 && diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 3809dced079..50257c08a11 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -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)