[Mesa-dev] [PATCH 1/5] st/glsl_to_tgsi: store num_tgsi_tokens in st_*_program
Timothy Arceri
tarceri at itsqueeze.com
Fri Jan 5 02:01:39 UTC 2018
Ping!
On 08/12/17 20:57, Timothy Arceri wrote:
> We will need this for ARB_get_program_binary binary support.
> ---
> src/mesa/state_tracker/st_program.c | 21 ++++++++++++---------
> src/mesa/state_tracker/st_program.h | 12 ++++++++++++
> src/mesa/state_tracker/st_shader_cache.c | 15 +++++++++------
> src/mesa/state_tracker/st_shader_cache.h | 3 +--
> 4 files changed, 34 insertions(+), 17 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
> index 05e6042f425..9f8bf5f76fd 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -527,27 +527,26 @@ st_translate_vertex_program(struct st_context *st,
> output_semantic_name,
> output_semantic_index);
>
> if (error) {
> debug_printf("%s: failed to translate Mesa program:\n", __func__);
> _mesa_print_program(&stvp->Base);
> debug_assert(0);
> return false;
> }
>
> - unsigned num_tokens;
> - stvp->tgsi.tokens = ureg_get_tokens(ureg, &num_tokens);
> + 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, num_tokens);
> + st_store_tgsi_in_disk_cache(st, &stvp->Base, NULL);
> }
>
> 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)
> {
> @@ -985,27 +984,26 @@ st_translate_fragment_program(struct st_context *st,
> inputMapping,
> input_semantic_name,
> input_semantic_index,
> interpMode,
> /* outputs */
> fs_num_outputs,
> outputMapping,
> fs_output_semantic_name,
> fs_output_semantic_index);
>
> - unsigned num_tokens;
> - stfp->tgsi.tokens = ureg_get_tokens(ureg, &num_tokens);
> + 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, num_tokens);
> + st_store_tgsi_in_disk_cache(st, &stfp->Base, NULL);
> }
>
> 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)
> {
> @@ -1393,29 +1391,34 @@ st_translate_program_common(struct st_context *st,
> inputSlotToAttr,
> input_semantic_name,
> input_semantic_index,
> NULL,
> /* outputs */
> num_outputs,
> outputMapping,
> output_semantic_name,
> output_semantic_index);
>
> - unsigned num_tokens;
> - out_state->tokens = ureg_get_tokens(ureg, &num_tokens);
> + 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);
> + } 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, num_tokens);
> + st_store_tgsi_in_disk_cache(st, prog, out_state);
>
> 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");
> }
> diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
> index 0e6c8e00c6e..a520ffbecb4 100644
> --- a/src/mesa/state_tracker/st_program.h
> +++ b/src/mesa/state_tracker/st_program.h
> @@ -143,20 +143,23 @@ struct st_fragment_program
> struct gl_program Base;
> struct pipe_shader_state tgsi;
> struct glsl_to_tgsi_visitor* glsl_to_tgsi;
> struct ati_fragment_shader *ati_fs;
> uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */
>
> /* used when bypassing glsl_to_tgsi: */
> struct gl_shader_program *shader_program;
>
> struct st_fp_variant *variants;
> +
> + /* Used by the shader cache and ARB_get_program_binary */
> + unsigned num_tgsi_tokens;
> };
>
>
>
> /** Vertex program variant key */
> struct st_vp_variant_key
> {
> struct st_context *st; /**< variants are per-context */
> boolean passthrough_edgeflags;
>
> @@ -215,20 +218,23 @@ struct st_vertex_program
>
> /** Maps VARYING_SLOT_x to slot */
> ubyte result_to_output[VARYING_SLOT_MAX];
>
> /** List of translated variants of this vertex program.
> */
> struct st_vp_variant *variants;
>
> /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
> unsigned char sha1[20];
> +
> + /* Used by the shader cache and ARB_get_program_binary */
> + unsigned num_tgsi_tokens;
> };
>
>
>
> /** Key shared by all shaders except VP, FP */
> struct st_basic_variant_key
> {
> struct st_context *st; /**< variants are per-context */
> };
>
> @@ -257,40 +263,46 @@ struct st_common_program
> struct glsl_to_tgsi_visitor* glsl_to_tgsi;
> uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */
>
> /* used when bypassing glsl_to_tgsi: */
> struct gl_shader_program *shader_program;
>
> struct st_basic_variant *variants;
>
> /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
> unsigned char sha1[20];
> +
> + /* Used by the shader cache and ARB_get_program_binary */
> + unsigned num_tgsi_tokens;
> };
>
>
> /**
> * Derived from Mesa gl_program:
> */
> struct st_compute_program
> {
> struct gl_program Base; /**< The Mesa compute program */
> struct pipe_compute_state tgsi;
> struct glsl_to_tgsi_visitor* glsl_to_tgsi;
> uint64_t affected_states; /**< ST_NEW_* flags to mark dirty when binding */
>
> /* used when bypassing glsl_to_tgsi: */
> struct gl_shader_program *shader_program;
>
> struct st_basic_variant *variants;
>
> /** SHA1 hash of linked tgsi shader program, used for on-disk cache */
> unsigned char sha1[20];
> +
> + /* Used by the shader cache and ARB_get_program_binary */
> + unsigned num_tgsi_tokens;
> };
>
>
> static inline struct st_fragment_program *
> st_fragment_program( struct gl_program *fp )
> {
> return (struct st_fragment_program *)fp;
> }
>
>
> diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
> index a5e33133b3c..a9413fb0534 100644
> --- a/src/mesa/state_tracker/st_shader_cache.c
> +++ b/src/mesa/state_tracker/st_shader_cache.c
> @@ -49,22 +49,21 @@ write_tgsi_to_cache(struct blob *blob, struct pipe_shader_state *tgsi,
> 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,
> - unsigned num_tokens)
> + struct pipe_shader_state *out_state)
> {
> 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;
> @@ -76,38 +75,42 @@ 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, num_tokens);
> + write_tgsi_to_cache(&blob, &stvp->tgsi, 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, num_tokens);
> + write_tgsi_to_cache(&blob, out_state, 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, num_tokens);
> + write_tgsi_to_cache(&blob, &stfp->tgsi, prog, stfp->num_tgsi_tokens);
> break;
> }
> case MESA_SHADER_COMPUTE: {
> - write_tgsi_to_cache(&blob, out_state, prog, num_tokens);
> + struct st_compute_program *stcp = (struct st_compute_program *) prog;
> +
> + write_tgsi_to_cache(&blob, out_state, 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 090d7d85cc8..7644d437521 100644
> --- a/src/mesa/state_tracker/st_shader_cache.h
> +++ b/src/mesa/state_tracker/st_shader_cache.h
> @@ -31,16 +31,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,
> - unsigned num_tokens);
> + struct pipe_shader_state *out_state);
>
> #ifdef __cplusplus
> }
> #endif
>
More information about the mesa-dev
mailing list