From: Marek Olšák <marek.ol...@amd.com> Any context can release a shader now, so we can't rely on unbinding in delete_shader_selector. --- src/gallium/drivers/radeonsi/si_state_shaders.c | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c index 4a3a04c..478b851 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.c +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c @@ -798,10 +798,24 @@ static void si_bind_vs_shader(struct pipe_context *ctx, void *state) { struct si_context *sctx = (struct si_context *)ctx; struct si_shader_selector *sel = state; + struct si_shader *old = sctx->vs_shader.current; if (sctx->vs_shader.cso == sel) return; + if (old) { + if (old->key.vs.as_es) { + sctx->queued.named.es = NULL; + sctx->emitted.named.es = NULL; + } else if (old->key.vs.as_ls) { + sctx->queued.named.ls = NULL; + sctx->emitted.named.ls = NULL; + } else { + sctx->queued.named.vs = NULL; + sctx->emitted.named.vs = NULL; + } + } + sctx->vs_shader.cso = sel; sctx->vs_shader.current = sel ? sel->first_variant : NULL; si_mark_atom_dirty(sctx, &sctx->clip_regs); @@ -817,6 +831,9 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state) if (sctx->gs_shader.cso == sel) return; + sctx->queued.named.gs = NULL; + sctx->emitted.named.gs = NULL; + sctx->gs_shader.cso = sel; sctx->gs_shader.current = sel ? sel->first_variant : NULL; si_mark_atom_dirty(sctx, &sctx->clip_regs); @@ -836,6 +853,9 @@ static void si_bind_tcs_shader(struct pipe_context *ctx, void *state) if (sctx->tcs_shader.cso == sel) return; + sctx->queued.named.hs = NULL; + sctx->emitted.named.hs = NULL; + sctx->tcs_shader.cso = sel; sctx->tcs_shader.current = sel ? sel->first_variant : NULL; @@ -848,10 +868,21 @@ static void si_bind_tes_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->tes_shader.cso != !!sel; + struct si_shader *old = sctx->vs_shader.current; if (sctx->tes_shader.cso == sel) return; + if (old) { + if (old->key.tes.as_es) { + sctx->queued.named.es = NULL; + sctx->emitted.named.es = NULL; + } else { + sctx->queued.named.vs = NULL; + sctx->emitted.named.vs = NULL; + } + } + sctx->tes_shader.cso = sel; sctx->tes_shader.current = sel ? sel->first_variant : NULL; si_mark_atom_dirty(sctx, &sctx->clip_regs); @@ -873,6 +904,9 @@ static void si_bind_ps_shader(struct pipe_context *ctx, void *state) if (sctx->ps_shader.cso == sel) return; + sctx->queued.named.ps = NULL; + sctx->emitted.named.ps = NULL; + sctx->ps_shader.cso = sel; sctx->ps_shader.current = sel ? sel->first_variant : NULL; si_mark_atom_dirty(sctx, &sctx->cb_target_mask); -- 2.1.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev