st/mesa/glsl: build string of dri options and use as input to building sha for shaders
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -1318,7 +1318,13 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
|
|||||||
ctx->API, ctx->Const.GLSLVersion,
|
ctx->API, ctx->Const.GLSLVersion,
|
||||||
ctx->Const.ForceGLSLVersion);
|
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];
|
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++) {
|
for (unsigned i = 0; i < prog->NumShaders; i++) {
|
||||||
struct gl_shader *sh = prog->Shaders[i];
|
struct gl_shader *sh = prog->Shaders[i];
|
||||||
ralloc_asprintf_append(&buf, "%s: %s\n",
|
ralloc_asprintf_append(&buf, "%s: %s\n",
|
||||||
|
@@ -247,6 +247,7 @@ struct st_config_options
|
|||||||
boolean allow_glsl_extension_directive_midshader;
|
boolean allow_glsl_extension_directive_midshader;
|
||||||
boolean allow_higher_compat_version;
|
boolean allow_higher_compat_version;
|
||||||
boolean glsl_zero_init;
|
boolean glsl_zero_init;
|
||||||
|
unsigned char config_options_sha1[20];
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -103,6 +103,8 @@ dri_fill_st_options(struct st_config_options *options,
|
|||||||
options->allow_higher_compat_version =
|
options->allow_higher_compat_version =
|
||||||
driQueryOptionb(optionCache, "allow_higher_compat_version");
|
driQueryOptionb(optionCache, "allow_higher_compat_version");
|
||||||
options->glsl_zero_init = driQueryOptionb(optionCache, "glsl_zero_init");
|
options->glsl_zero_init = driQueryOptionb(optionCache, "glsl_zero_init");
|
||||||
|
|
||||||
|
driComputeOptionsSha1(optionCache, options->config_options_sha1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const __DRIconfig **
|
static const __DRIconfig **
|
||||||
|
@@ -30,6 +30,9 @@
|
|||||||
#ifndef __XMLCONFIG_H
|
#ifndef __XMLCONFIG_H
|
||||||
#define __XMLCONFIG_H
|
#define __XMLCONFIG_H
|
||||||
|
|
||||||
|
#include "util/mesa-sha1.h"
|
||||||
|
#include "util/ralloc.h"
|
||||||
|
|
||||||
#define STRING_CONF_MAXLEN 25
|
#define STRING_CONF_MAXLEN 25
|
||||||
|
|
||||||
/** \brief Option data types */
|
/** \brief Option data types */
|
||||||
@@ -124,4 +127,53 @@ float driQueryOptionf (const driOptionCache *cache, const char *name);
|
|||||||
/** \brief Query a string option value */
|
/** \brief Query a string option value */
|
||||||
char *driQueryOptionstr (const driOptionCache *cache, const char *name);
|
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
|
#endif
|
||||||
|
@@ -3773,6 +3773,9 @@ struct gl_constants
|
|||||||
|
|
||||||
/** GL_OES_primitive_bounding_box */
|
/** GL_OES_primitive_bounding_box */
|
||||||
bool NoPrimitiveBoundingBoxOutput;
|
bool NoPrimitiveBoundingBoxOutput;
|
||||||
|
|
||||||
|
/** Used as an input for sha1 generation in the on-disk shader cache */
|
||||||
|
unsigned char *dri_config_options_sha1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -881,6 +881,8 @@ void st_init_extensions(struct pipe_screen *screen,
|
|||||||
|
|
||||||
consts->AllowHigherCompatVersion = options->allow_higher_compat_version;
|
consts->AllowHigherCompatVersion = options->allow_higher_compat_version;
|
||||||
|
|
||||||
|
consts->dri_config_options_sha1 = options->config_options_sha1;
|
||||||
|
|
||||||
if (consts->GLSLVersion >= 400)
|
if (consts->GLSLVersion >= 400)
|
||||||
extensions->ARB_gpu_shader5 = GL_TRUE;
|
extensions->ARB_gpu_shader5 = GL_TRUE;
|
||||||
if (consts->GLSLVersion >= 410)
|
if (consts->GLSLVersion >= 410)
|
||||||
|
Reference in New Issue
Block a user