Mesa (master): radeonsi: unify shader delete functions

Marek Olšák mareko at kemper.freedesktop.org
Sat Oct 17 19:47:30 UTC 2015


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Oct  9 01:08:42 2015 +0200

radeonsi: unify shader delete functions

Reviewed-by: Michel Dänzer <michel.daenzer at amd.com>

---

 src/gallium/drivers/radeonsi/si_state_shaders.c |   84 +++++------------------
 1 file changed, 17 insertions(+), 67 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 9d05cb5..cc053bb 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -907,11 +907,21 @@ static void si_bind_ps_shader(struct pipe_context *ctx, void *state)
 	si_mark_atom_dirty(sctx, &sctx->cb_target_mask);
 }
 
-static void si_delete_shader_selector(struct pipe_context *ctx,
-				      struct si_shader_selector *sel)
+static void si_delete_shader_selector(struct pipe_context *ctx, void *state)
 {
 	struct si_context *sctx = (struct si_context *)ctx;
+	struct si_shader_selector *sel = (struct si_shader_selector *)state;
 	struct si_shader *p = sel->current, *c;
+	struct si_shader_selector **current_shader[SI_NUM_SHADERS] = {
+		[PIPE_SHADER_VERTEX] = &sctx->vs_shader,
+		[PIPE_SHADER_TESS_CTRL] = &sctx->tcs_shader,
+		[PIPE_SHADER_TESS_EVAL] = &sctx->tes_shader,
+		[PIPE_SHADER_GEOMETRY] = &sctx->gs_shader,
+		[PIPE_SHADER_FRAGMENT] = &sctx->ps_shader,
+	};
+
+	if (*current_shader[sel->type] == sel)
+		*current_shader[sel->type] = NULL;
 
 	while (p) {
 		c = p->next_variant;
@@ -951,66 +961,6 @@ static void si_delete_shader_selector(struct pipe_context *ctx,
 	free(sel);
 }
 
-static void si_delete_vs_shader(struct pipe_context *ctx, void *state)
-{
-	struct si_context *sctx = (struct si_context *)ctx;
-	struct si_shader_selector *sel = (struct si_shader_selector *)state;
-
-	if (sctx->vs_shader == sel) {
-		sctx->vs_shader = NULL;
-	}
-
-	si_delete_shader_selector(ctx, sel);
-}
-
-static void si_delete_gs_shader(struct pipe_context *ctx, void *state)
-{
-	struct si_context *sctx = (struct si_context *)ctx;
-	struct si_shader_selector *sel = (struct si_shader_selector *)state;
-
-	if (sctx->gs_shader == sel) {
-		sctx->gs_shader = NULL;
-	}
-
-	si_delete_shader_selector(ctx, sel);
-}
-
-static void si_delete_ps_shader(struct pipe_context *ctx, void *state)
-{
-	struct si_context *sctx = (struct si_context *)ctx;
-	struct si_shader_selector *sel = (struct si_shader_selector *)state;
-
-	if (sctx->ps_shader == sel) {
-		sctx->ps_shader = NULL;
-	}
-
-	si_delete_shader_selector(ctx, sel);
-}
-
-static void si_delete_tcs_shader(struct pipe_context *ctx, void *state)
-{
-	struct si_context *sctx = (struct si_context *)ctx;
-	struct si_shader_selector *sel = (struct si_shader_selector *)state;
-
-	if (sctx->tcs_shader == sel) {
-		sctx->tcs_shader = NULL;
-	}
-
-	si_delete_shader_selector(ctx, sel);
-}
-
-static void si_delete_tes_shader(struct pipe_context *ctx, void *state)
-{
-	struct si_context *sctx = (struct si_context *)ctx;
-	struct si_shader_selector *sel = (struct si_shader_selector *)state;
-
-	if (sctx->tes_shader == sel) {
-		sctx->tes_shader = NULL;
-	}
-
-	si_delete_shader_selector(ctx, sel);
-}
-
 static void si_emit_spi_map(struct si_context *sctx, struct r600_atom *atom)
 {
 	struct radeon_winsys_cs *cs = sctx->b.rings.gfx.cs;
@@ -1675,9 +1625,9 @@ void si_init_shader_functions(struct si_context *sctx)
 	sctx->b.b.bind_gs_state = si_bind_gs_shader;
 	sctx->b.b.bind_fs_state = si_bind_ps_shader;
 
-	sctx->b.b.delete_vs_state = si_delete_vs_shader;
-	sctx->b.b.delete_tcs_state = si_delete_tcs_shader;
-	sctx->b.b.delete_tes_state = si_delete_tes_shader;
-	sctx->b.b.delete_gs_state = si_delete_gs_shader;
-	sctx->b.b.delete_fs_state = si_delete_ps_shader;
+	sctx->b.b.delete_vs_state = si_delete_shader_selector;
+	sctx->b.b.delete_tcs_state = si_delete_shader_selector;
+	sctx->b.b.delete_tes_state = si_delete_shader_selector;
+	sctx->b.b.delete_gs_state = si_delete_shader_selector;
+	sctx->b.b.delete_fs_state = si_delete_shader_selector;
 }




More information about the mesa-commit mailing list