From: Timothy Arceri Date: Thu, 16 Feb 2017 23:16:16 +0000 (+1100) Subject: st/mesa/glsl: build string of dri options and use as input to building sha for shaders X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6602d0401c23211af122f4ef5a86acf5dd9665e7;p=mesa.git st/mesa/glsl: build string of dri options and use as input to building sha for shaders Reviewed-by: Nicolai Hähnle --- diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp index d95f136074e..6e56d86f2ff 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -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", diff --git a/src/gallium/include/state_tracker/st_api.h b/src/gallium/include/state_tracker/st_api.h index 1b9ef290b1f..daa1f23812e 100644 --- a/src/gallium/include/state_tracker/st_api.h +++ b/src/gallium/include/state_tracker/st_api.h @@ -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]; }; /** diff --git a/src/gallium/state_trackers/dri/dri_screen.c b/src/gallium/state_trackers/dri/dri_screen.c index 1e278c3d1c2..c2da7e30b24 100644 --- a/src/gallium/state_trackers/dri/dri_screen.c +++ b/src/gallium/state_trackers/dri/dri_screen.c @@ -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 ** diff --git a/src/mesa/drivers/dri/common/xmlconfig.h b/src/mesa/drivers/dri/common/xmlconfig.h index 8969843bdc9..77aa14c20e0 100644 --- a/src/mesa/drivers/dri/common/xmlconfig.h +++ b/src/mesa/drivers/dri/common/xmlconfig.h @@ -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 diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 12d68ab360d..118d7bc64ff 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -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; }; diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 37fe4469c37..0dc2580a88c 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -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)