This only depends on the patch_vertices and the TCS.
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18195>
{
struct si_context *sctx = (struct si_context *)ctx;
- sctx->patch_vertices = patch_vertices;
+ if (sctx->patch_vertices != patch_vertices) {
+ sctx->patch_vertices = patch_vertices;
+ si_update_tess_in_out_patch_vertices(sctx);
+ }
}
static void si_texture_barrier(struct pipe_context *ctx, unsigned flags)
bool si_update_spi_tmpring_size(struct si_context *sctx, unsigned bytes);
unsigned si_get_shader_prefetch_size(struct si_shader *shader);
bool si_set_tcs_to_fixed_func_shader(struct si_context *sctx);
+void si_update_tess_in_out_patch_vertices(struct si_context *sctx);
/* si_state_draw.cpp */
void si_cp_dma_prefetch(struct si_context *sctx, struct pipe_resource *buf,
si_decompress_textures(sctx, u_bit_consecutive(0, SI_NUM_GRAPHICS_SHADERS));
si_need_gfx_cs_space(sctx, num_draws);
- if (HAS_TESS) {
- if (sctx->is_user_tcs) {
- struct si_shader_selector *tcs = sctx->shader.tcs.cso;
-
- bool same_patch_vertices =
- GFX_VERSION >= GFX9 &&
- sctx->patch_vertices == tcs->info.base.tess.tcs_vertices_out;
-
- if (sctx->shader.tcs.key.ge.opt.same_patch_vertices != same_patch_vertices) {
- sctx->shader.tcs.key.ge.opt.same_patch_vertices = same_patch_vertices;
- sctx->do_update_shaders = true;
- }
-
- if (GFX_VERSION == GFX9 && sctx->screen->info.has_ls_vgpr_init_bug) {
- /* Determine whether the LS VGPR fix should be applied.
- *
- * It is only required when num input CPs > num output CPs,
- * which cannot happen with the fixed function TCS.
- */
- bool ls_vgpr_fix =
- sctx->patch_vertices > tcs->info.base.tess.tcs_vertices_out;
-
- if (ls_vgpr_fix != sctx->shader.tcs.key.ge.part.tcs.ls_prolog.ls_vgpr_fix) {
- sctx->shader.tcs.key.ge.part.tcs.ls_prolog.ls_vgpr_fix = ls_vgpr_fix;
- sctx->do_update_shaders = true;
- }
- }
- } else {
- /* These fields are static for fixed function TCS. So no need to set
- * do_update_shaders between fixed-TCS draws. As fixed-TCS to user-TCS
- * or opposite, do_update_shaders should already be set by bind state.
- */
- sctx->shader.tcs.key.ge.opt.same_patch_vertices = GFX_VERSION >= GFX9;
- sctx->shader.tcs.key.ge.part.tcs.ls_prolog.ls_vgpr_fix = false;
-
- /* User may only change patch vertices, needs to update fixed func TCS. */
- if (sctx->shader.tcs.cso &&
- sctx->shader.tcs.cso->info.base.tess.tcs_vertices_out != sctx->patch_vertices)
- sctx->do_update_shaders = true;
- }
- }
-
unsigned instance_count = info->instance_count;
/* GFX6-GFX7 treat instance_count==0 as instance_count==1. There is
sctx->shader.tcs.key.ge.part.tcs.epilog.invoc0_tess_factors_are_def =
sel ? sel->info.tessfactors_are_def_in_all_invocs : 0;
si_update_tess_uses_prim_id(sctx);
+ si_update_tess_in_out_patch_vertices(sctx);
si_update_common_shader_state(sctx, sel, PIPE_SHADER_TESS_CTRL);
return true;
}
+void si_update_tess_in_out_patch_vertices(struct si_context *sctx)
+{
+ if (sctx->is_user_tcs) {
+ struct si_shader_selector *tcs = sctx->shader.tcs.cso;
+
+ bool same_patch_vertices =
+ sctx->gfx_level >= GFX9 &&
+ sctx->patch_vertices == tcs->info.base.tess.tcs_vertices_out;
+
+ if (sctx->shader.tcs.key.ge.opt.same_patch_vertices != same_patch_vertices) {
+ sctx->shader.tcs.key.ge.opt.same_patch_vertices = same_patch_vertices;
+ sctx->do_update_shaders = true;
+ }
+
+ if (sctx->gfx_level == GFX9 && sctx->screen->info.has_ls_vgpr_init_bug) {
+ /* Determine whether the LS VGPR fix should be applied.
+ *
+ * It is only required when num input CPs > num output CPs,
+ * which cannot happen with the fixed function TCS.
+ */
+ bool ls_vgpr_fix =
+ sctx->patch_vertices > tcs->info.base.tess.tcs_vertices_out;
+
+ if (ls_vgpr_fix != sctx->shader.tcs.key.ge.part.tcs.ls_prolog.ls_vgpr_fix) {
+ sctx->shader.tcs.key.ge.part.tcs.ls_prolog.ls_vgpr_fix = ls_vgpr_fix;
+ sctx->do_update_shaders = true;
+ }
+ }
+ } else {
+ /* These fields are static for fixed function TCS. So no need to set
+ * do_update_shaders between fixed-TCS draws. As fixed-TCS to user-TCS
+ * or opposite, do_update_shaders should already be set by bind state.
+ */
+ sctx->shader.tcs.key.ge.opt.same_patch_vertices = sctx->gfx_level >= GFX9;
+ sctx->shader.tcs.key.ge.part.tcs.ls_prolog.ls_vgpr_fix = false;
+
+ /* User may only change patch vertices, needs to update fixed func TCS. */
+ if (sctx->shader.tcs.cso &&
+ sctx->shader.tcs.cso->info.base.tess.tcs_vertices_out != sctx->patch_vertices)
+ sctx->do_update_shaders = true;
+ }
+}
+
void si_init_screen_live_shader_cache(struct si_screen *sscreen)
{
util_live_shader_cache_init(&sscreen->live_shader_cache, si_create_shader_selector,