[Mesa-dev] [PATCH 1/2] st/mesa: don't propagate uniforms when restoring from cache
Marek Olšák
maraeo at gmail.com
Mon Mar 6 19:18:51 UTC 2017
Reviewed-by: Marek Olšák <marek.olsak at amd.com>
Marek
On Fri, Mar 3, 2017 at 6:59 AM, Timothy Arceri <tarceri at itsqueeze.com> wrote:
> We will have already loaded the uniforms when the parameter list
> was restored from cache.
> ---
> src/mesa/program/ir_to_mesa.cpp | 14 +++++++++-----
> src/mesa/program/ir_to_mesa.h | 3 ++-
> src/mesa/state_tracker/st_glsl_to_nir.cpp | 3 ++-
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 3 ++-
> src/mesa/state_tracker/st_shader_cache.c | 3 ++-
> 5 files changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
> index a4f61ac..3898cb8 100644
> --- a/src/mesa/program/ir_to_mesa.cpp
> +++ b/src/mesa/program/ir_to_mesa.cpp
> @@ -2525,21 +2525,22 @@ _mesa_generate_parameters_list_for_uniforms(struct gl_shader_program
> || var->is_in_buffer_block() || (strncmp(var->name, "gl_", 3) == 0))
> continue;
>
> add.process(var);
> }
> }
>
> void
> _mesa_associate_uniform_storage(struct gl_context *ctx,
> struct gl_shader_program *shader_program,
> - struct gl_program_parameter_list *params)
> + struct gl_program_parameter_list *params,
> + bool propagate_to_storage)
> {
> /* After adding each uniform to the parameter list, connect the storage for
> * the parameter with the tracking structure used by the API for the
> * uniform.
> */
> unsigned last_location = unsigned(~0);
> for (unsigned i = 0; i < params->NumParameters; i++) {
> if (params->Parameters[i].Type != PROGRAM_UNIFORM)
> continue;
>
> @@ -2615,23 +2616,25 @@ _mesa_associate_uniform_storage(struct gl_context *ctx,
> _mesa_uniform_attach_driver_storage(storage,
> dmul * columns,
> dmul,
> format,
> ¶ms->ParameterValues[i]);
>
> /* After attaching the driver's storage to the uniform, propagate any
> * data from the linker's backing store. This will cause values from
> * initializers in the source code to be copied over.
> */
> - _mesa_propagate_uniforms_to_driver_storage(storage,
> - 0,
> - MAX2(1, storage->array_elements));
> + if (propagate_to_storage) {
> + unsigned array_elements = MAX2(1, storage->array_elements);
> + _mesa_propagate_uniforms_to_driver_storage(storage, 0,
> + array_elements);
> + }
>
> last_location = location;
> }
> }
> }
>
> /*
> * On a basic block basis, tracks available PROGRAM_TEMPORARY register
> * channels for copy propagation and updates following instructions to
> * use the original versions.
> @@ -2977,21 +2980,22 @@ get_mesa_program(struct gl_context *ctx,
> }
>
> if ((ctx->_Shader->Flags & GLSL_NO_OPT) == 0) {
> _mesa_optimize_program(ctx, prog, prog);
> }
>
> /* This has to be done last. Any operation that can cause
> * prog->ParameterValues to get reallocated (e.g., anything that adds a
> * program constant) has to happen before creating this linkage.
> */
> - _mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters);
> + _mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters,
> + true);
> if (!shader_program->data->LinkStatus) {
> goto fail_exit;
> }
>
> return prog;
>
> fail_exit:
> ralloc_free(mesa_instructions);
> _mesa_reference_program(ctx, &shader->Program, NULL);
> return NULL;
> diff --git a/src/mesa/program/ir_to_mesa.h b/src/mesa/program/ir_to_mesa.h
> index be45ba0..c46d090 100644
> --- a/src/mesa/program/ir_to_mesa.h
> +++ b/src/mesa/program/ir_to_mesa.h
> @@ -38,15 +38,16 @@ GLboolean _mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program
>
> void
> _mesa_generate_parameters_list_for_uniforms(struct gl_shader_program
> *shader_program,
> struct gl_linked_shader *sh,
> struct gl_program_parameter_list
> *params);
> void
> _mesa_associate_uniform_storage(struct gl_context *ctx,
> struct gl_shader_program *shader_program,
> - struct gl_program_parameter_list *params);
> + struct gl_program_parameter_list *params,
> + bool propagate_to_storage);
>
> #ifdef __cplusplus
> }
> #endif
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index 60d101c..674ccd0 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -419,21 +419,22 @@ st_nir_get_mesa_program(struct gl_context *ctx,
> /* Avoid reallocation of the program parameter list, because the uniform
> * storage is only associated with the original parameter list.
> * This should be enough for Bitmap and DrawPixels constants.
> */
> _mesa_reserve_parameter_storage(prog->Parameters, 8);
>
> /* This has to be done last. Any operation the can cause
> * prog->ParameterValues to get reallocated (e.g., anything that adds a
> * program constant) has to happen before creating this linkage.
> */
> - _mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters);
> + _mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters,
> + true);
>
> struct st_vertex_program *stvp;
> struct st_fragment_program *stfp;
>
> switch (shader->Stage) {
> case MESA_SHADER_VERTEX:
> stvp = (struct st_vertex_program *)prog;
> stvp->shader_program = shader_program;
> break;
> case MESA_SHADER_FRAGMENT:
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index af41bdb..0757d14 100644
> --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> @@ -6763,21 +6763,22 @@ get_mesa_program_tgsi(struct gl_context *ctx,
> /* Avoid reallocation of the program parameter list, because the uniform
> * storage is only associated with the original parameter list.
> * This should be enough for Bitmap and DrawPixels constants.
> */
> _mesa_reserve_parameter_storage(prog->Parameters, 8);
>
> /* This has to be done last. Any operation the can cause
> * prog->ParameterValues to get reallocated (e.g., anything that adds a
> * program constant) has to happen before creating this linkage.
> */
> - _mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters);
> + _mesa_associate_uniform_storage(ctx, shader_program, prog->Parameters,
> + true);
> if (!shader_program->data->LinkStatus) {
> free_glsl_to_tgsi_visitor(v);
> _mesa_reference_program(ctx, &shader->Program, NULL);
> return NULL;
> }
>
> struct st_vertex_program *stvp;
> struct st_fragment_program *stfp;
> struct st_geometry_program *stgp;
> struct st_tessctrl_program *sttcp;
> diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
> index fba4b0a..f22380c 100644
> --- a/src/mesa/state_tracker/st_shader_cache.c
> +++ b/src/mesa/state_tracker/st_shader_cache.c
> @@ -372,21 +372,22 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
> goto fallback_recompile;
> }
>
> if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
> _mesa_sha1_format(sha1_buf, sha1);
> fprintf(stderr, "%s tgsi_tokens retrieved from cache: %s\n",
> _mesa_shader_stage_to_string(i), sha1_buf);
> }
>
> st_set_prog_affected_state_flags(glprog);
> - _mesa_associate_uniform_storage(ctx, prog, glprog->Parameters);
> + _mesa_associate_uniform_storage(ctx, prog, glprog->Parameters,
> + false);
>
> free(buffer);
> } else {
> /* Failed to find a matching cached shader so fallback to recompile.
> */
> if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
> fprintf(stderr, "TGSI cache item not found falling back to "
> "compile.\n");
> }
>
> --
> 2.9.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