[Mesa-dev] [PATCH] radeonsi: Use dummy pixel shader if compilation of the real shader failed

Marek Olšák maraeo at gmail.com
Mon Oct 6 03:42:00 PDT 2014


Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Mon, Oct 6, 2014 at 10:07 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> Instead of crashing.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=79155#c5
> Signed-off-by: Michel Dänzer <michel.daenzer 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 |  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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list