[Mesa-dev] [PATCH V2 3/3] st/mesa: don't mark the program as in cache_fallback when there is cache miss

Nicolai Hähnle nhaehnle at gmail.com
Fri May 19 09:37:07 UTC 2017


On 19.05.2017 03:02, Timothy Arceri wrote:
> When we fallback currently the gl_program objects are re-allocated.
>
> This is likely to change when the i965 cache lands, but for now
> this fixes a crash when using MESA_GLSL=cache_fb. This env var
> simulates the fallback path taken when a tgsi cache item doesn't
> exist due to being evicted previously or some kind of error.
>
> Unlike i965 we are always falling back at link time so it's safe to
> just re-allocate everything. We will be unnecessarily freeing and
> re-allocate a bunch of things here but it's probably not a huge deal,
> and can be changed when the i965 code lands.
>
> Fixes: 0e9991f957e2 ("glsl: don't reference shader prog data during cache fallback")
> ---
>  src/compiler/glsl/shader_cache.cpp       | 2 +-
>  src/mesa/main/mtypes.h                   | 2 ++
>  src/mesa/state_tracker/st_shader_cache.c | 2 +-
>  3 files changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
> index 800d3a2..dd56501 100644
> --- a/src/compiler/glsl/shader_cache.cpp
> +++ b/src/compiler/glsl/shader_cache.cpp
> @@ -1285,21 +1285,21 @@ bool
>  shader_cache_read_program_metadata(struct gl_context *ctx,
>                                     struct gl_shader_program *prog)
>  {
>     /* Fixed function programs generated by Mesa are not cached. So don't
>      * try to read metadata for them from the cache.
>      */
>     if (prog->Name == 0)
>        return false;
>
>     struct disk_cache *cache = ctx->Cache;
> -   if (!cache || prog->data->cache_fallback)
> +   if (!cache || prog->data->cache_fallback || prog->data->skip_cache)
>        return false;
>
>     /* Include bindings when creating sha1. These bindings change the resulting
>      * binary so they are just as important as the shader source.
>      */
>     char *buf = ralloc_strdup(NULL, "vb: ");
>     prog->AttributeBindings->iterate(create_binding_str, &buf);
>     ralloc_strcat(&buf, "fb: ");
>     prog->FragDataBindings->iterate(create_binding_str, &buf);
>     ralloc_strcat(&buf, "fbi: ");
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 941311b..9ca4bb8 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2807,20 +2807,22 @@ struct gl_shader_program_data
>
>     struct gl_active_atomic_buffer *AtomicBuffers;
>     unsigned NumAtomicBuffers;
>
>     /* Shader cache variables used during restore */
>     unsigned NumUniformDataSlots;
>     union gl_constant_value *UniformDataSlots;
>
>     bool cache_fallback;
>
> +   bool skip_cache;

Can you give a simple explanation of the semantics of cache_fallback and 
skip_cache? I have the impression that we're adding to an ever more 
complicated state machine that doesn't have a very clean definition :/

You mentioned in the commit message that there's a chance that this 
could become simpler when the i965 part lands, so I guess we can live 
with it for now...

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>


> +
>     /** List of all active resources after linking. */
>     struct gl_program_resource *ProgramResourceList;
>     unsigned NumProgramResourceList;
>
>     enum gl_link_status LinkStatus;   /**< GL_LINK_STATUS */
>     GLboolean Validated;
>     GLchar *InfoLog;
>
>     unsigned Version;       /**< GLSL version used for linking */
>
> diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
> index 45438e5..31c3430 100644
> --- a/src/mesa/state_tracker/st_shader_cache.c
> +++ b/src/mesa/state_tracker/st_shader_cache.c
> @@ -384,15 +384,15 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
>  fallback_recompile:
>     free(buffer);
>
>     if (ctx->_Shader->Flags & GLSL_CACHE_INFO)
>        fprintf(stderr, "TGSI cache falling back to recompile.\n");
>
>     for (unsigned i = 0; i < prog->NumShaders; i++) {
>        _mesa_glsl_compile_shader(ctx, prog->Shaders[i], false, false, true);
>     }
>
> -   prog->data->cache_fallback = true;
> +   prog->data->skip_cache = true;
>     _mesa_glsl_link_shader(ctx, prog);
>
>     return true;
>  }
>


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list