[Mesa-dev] [PATCH v2] st/glsl_to_tgsi: stop passing pipe_shader_state to st_store_tgsi_in_disk_cache()
Dieter Nützel
Dieter at nuetzel-hh.de
Mon Dec 11 02:28:42 UTC 2017
Am 10.12.2017 23:03, schrieb Timothy Arceri:
> We can instead just get this from st_*_program.
>
> V2: store tokens to to st_compute_program before attempting to
double 'to'
Appart from this:
tb from me.
Dieter
> write to cache (fixes crash).
> ---
> src/mesa/state_tracker/st_program.c | 8 ++++----
> src/mesa/state_tracker/st_shader_cache.c | 22 ++++++++++++----------
> src/mesa/state_tracker/st_shader_cache.h | 3 +--
> 3 files changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_program.c
> b/src/mesa/state_tracker/st_program.c
> index 9f8bf5f76fd..77136edbb92 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -532,21 +532,21 @@ st_translate_vertex_program(struct st_context
> *st,
> _mesa_print_program(&stvp->Base);
> debug_assert(0);
> return false;
> }
>
> stvp->tgsi.tokens = ureg_get_tokens(ureg, &stvp->num_tgsi_tokens);
> ureg_destroy(ureg);
>
> if (stvp->glsl_to_tgsi) {
> stvp->glsl_to_tgsi = NULL;
> - st_store_tgsi_in_disk_cache(st, &stvp->Base, NULL);
> + st_store_tgsi_in_disk_cache(st, &stvp->Base);
> }
>
> return stvp->tgsi.tokens != NULL;
> }
>
> static struct st_vp_variant *
> st_create_vp_variant(struct st_context *st,
> struct st_vertex_program *stvp,
> const struct st_vp_variant_key *key)
> {
> @@ -989,21 +989,21 @@ st_translate_fragment_program(struct st_context
> *st,
> fs_num_outputs,
> outputMapping,
> fs_output_semantic_name,
> fs_output_semantic_index);
>
> stfp->tgsi.tokens = ureg_get_tokens(ureg, &stfp->num_tgsi_tokens);
> ureg_destroy(ureg);
>
> if (stfp->glsl_to_tgsi) {
> stfp->glsl_to_tgsi = NULL;
> - st_store_tgsi_in_disk_cache(st, &stfp->Base, NULL);
> + st_store_tgsi_in_disk_cache(st, &stfp->Base);
> }
>
> return stfp->tgsi.tokens != NULL;
> }
>
> static struct st_fp_variant *
> st_create_fp_variant(struct st_context *st,
> struct st_fragment_program *stfp,
> const struct st_fp_variant_key *key)
> {
> @@ -1394,31 +1394,32 @@ st_translate_program_common(struct st_context
> *st,
> NULL,
> /* outputs */
> num_outputs,
> outputMapping,
> output_semantic_name,
> output_semantic_index);
>
> if (tgsi_processor == PIPE_SHADER_COMPUTE) {
> struct st_compute_program *stcp = (struct st_compute_program *)
> prog;
> out_state->tokens = ureg_get_tokens(ureg,
> &stcp->num_tgsi_tokens);
> + stcp->tgsi.prog = out_state->tokens;
> } else {
> struct st_common_program *stcp = (struct st_common_program *)
> prog;
> out_state->tokens = ureg_get_tokens(ureg,
> &stcp->num_tgsi_tokens);
> }
> ureg_destroy(ureg);
>
> st_translate_stream_output_info(glsl_to_tgsi,
> outputMapping,
> &out_state->stream_output);
>
> - st_store_tgsi_in_disk_cache(st, prog, out_state);
> + st_store_tgsi_in_disk_cache(st, prog);
>
> if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
> _mesa_print_program(prog);
> debug_printf("\n");
> }
>
> if (ST_DEBUG & DEBUG_TGSI) {
> tgsi_dump(out_state->tokens, 0);
> debug_printf("\n");
> }
> @@ -1617,21 +1618,20 @@ st_translate_compute_program(struct st_context
> *st,
> }
>
> ureg = ureg_create_with_screen(PIPE_SHADER_COMPUTE,
> st->pipe->screen);
> if (ureg == NULL)
> return false;
>
> st_translate_program_common(st, &stcp->Base, stcp->glsl_to_tgsi,
> ureg,
> PIPE_SHADER_COMPUTE, &prog);
>
> stcp->tgsi.ir_type = PIPE_SHADER_IR_TGSI;
> - stcp->tgsi.prog = prog.tokens;
> stcp->tgsi.req_local_mem = stcp->Base.info.cs.shared_size;
> stcp->tgsi.req_private_mem = 0;
> stcp->tgsi.req_input_mem = 0;
>
> free_glsl_to_tgsi_visitor(stcp->glsl_to_tgsi);
> stcp->glsl_to_tgsi = NULL;
> return true;
> }
>
>
> diff --git a/src/mesa/state_tracker/st_shader_cache.c
> b/src/mesa/state_tracker/st_shader_cache.c
> index a9413fb0534..1d9b1727552 100644
> --- a/src/mesa/state_tracker/st_shader_cache.c
> +++ b/src/mesa/state_tracker/st_shader_cache.c
> @@ -32,38 +32,36 @@
>
> static void
> write_stream_out_to_cache(struct blob *blob,
> struct pipe_shader_state *tgsi)
> {
> blob_write_bytes(blob, &tgsi->stream_output,
> sizeof(tgsi->stream_output));
> }
>
> static void
> -write_tgsi_to_cache(struct blob *blob, struct pipe_shader_state *tgsi,
> +write_tgsi_to_cache(struct blob *blob, const struct tgsi_token
> *tokens,
> struct gl_program *prog, unsigned num_tokens)
> {
> blob_write_uint32(blob, num_tokens);
> - blob_write_bytes(blob, tgsi->tokens,
> - num_tokens * sizeof(struct tgsi_token));
> + blob_write_bytes(blob, tokens, num_tokens * sizeof(struct
> tgsi_token));
>
> prog->driver_cache_blob = ralloc_size(NULL, blob->size);
> memcpy(prog->driver_cache_blob, blob->data, blob->size);
> prog->driver_cache_blob_size = blob->size;
> }
>
> /**
> * Store tgsi and any other required state in on-disk shader cache.
> */
> void
> -st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program
> *prog,
> - struct pipe_shader_state *out_state)
> +st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program
> *prog)
> {
> if (!st->ctx->Cache)
> return;
>
> /* Exit early when we are dealing with a ff shader with no source
> file to
> * generate a source from.
> */
> static const char zero[sizeof(prog->sh.data->sha1)] = {0};
> if (memcmp(prog->sh.data->sha1, zero, sizeof(prog->sh.data->sha1))
> == 0)
> return;
> @@ -75,42 +73,46 @@ st_store_tgsi_in_disk_cache(struct st_context *st,
> struct gl_program *prog,
> case MESA_SHADER_VERTEX: {
> struct st_vertex_program *stvp = (struct st_vertex_program *)
> prog;
>
> blob_write_uint32(&blob, stvp->num_inputs);
> blob_write_bytes(&blob, stvp->index_to_input,
> sizeof(stvp->index_to_input));
> blob_write_bytes(&blob, stvp->result_to_output,
> sizeof(stvp->result_to_output));
>
> write_stream_out_to_cache(&blob, &stvp->tgsi);
> - write_tgsi_to_cache(&blob, &stvp->tgsi, prog,
> stvp->num_tgsi_tokens);
> + write_tgsi_to_cache(&blob, stvp->tgsi.tokens, prog,
> + stvp->num_tgsi_tokens);
> break;
> }
> case MESA_SHADER_TESS_CTRL:
> case MESA_SHADER_TESS_EVAL:
> case MESA_SHADER_GEOMETRY: {
> struct st_common_program *stcp = (struct st_common_program *)
> prog;
>
> - write_stream_out_to_cache(&blob, out_state);
> - write_tgsi_to_cache(&blob, out_state, prog,
> stcp->num_tgsi_tokens);
> + write_stream_out_to_cache(&blob, &stcp->tgsi);
> + write_tgsi_to_cache(&blob, stcp->tgsi.tokens, prog,
> + stcp->num_tgsi_tokens);
> break;
> }
> case MESA_SHADER_FRAGMENT: {
> struct st_fragment_program *stfp = (struct st_fragment_program
> *) prog;
>
> - write_tgsi_to_cache(&blob, &stfp->tgsi, prog,
> stfp->num_tgsi_tokens);
> + write_tgsi_to_cache(&blob, stfp->tgsi.tokens, prog,
> + stfp->num_tgsi_tokens);
> break;
> }
> case MESA_SHADER_COMPUTE: {
> struct st_compute_program *stcp = (struct st_compute_program *)
> prog;
>
> - write_tgsi_to_cache(&blob, out_state, prog,
> stcp->num_tgsi_tokens);
> + write_tgsi_to_cache(&blob, stcp->tgsi.prog, prog,
> + stcp->num_tgsi_tokens);
> break;
> }
> default:
> unreachable("Unsupported stage");
> }
>
> if (st->ctx->_Shader->Flags & GLSL_CACHE_INFO) {
> fprintf(stderr, "putting %s tgsi_tokens in cache\n",
> _mesa_shader_stage_to_string(prog->info.stage));
> }
> diff --git a/src/mesa/state_tracker/st_shader_cache.h
> b/src/mesa/state_tracker/st_shader_cache.h
> index 7644d437521..81a2935d7ba 100644
> --- a/src/mesa/state_tracker/st_shader_cache.h
> +++ b/src/mesa/state_tracker/st_shader_cache.h
> @@ -30,16 +30,15 @@
>
> #ifdef __cplusplus
> extern "C" {
> #endif
>
> bool
> st_load_tgsi_from_disk_cache(struct gl_context *ctx,
> struct gl_shader_program *prog);
>
> void
> -st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program
> *prog,
> - struct pipe_shader_state *out_state);
> +st_store_tgsi_in_disk_cache(struct st_context *st, struct gl_program
> *prog);
>
> #ifdef __cplusplus
> }
> #endif
More information about the mesa-dev
mailing list