[Mesa-dev,6/7] radeonsi: properly unbind shader states

Submitted by Marek Olšák on Oct. 22, 2015, 11:12 p.m.

Details

Message ID 1445555539-26595-7-git-send-email-maraeo@gmail.com
State New
Headers show
Series "RadeonSI: Unbind shaders properly" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Marek Olšák Oct. 22, 2015, 11:12 p.m.
From: Marek Olšák <marek.olsak@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(+)

Patch hide | download patch | download mbox

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);