Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Fri, Mar 3, 2017 at 6:59 AM, Timothy Arceri <tarc...@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@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev