Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Mon, Oct 6, 2014 at 10:07 AM, Michel Dänzer <mic...@daenzer.net> wrote: > From: Michel Dänzer <michel.daen...@amd.com> > > Instead of crashing. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79155#c5 > Signed-off-by: Michel Dänzer <michel.daen...@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 | 8 ++++++++ > 3 files changed, 20 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..e76c745 100644 > --- a/src/gallium/drivers/radeonsi/si_state_draw.c > +++ b/src/gallium/drivers/radeonsi/si_state_draw.c > @@ -662,6 +662,14 @@ static void si_update_derived_state(struct si_context > *sctx) > > si_shader_select(ctx, sctx->ps_shader); > > + if (!sctx->ps_shader->current) { > + /* use a dummy shader if compiling the shader (variant) > failed */ > + si_make_dummy_ps(sctx); > + si_shader_select(ctx, sctx->dummy_pixel_shader); > + sctx->ps_shader->current = > + ((struct > si_shader_selector*)sctx->dummy_pixel_shader)->current; > + } > + > if (!sctx->ps_shader->current->pm4) > si_shader_ps(ctx, sctx->ps_shader->current); > > -- > 2.1.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev