Mesa (master): r600g: properly unbind a DSA state being deleted in r600_delete_dsa_state

Marek Olšák mareko at kemper.freedesktop.org
Mon Nov 4 18:11:06 UTC 2013


Module: Mesa
Branch: master
Commit: 6463b94973912c2c7f056132e8744db0dc98c6b8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6463b94973912c2c7f056132e8744db0dc98c6b8

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sun Nov  3 20:27:28 2013 +0100

r600g: properly unbind a DSA state being deleted in r600_delete_dsa_state

Tested-by: Christian König <christian.koenig at amd.com>

---

 src/gallium/drivers/r600/r600_pipe.h         |    2 +-
 src/gallium/drivers/r600/r600_state_common.c |    9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 6aa944c..d7af618 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -538,7 +538,7 @@ static INLINE void r600_set_cso_state_with_cb(struct r600_cso_state *state, void
 					      struct r600_command_buffer *cb)
 {
 	state->cb = cb;
-	state->atom.num_dw = cb->num_dw;
+	state->atom.num_dw = cb ? cb->num_dw : 0;
 	r600_set_cso_state(state, cso);
 }
 
diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index 8f164bf..7d3c5bc 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -269,8 +269,10 @@ static void r600_bind_dsa_state(struct pipe_context *ctx, void *state)
 	struct r600_dsa_state *dsa = state;
 	struct r600_stencil_ref ref;
 
-	if (state == NULL)
+	if (state == NULL) {
+		r600_set_cso_state_with_cb(&rctx->dsa_state, NULL, NULL);
 		return;
+	}
 
 	r600_set_cso_state_with_cb(&rctx->dsa_state, dsa, &dsa->buffer);
 
@@ -458,8 +460,13 @@ static void r600_delete_blend_state(struct pipe_context *ctx, void *state)
 
 static void r600_delete_dsa_state(struct pipe_context *ctx, void *state)
 {
+	struct r600_context *rctx = (struct r600_context *)ctx;
 	struct r600_dsa_state *dsa = (struct r600_dsa_state *)state;
 
+	if (rctx->dsa_state.cso == state) {
+		ctx->bind_depth_stencil_alpha_state(ctx, NULL);
+	}
+
 	r600_release_command_buffer(&dsa->buffer);
 	free(dsa);
 }




More information about the mesa-commit mailing list