st/mesa/glsl: build string of dri options and use as input to building sha for shaders
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 16 Feb 2017 23:16:16 +0000 (10:16 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 17 Feb 2017 00:18:43 +0000 (11:18 +1100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/compiler/glsl/shader_cache.cpp
src/gallium/include/state_tracker/st_api.h
src/gallium/state_trackers/dri/dri_screen.c
src/mesa/drivers/dri/common/xmlconfig.h
src/mesa/main/mtypes.h
src/mesa/state_tracker/st_extensions.c

index d95f136074e36b96cf0f26874f952129e3603918..6e56d86f2ffb98c2f42299920119b22cb39ce87d 100644 (file)
@@ -1318,7 +1318,13 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
                           ctx->API, ctx->Const.GLSLVersion,
                           ctx->Const.ForceGLSLVersion);
 
+   /* DRI config options may also change the output from the compiler so
+    * include them as an input to sha1 creation.
+    */
    char sha1buf[41];
+   _mesa_sha1_format(sha1buf, ctx->Const.dri_config_options_sha1);
+   ralloc_strcat(&buf, sha1buf);
+
    for (unsigned i = 0; i < prog->NumShaders; i++) {
       struct gl_shader *sh = prog->Shaders[i];
       ralloc_asprintf_append(&buf, "%s: %s\n",
index 1b9ef290b1fd8af1d914e9bf13d24940edc2060a..daa1f23812e35f1f80223ad5f1e4e53115bf7ded 100644 (file)
@@ -247,6 +247,7 @@ struct st_config_options
    boolean allow_glsl_extension_directive_midshader;
    boolean allow_higher_compat_version;
    boolean glsl_zero_init;
+   unsigned char config_options_sha1[20];
 };
 
 /**
index 1e278c3d1c2ab49c1d8463652f9c00ccc261f613..c2da7e30b24bb4cef020c25ac9faa885e2fd42f0 100644 (file)
@@ -103,6 +103,8 @@ dri_fill_st_options(struct st_config_options *options,
    options->allow_higher_compat_version =
       driQueryOptionb(optionCache, "allow_higher_compat_version");
    options->glsl_zero_init = driQueryOptionb(optionCache, "glsl_zero_init");
+
+   driComputeOptionsSha1(optionCache, options->config_options_sha1);
 }
 
 static const __DRIconfig **
index 8969843bdc929182c64c06c3ac8e3ea5683a979f..77aa14c20e0ffb79ebc71157796a7b416e4fe279 100644 (file)
@@ -30,6 +30,9 @@
 #ifndef __XMLCONFIG_H
 #define __XMLCONFIG_H
 
+#include "util/mesa-sha1.h"
+#include "util/ralloc.h"
+
 #define STRING_CONF_MAXLEN 25
 
 /** \brief Option data types */
@@ -124,4 +127,53 @@ float driQueryOptionf (const driOptionCache *cache, const char *name);
 /** \brief Query a string option value */
 char *driQueryOptionstr (const driOptionCache *cache, const char *name);
 
+/**
+ * Returns a hash of the options for this application.
+ */
+static inline void
+driComputeOptionsSha1(const driOptionCache *cache, unsigned char *sha1)
+{
+   void *ctx = ralloc_context(NULL);
+   char *dri_options = ralloc_strdup(ctx, "");
+
+   for (int i = 0; i < 1 << cache->tableSize; i++) {
+      if (cache->info[i].name == NULL)
+         continue;
+
+      bool ret = false;
+      switch (cache->info[i].type) {
+      case DRI_BOOL:
+         ret = ralloc_asprintf_append(&dri_options, "%s:%u,",
+                                      cache->info[i].name,
+                                      cache->values[i]._bool);
+         break;
+      case DRI_INT:
+      case DRI_ENUM:
+         ret = ralloc_asprintf_append(&dri_options, "%s:%d,",
+                                      cache->info[i].name,
+                                      cache->values[i]._int);
+         break;
+      case DRI_FLOAT:
+         ret = ralloc_asprintf_append(&dri_options, "%s:%f,",
+                                      cache->info[i].name,
+                                      cache->values[i]._float);
+         break;
+      case DRI_STRING:
+         ret = ralloc_asprintf_append(&dri_options, "%s:%s,",
+                                      cache->info[i].name,
+                                      cache->values[i]._string);
+         break;
+      default:
+         unreachable("unsupported dri config type!");
+      }
+
+      if (!ret) {
+         break;
+      }
+   }
+
+   _mesa_sha1_compute(dri_options, strlen(dri_options), sha1);
+   ralloc_free(ctx);
+}
+
 #endif
index 12d68ab360d87705c3bb615a0c4640c522e8ad20..118d7bc64ff137b8ef47befe356deab9cfb0eb0a 100644 (file)
@@ -3773,6 +3773,9 @@ struct gl_constants
 
    /** GL_OES_primitive_bounding_box */
    bool NoPrimitiveBoundingBoxOutput;
+
+   /** Used as an input for sha1 generation in the on-disk shader cache */
+   unsigned char *dri_config_options_sha1;
 };
 
 
index 37fe4469c37b7802e5dd2a2e8988257ed6f12019..0dc2580a88cd0b7b1fc467441ad384eb7595e6ec 100644 (file)
@@ -881,6 +881,8 @@ void st_init_extensions(struct pipe_screen *screen,
 
    consts->AllowHigherCompatVersion = options->allow_higher_compat_version;
 
+   consts->dri_config_options_sha1 = options->config_options_sha1;
+
    if (consts->GLSLVersion >= 400)
       extensions->ARB_gpu_shader5 = GL_TRUE;
    if (consts->GLSLVersion >= 410)