diff options
author | Timothy Arceri <[email protected]> | 2017-02-17 10:16:16 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2017-02-17 11:18:43 +1100 |
commit | 6602d0401c23211af122f4ef5a86acf5dd9665e7 (patch) | |
tree | cc98dc21d0d7438c2be32cdb49667bee81fbe81a | |
parent | ed6153012167fc7176a23f23ee4cccce9cbaee4a (diff) |
st/mesa/glsl: build string of dri options and use as input to building sha for shaders
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/compiler/glsl/shader_cache.cpp | 6 | ||||
-rw-r--r-- | src/gallium/include/state_tracker/st_api.h | 1 | ||||
-rw-r--r-- | src/gallium/state_trackers/dri/dri_screen.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/common/xmlconfig.h | 52 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 3 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 2 |
6 files changed, 66 insertions, 0 deletions
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) |