mesa: add an env var to force cache fallback
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 18 May 2017 05:00:40 +0000 (15:00 +1000)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 19 May 2017 22:35:51 +0000 (08:35 +1000)
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.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
docs/shading.html
src/mesa/main/mtypes.h
src/mesa/main/shaderapi.c
src/mesa/state_tracker/st_shader_cache.c

index 7e3d2e4fced0756509f861e4665fb6922c6039bb..c789102e64139b8d866c9dc5302e398e63f038ac 100644 (file)
@@ -50,6 +50,8 @@ execution.  These are generally used for debugging.
     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
index efc69202540772f69947ccd51d5332241221019c..d060f8f7d33de0a1011659b2571b045cee8e4708 100644 (file)
@@ -2977,6 +2977,7 @@ struct gl_shader_program
 #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 */
 
 
 /**
index 68fb3faf0c629feab86b7172d84141f8f8429fbf..325542e5230cc01eafe053919d2ee45742dadf90 100644 (file)
@@ -77,6 +77,8 @@ _mesa_get_shader_flags(void)
          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"))
index 175d69d732ea5e3ce5165eccb151e242e256caa1..45438e56bd220b0819902fb1dd8b6fffac7f5767 100644 (file)
@@ -225,8 +225,12 @@ st_load_tgsi_from_disk_cache(struct gl_context *ctx,
    if (prog->data->LinkStatus != linking_skipped)
       return false;
 
-   struct st_context *st = st_context(ctx);
    uint8_t *buffer = NULL;
+   if (ctx->_Shader->Flags & GLSL_CACHE_FALLBACK) {
+      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;