From be0a994fb8689131bf6a717c1e6fa5a42c3d4657 Mon Sep 17 00:00:00 2001 From: Michel Dänzer Date: Mon, 6 Oct 2014 17:05:38 +0900 Subject: radeonsi: Use dummy pixel shader if compilation of the real shader failed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of crashing. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79155#c5 Reviewed-by: Marek Olšák --- 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(-) (limited to 'src') diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 57bfa591c56..0166798c0e2 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 7b6de6b663b..f70bddfb8ec 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 e8d84a90d57..c9e4353c3a4 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); -- cgit v1.2.3