[Mesa-dev] [PATCH 2/3] mesa: add an env var to force cache fallback

Nicolai Hähnle nhaehnle at gmail.com
Thu May 18 08:15:02 UTC 2017


On 18.05.2017 07:22, Timothy Arceri wrote:
> For the gallium state tracker a tgsi binary may have been evicted
> from the cache to make space. In this case we would take the
> fallback path and recompile/link the shader.
>
> On i965 there are a number of reasons we can get to the program
> upload stage and have neither IR nor a valid cached binary.
> For example the binary may have been evicted from the cache or
> we need a variant that wasn't previously cached.
>
> This environment variable enables us to force the fallback path that
> would be taken in these cases and makes it easier to debug these
> otherwise hard to reproduce scenarios.
>
> Cc: Jordan Justen <jordan.l.justen at intel.com>
> ---
>  docs/shading.html                        |  2 ++
>  src/mesa/main/mtypes.h                   |  1 +
>  src/mesa/main/shaderapi.c                |  2 ++
>  src/mesa/state_tracker/st_shader_cache.c | 14 +++++++++++++-
>  4 files changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/docs/shading.html b/docs/shading.html
> index 7e3d2e4..c789102 100644
> --- a/docs/shading.html
> +++ b/docs/shading.html
> @@ -43,20 +43,22 @@ Contents
>  The <b>MESA_GLSL</b> environment variable can be set to a comma-separated
>  list of keywords to control some aspects of the GLSL compiler and shader
>  execution.  These are generally used for debugging.
>  </p>
>  <ul>
>  <li><b>dump</b> - print GLSL shader code to stdout at link time
>  <li><b>log</b> - log all GLSL shaders to files.
>      The filenames will be "shader_X.vert" or "shader_X.frag" where X
>      the shader ID.
>  <li><b>cache_info</b> - print debug information about shader cache
> +<li><b>cache_fb</b> - force cached shaders to be ignored and do a full
> +    recompile via the fallback path</li>
>  <li><b>uniform</b> - print message to stdout when glUniform is called
>  <li><b>nopvert</b> - force vertex shaders to be a simple shader that just transforms
>      the vertex position with ftransform() and passes through the color and
>      texcoord[0] attributes.
>  <li><b>nopfrag</b> - force fragment shader to be a simple shader that passes
>      through the color attribute.
>  <li><b>useprog</b> - log glUseProgram calls to stderr
>  </ul>
>  <p>
>  Example:  export MESA_GLSL=dump,nopt
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 28d3d948..941311b 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -2970,20 +2970,21 @@ struct gl_shader_program
>
>  #define GLSL_DUMP      0x1  /**< Dump shaders to stdout */
>  #define GLSL_LOG       0x2  /**< Write shaders to files */
>  #define GLSL_UNIFORMS  0x4  /**< Print glUniform calls */
>  #define GLSL_NOP_VERT  0x8  /**< Force no-op vertex shaders */
>  #define GLSL_NOP_FRAG 0x10  /**< Force no-op fragment shaders */
>  #define GLSL_USE_PROG 0x20  /**< Log glUseProgram calls */
>  #define GLSL_REPORT_ERRORS 0x40  /**< Print compilation errors */
>  #define GLSL_DUMP_ON_ERROR 0x80 /**< Dump shaders to stderr on compile error */
>  #define GLSL_CACHE_INFO 0x100 /**< Print debug information about shader cache */
> +#define GLSL_CACHE_FALLBACK 0x200 /**< Force shader cache fallback paths */
>
>
>  /**
>   * Context state for GLSL vertex/fragment shaders.
>   * Extended to support pipeline object
>   */
>  struct gl_pipeline_object
>  {
>     /** Name of the pipeline object as received from glGenProgramPipelines.
>      * It would be 0 for shaders without separate shader objects.
> diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
> index 68fb3fa..325542e 100644
> --- a/src/mesa/main/shaderapi.c
> +++ b/src/mesa/main/shaderapi.c
> @@ -70,20 +70,22 @@ _mesa_get_shader_flags(void)
>     GLbitfield flags = 0x0;
>     const char *env = getenv("MESA_GLSL");
>
>     if (env) {
>        if (strstr(env, "dump_on_error"))
>           flags |= GLSL_DUMP_ON_ERROR;
>        else if (strstr(env, "dump"))
>           flags |= GLSL_DUMP;
>        if (strstr(env, "log"))
>           flags |= GLSL_LOG;
> +      if (strstr(env, "cache_fb"))
> +         flags |= GLSL_CACHE_FALLBACK;
>        if (strstr(env, "cache_info"))
>           flags |= GLSL_CACHE_INFO;
>        if (strstr(env, "nopvert"))
>           flags |= GLSL_NOP_VERT;
>        if (strstr(env, "nopfrag"))
>           flags |= GLSL_NOP_FRAG;
>        if (strstr(env, "uniform"))
>           flags |= GLSL_UNIFORMS;
>        if (strstr(env, "useprog"))
>           flags |= GLSL_USE_PROG;
> diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
> index 175d69d..394adbe 100644
> --- a/src/mesa/state_tracker/st_shader_cache.c
> +++ b/src/mesa/state_tracker/st_shader_cache.c
> @@ -218,22 +218,30 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
>     }
>
>     /* Now that we have created the sha1 keys that will be used for writting to
>      * the tgsi cache fallback to the regular glsl to tgsi path if we didn't
>      * load the GLSL IR from cache. We do this as glsl to tgsi can alter things
>      * such as gl_program_parameter_list which holds things like uniforms.
>      */
>     if (prog->data->LinkStatus != linking_skipped)
>        return false;
>
> -   struct st_context *st = st_context(ctx);
>     uint8_t *buffer = NULL;
> +   bool cache_fb = false;
> +   if (ctx->_Shader->Flags & GLSL_CACHE_FALLBACK) {
> +      /* Temporarily turn off the flag to avoid getting stuck in a loop */
> +      ctx->_Shader->Flags ^= GLSL_CACHE_FALLBACK;

I think &= ~GLSL_CACHE_FALLBACK would be a bit more explicit.

With that, patches 1 & 2:

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


> +      cache_fb = true;
> +      goto fallback_recompile;
> +   }
> +
> +   struct st_context *st = st_context(ctx);
>     for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
>        if (prog->_LinkedShaders[i] == NULL)
>           continue;
>
>        unsigned char *sha1 = stage_sha1[i];
>        size_t size;
>        buffer = (uint8_t *) disk_cache_get(ctx->Cache, sha1, &size);
>        if (buffer) {
>           struct blob_reader blob_reader;
>           blob_reader_init(&blob_reader, buffer, size);
> @@ -383,12 +391,16 @@ fallback_recompile:
>     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;
>     _mesa_glsl_link_shader(ctx, prog);
>
> +   /* Turn the fallback flag back on if we disabled it previously */
> +   if (cache_fb)
> +      ctx->_Shader->Flags |= GLSL_CACHE_FALLBACK;
> +
>     return true;
>  }
>


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


More information about the mesa-dev mailing list