[Mesa-dev] [PATCH 2/2] st/shader_cache: restore num_tgsi_tokens when loading from cache

Marek Olšák maraeo at gmail.com
Mon Jan 29 21:40:43 UTC 2018


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

Marek

On Fri, Jan 26, 2018 at 1:56 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> Without this we will fail to correctly serialise programs when
> using glGetProgramBinary() if the program was retrieved from
> the disk cache rather than freshly compiled.
>
> Fixes: c69b0dd6817b "st/glsl_to_tgsi: store num_tgsi_tokens in st_*_program"
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104762
> ---
>  src/mesa/state_tracker/st_shader_cache.c | 25 ++++++++++++++++---------
>  1 file changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
> index a971b0d7ee..92c633d450 100644
> --- a/src/mesa/state_tracker/st_shader_cache.c
> +++ b/src/mesa/state_tracker/st_shader_cache.c
> @@ -142,10 +142,11 @@ read_stream_out_from_cache(struct blob_reader *blob_reader,
>
>  static void
>  read_tgsi_from_cache(struct blob_reader *blob_reader,
> -                     const struct tgsi_token **tokens)
> +                     const struct tgsi_token **tokens,
> +                     unsigned *num_tokens)
>  {
> -   uint32_t num_tokens  = blob_read_uint32(blob_reader);
> -   unsigned tokens_size = num_tokens * sizeof(struct tgsi_token);
> +   *num_tokens  = blob_read_uint32(blob_reader);
> +   unsigned tokens_size = *num_tokens * sizeof(struct tgsi_token);
>     *tokens = (const struct tgsi_token*) MALLOC(tokens_size);
>     blob_copy_bytes(blob_reader, (uint8_t *) *tokens, tokens_size);
>  }
> @@ -175,7 +176,8 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
>                        sizeof(stvp->result_to_output));
>
>        read_stream_out_from_cache(&blob_reader, &stvp->tgsi);
> -      read_tgsi_from_cache(&blob_reader, &stvp->tgsi.tokens);
> +      read_tgsi_from_cache(&blob_reader, &stvp->tgsi.tokens,
> +                           &stvp->num_tgsi_tokens);
>
>        if (st->vp == stvp)
>           st->dirty |= ST_NEW_VERTEX_PROGRAM(st, stvp);
> @@ -189,7 +191,8 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
>                                  &sttcp->variants, &sttcp->tgsi);
>
>        read_stream_out_from_cache(&blob_reader, &sttcp->tgsi);
> -      read_tgsi_from_cache(&blob_reader, &sttcp->tgsi.tokens);
> +      read_tgsi_from_cache(&blob_reader, &sttcp->tgsi.tokens,
> +                           &sttcp->num_tgsi_tokens);
>
>        if (st->tcp == sttcp)
>           st->dirty |= sttcp->affected_states;
> @@ -203,7 +206,8 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
>                                  &sttep->variants, &sttep->tgsi);
>
>        read_stream_out_from_cache(&blob_reader, &sttep->tgsi);
> -      read_tgsi_from_cache(&blob_reader, &sttep->tgsi.tokens);
> +      read_tgsi_from_cache(&blob_reader, &sttep->tgsi.tokens,
> +                           &sttep->num_tgsi_tokens);
>
>        if (st->tep == sttep)
>           st->dirty |= sttep->affected_states;
> @@ -217,7 +221,8 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
>                                  &stgp->tgsi);
>
>        read_stream_out_from_cache(&blob_reader, &stgp->tgsi);
> -      read_tgsi_from_cache(&blob_reader, &stgp->tgsi.tokens);
> +      read_tgsi_from_cache(&blob_reader, &stgp->tgsi.tokens,
> +                           &stgp->num_tgsi_tokens);
>
>        if (st->gp == stgp)
>           st->dirty |= stgp->affected_states;
> @@ -229,7 +234,8 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
>
>        st_release_fp_variants(st, stfp);
>
> -      read_tgsi_from_cache(&blob_reader, &stfp->tgsi.tokens);
> +      read_tgsi_from_cache(&blob_reader, &stfp->tgsi.tokens,
> +                           &stfp->num_tgsi_tokens);
>
>        if (st->fp == stfp)
>           st->dirty |= stfp->affected_states;
> @@ -242,7 +248,8 @@ st_deserialise_tgsi_program(struct gl_context *ctx,
>        st_release_cp_variants(st, stcp);
>
>        read_tgsi_from_cache(&blob_reader,
> -                           (const struct tgsi_token**) &stcp->tgsi.prog);
> +                           (const struct tgsi_token**) &stcp->tgsi.prog,
> +                           &stcp->num_tgsi_tokens);
>
>        stcp->tgsi.req_local_mem = stcp->Base.info.cs.shared_size;
>        stcp->tgsi.req_private_mem = 0;
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list