diff options
author | Timothy Arceri <[email protected]> | 2018-01-26 11:56:50 +1100 |
---|---|---|
committer | Emil Velikov <[email protected]> | 2018-02-05 19:06:01 +0000 |
commit | c369ec95d907953320b4e3cc6498b85e38757f4d (patch) | |
tree | f5d7778673949cb3992ea553075e8ea50a51bfbf | |
parent | 626c84edb301f018836d4b79faa443e7a4b4fb5d (diff) |
st/shader_cache: restore num_tgsi_tokens when loading from cache
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"
Reviewed-by: Gert Wollny <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104762
(cherry picked from commit 041b18cf23a0acf7b0eddf63cd7a2a10192432a1)
-rw-r--r-- | src/mesa/state_tracker/st_shader_cache.c | 25 |
1 files 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 a971b0d7ee7..92c633d4503 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; |