From: Nicolai Hähnle <nicolai.haeh...@amd.com> In a VS->TCS->TES->PS pipeline, the primitive ID is read from TES exports, so it is as if TES were using the primitive ID.
Specifically, this fixes a bug where the primitive ID is not reset at the start of a new instance. Cc: mesa-sta...@lists.freedesktop.org --- src/gallium/drivers/radeonsi/si_state_shaders.c | 27 ++++++++++++++++--------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index e479422..d756f30 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -2132,50 +2132,55 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state) if (sctx->vs_shader.cso == sel) return; sctx->vs_shader.cso = sel; sctx->vs_shader.current = sel ? sel->first_variant : NULL; sctx->do_update_shaders = true; si_mark_atom_dirty(sctx, &sctx->clip_regs); r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx)); } +static void si_update_tcs_tes_uses_prim_id(struct si_context *sctx) +{ + sctx->ia_multi_vgt_param_key.u.tcs_tes_uses_prim_id = + (sctx->tes_shader.cso && + sctx->tes_shader.cso->info.uses_primid) || + (sctx->tcs_shader.cso && + sctx->tcs_shader.cso->info.uses_primid) || + (sctx->ps_shader.cso && !sctx->gs_shader.cso && + sctx->ps_shader.cso->info.uses_primid); +} + static void si_bind_gs_shader(struct pipe_context *ctx, void *state) { struct si_context *sctx = (struct si_context *)ctx; struct si_shader_selector *sel = state; bool enable_changed = !!sctx->gs_shader.cso != !!sel; if (sctx->gs_shader.cso == sel) return; sctx->gs_shader.cso = sel; sctx->gs_shader.current = sel ? sel->first_variant : NULL; sctx->ia_multi_vgt_param_key.u.uses_gs = sel != NULL; sctx->do_update_shaders = true; si_mark_atom_dirty(sctx, &sctx->clip_regs); sctx->last_rast_prim = -1; /* reset this so that it gets updated */ - if (enable_changed) + if (enable_changed) { si_shader_change_notify(sctx); + if (sctx->ia_multi_vgt_param_key.u.uses_tess) + si_update_tcs_tes_uses_prim_id(sctx); + } r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx)); } -static void si_update_tcs_tes_uses_prim_id(struct si_context *sctx) -{ - sctx->ia_multi_vgt_param_key.u.tcs_tes_uses_prim_id = - (sctx->tes_shader.cso && - sctx->tes_shader.cso->info.uses_primid) || - (sctx->tcs_shader.cso && - sctx->tcs_shader.cso->info.uses_primid); -} - static void si_bind_tcs_shader(struct pipe_context *ctx, void *state) { struct si_context *sctx = (struct si_context *)ctx; struct si_shader_selector *sel = state; bool enable_changed = !!sctx->tcs_shader.cso != !!sel; if (sctx->tcs_shader.cso == sel) return; sctx->tcs_shader.cso = sel; @@ -2216,20 +2221,22 @@ static void si_bind_ps_shader(struct pipe_context *ctx, void *state) struct si_context *sctx = (struct si_context *)ctx; struct si_shader_selector *sel = state; /* skip if supplied shader is one already in use */ if (sctx->ps_shader.cso == sel) return; sctx->ps_shader.cso = sel; sctx->ps_shader.current = sel ? sel->first_variant : NULL; sctx->do_update_shaders = true; + if (sel && sctx->ia_multi_vgt_param_key.u.uses_tess) + si_update_tcs_tes_uses_prim_id(sctx); si_mark_atom_dirty(sctx, &sctx->cb_render_state); } static void si_delete_shader(struct si_context *sctx, struct si_shader *shader) { if (shader->is_optimized) { util_queue_fence_wait(&shader->optimized_ready); util_queue_fence_destroy(&shader->optimized_ready); } -- 2.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev