From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/drivers/radeonsi/si_state_shaders.c | 35 ++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 2e33138..c21f855 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -2173,74 +2173,100 @@ static void si_update_streamout_state(struct si_context *sctx) struct si_shader_selector *shader_with_so = si_get_vs(sctx)->cso; if (!shader_with_so) return; sctx->b.streamout.enabled_stream_buffers_mask = shader_with_so->enabled_streamout_buffer_mask; sctx->b.streamout.stride_in_dw = shader_with_so->so.stride; } +static void si_update_clip_regs(struct si_context *sctx, + struct si_shader_selector *old_hw_vs, + struct si_shader *old_hw_vs_variant, + struct si_shader_selector *next_hw_vs, + struct si_shader *next_hw_vs_variant) +{ + if (next_hw_vs && + (!old_hw_vs || + old_hw_vs->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] != + next_hw_vs->info.properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] || + old_hw_vs->pa_cl_vs_out_cntl != next_hw_vs->pa_cl_vs_out_cntl || + old_hw_vs->clipdist_mask != next_hw_vs->clipdist_mask || + old_hw_vs->culldist_mask != next_hw_vs->culldist_mask || + !old_hw_vs_variant || + !next_hw_vs_variant || + old_hw_vs_variant->key.opt.hw_vs.clip_disable != + next_hw_vs_variant->key.opt.hw_vs.clip_disable)) + si_mark_atom_dirty(sctx, &sctx->clip_regs); +} + static void si_bind_vs_shader(struct pipe_context *ctx, void *state) { struct si_context *sctx = (struct si_context *)ctx; + struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso; + struct si_shader *old_hw_vs_variant = si_get_vs_state(sctx); struct si_shader_selector *sel = 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)); si_set_active_descriptors_for_shader(sctx, sel); 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_state(sctx)); } static void si_update_tess_uses_prim_id(struct si_context *sctx) { sctx->ia_multi_vgt_param_key.u.tess_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->gs_shader.cso && sctx->gs_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 *old_hw_vs = si_get_vs(sctx)->cso; + struct si_shader *old_hw_vs_variant = si_get_vs_state(sctx); 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) { si_shader_change_notify(sctx); if (sctx->ia_multi_vgt_param_key.u.uses_tess) si_update_tess_uses_prim_id(sctx); } r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx)); si_set_active_descriptors_for_shader(sctx, sel); 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_state(sctx)); } 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; @@ -2252,41 +2278,44 @@ static void si_bind_tcs_shader(struct pipe_context *ctx, void *state) if (enable_changed) sctx->last_tcs = NULL; /* invalidate derived tess state */ si_set_active_descriptors_for_shader(sctx, sel); } static void si_bind_tes_shader(struct pipe_context *ctx, void *state) { struct si_context *sctx = (struct si_context *)ctx; + struct si_shader_selector *old_hw_vs = si_get_vs(sctx)->cso; + struct si_shader *old_hw_vs_variant = si_get_vs_state(sctx); struct si_shader_selector *sel = state; bool enable_changed = !!sctx->tes_shader.cso != !!sel; if (sctx->tes_shader.cso == sel) return; sctx->tes_shader.cso = sel; sctx->tes_shader.current = sel ? sel->first_variant : NULL; sctx->ia_multi_vgt_param_key.u.uses_tess = sel != NULL; si_update_tess_uses_prim_id(sctx); 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) { si_shader_change_notify(sctx); sctx->last_tes_sh_base = -1; /* invalidate derived tess state */ } r600_update_vs_writes_viewport_index(&sctx->b, si_get_vs_info(sctx)); si_set_active_descriptors_for_shader(sctx, sel); 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_state(sctx)); } 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; -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev