Mesa (master): radeonsi: Use dummy pixel shader if compilation of the real shader failed

Michel Dänzer daenzer at kemper.freedesktop.org
Tue Oct 7 03:21:29 UTC 2014


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

Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Mon Oct  6 17:05:38 2014 +0900

radeonsi: Use dummy pixel shader if compilation of the real shader failed

Instead of crashing.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79155#c5
Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/gallium/drivers/radeonsi/si_state.c      |   18 +++++++++++-------
 src/gallium/drivers/radeonsi/si_state.h      |    1 +
 src/gallium/drivers/radeonsi/si_state_draw.c |   10 ++++++++++
 3 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index 57bfa59..0166798 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2373,6 +2373,16 @@ static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
 	sctx->gs_shader = sel;
 }
 
+void si_make_dummy_ps(struct si_context *sctx)
+{
+	if (!sctx->dummy_pixel_shader) {
+		sctx->dummy_pixel_shader =
+			util_make_fragment_cloneinput_shader(&sctx->b.b, 0,
+							     TGSI_SEMANTIC_GENERIC,
+							     TGSI_INTERPOLATE_CONSTANT);
+	}
+}
+
 static void si_bind_ps_shader(struct pipe_context *ctx, void *state)
 {
 	struct si_context *sctx = (struct si_context *)ctx;
@@ -2384,13 +2394,7 @@ static void si_bind_ps_shader(struct pipe_context *ctx, void *state)
 
 	/* use a dummy shader if binding a NULL shader */
 	if (!sel) {
-		if (!sctx->dummy_pixel_shader) {
-			sctx->dummy_pixel_shader =
-				util_make_fragment_cloneinput_shader(&sctx->b.b, 0,
-								     TGSI_SEMANTIC_GENERIC,
-								     TGSI_INTERPOLATE_CONSTANT);
-		}
-
+		si_make_dummy_ps(sctx);
 		sel = sctx->dummy_pixel_shader;
 	}
 
diff --git a/src/gallium/drivers/radeonsi/si_state.h b/src/gallium/drivers/radeonsi/si_state.h
index 7b6de6b..f70bddf 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -257,6 +257,7 @@ boolean si_is_format_supported(struct pipe_screen *screen,
                                unsigned usage);
 int si_shader_select(struct pipe_context *ctx,
 		     struct si_shader_selector *sel);
+void si_make_dummy_ps(struct si_context *sctx);
 void si_init_state_functions(struct si_context *sctx);
 void si_init_config(struct si_context *sctx);
 unsigned cik_bank_wh(unsigned bankwh);
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index e8d84a9..c9e4353 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -662,6 +662,16 @@ static void si_update_derived_state(struct si_context *sctx)
 
 	si_shader_select(ctx, sctx->ps_shader);
 
+	if (!sctx->ps_shader->current) {
+		struct si_shader_selector *sel;
+
+		/* use a dummy shader if compiling the shader (variant) failed */
+		si_make_dummy_ps(sctx);
+		sel = sctx->dummy_pixel_shader;
+		si_shader_select(ctx, sel);
+		sctx->ps_shader->current = sel->current;
+	}
+
 	if (!sctx->ps_shader->current->pm4)
 		si_shader_ps(ctx, sctx->ps_shader->current);
 




More information about the mesa-commit mailing list