add_builtin_defines, state, ctx);
if (!force_recompile) {
- char buf[41];
- _mesa_sha1_compute(source, strlen(source), shader->sha1);
- if (ctx->Cache && disk_cache_has_key(ctx->Cache, shader->sha1)) {
- /* We've seen this shader before and know it compiles */
- if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
- _mesa_sha1_format(buf, shader->sha1);
- fprintf(stderr, "deferring compile of shader: %s\n", buf);
- }
- shader->CompileStatus = compile_skipped;
+ if (ctx->Cache) {
+ char buf[41];
+ disk_cache_compute_key(ctx->Cache, source, strlen(source),
+ shader->sha1);
+ if (disk_cache_has_key(ctx->Cache, shader->sha1)) {
+ /* We've seen this shader before and know it compiles */
+ if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
+ _mesa_sha1_format(buf, shader->sha1);
+ fprintf(stderr, "deferring compile of shader: %s\n", buf);
+ }
+ shader->CompileStatus = compile_skipped;
- free((void *)shader->FallbackSource);
- shader->FallbackSource = NULL;
- return;
+ free((void *)shader->FallbackSource);
+ shader->FallbackSource = NULL;
+ return;
+ }
}
} else {
/* We should only ever end up here if a re-compile has been forced by a
ralloc_asprintf_append(&buf, "%s: %s\n",
_mesa_shader_stage_to_abbrev(sh->Stage), sha1buf);
}
- _mesa_sha1_compute(buf, strlen(buf), prog->data->sha1);
+ disk_cache_compute_key(cache, buf, strlen(buf), prog->data->sha1);
ralloc_free(buf);
size_t size;
cache = disk_cache_create("test", "make_check");
- _mesa_sha1_compute(blob, sizeof(blob), blob_key);
+ disk_cache_compute_key(cache, blob, sizeof(blob), blob_key);
/* Ensure that disk_cache_get returns nothing before anything is added. */
result = disk_cache_get(cache, blob_key, &size);
free(result);
/* Test put and get of a second item. */
- _mesa_sha1_compute(string, sizeof(string), string_key);
+ disk_cache_compute_key(cache, string, sizeof(string), string_key);
disk_cache_put(cache, string_key, string, sizeof(string));
/* disk_cache_put() hands things off to a thread give it some time to
* For this test, we force this signature to land in the same
* directory as the original blob first written to the cache.
*/
- _mesa_sha1_compute(one_KB, 1024, one_KB_key);
+ disk_cache_compute_key(cache, one_KB, 1024, one_KB_key);
one_KB_key[0] = blob_key_byte_zero;
disk_cache_put(cache, one_KB_key, one_KB, 1024);
/* Finally, check eviction again after adding an object of size 1M. */
one_MB = calloc(1024, 1024);
- _mesa_sha1_compute(one_MB, 1024 * 1024, one_MB_key);
+ disk_cache_compute_key(cache, one_MB, 1024 * 1024, one_MB_key);
one_MB_key[0] = blob_key_byte_zero;;
disk_cache_put(cache, one_MB_key, one_MB, 1024 * 1024);
}
if (sscreen->b.disk_shader_cache && insert_into_disk_cache) {
- _mesa_sha1_compute(tgsi_binary, *((uint32_t *)tgsi_binary), key);
+ disk_cache_compute_key(sscreen->b.disk_shader_cache, tgsi_binary,
+ *((uint32_t *)tgsi_binary), key);
disk_cache_put(sscreen->b.disk_shader_cache, key, hw_binary,
*((uint32_t *) hw_binary));
}
unsigned char sha1[CACHE_KEY_SIZE];
size_t tg_size = *((uint32_t *) tgsi_binary);
- _mesa_sha1_compute(tgsi_binary, tg_size, sha1);
+ disk_cache_compute_key(sscreen->b.disk_shader_cache,
+ tgsi_binary, tg_size, sha1);
size_t binary_size;
uint8_t *buffer =
struct st_vertex_program *stvp = (struct st_vertex_program *) glprog;
stage_sha1[i] = stvp->sha1;
ralloc_strcat(&buf, " vs");
- _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+ disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
break;
}
case MESA_SHADER_TESS_CTRL: {
(struct st_tessctrl_program *) glprog;
stage_sha1[i] = stcp->sha1;
ralloc_strcat(&buf, " tcs");
- _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+ disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
break;
}
case MESA_SHADER_TESS_EVAL: {
(struct st_tesseval_program *) glprog;
stage_sha1[i] = step->sha1;
ralloc_strcat(&buf, " tes");
- _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+ disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
break;
}
case MESA_SHADER_GEOMETRY: {
(struct st_geometry_program *) glprog;
stage_sha1[i] = stgp->sha1;
ralloc_strcat(&buf, " gs");
- _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+ disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
break;
}
case MESA_SHADER_FRAGMENT: {
(struct st_fragment_program *) glprog;
stage_sha1[i] = stfp->sha1;
ralloc_strcat(&buf, " fs");
- _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+ disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
break;
}
case MESA_SHADER_COMPUTE: {
(struct st_compute_program *) glprog;
stage_sha1[i] = stcp->sha1;
ralloc_strcat(&buf, " cs");
- _mesa_sha1_compute(buf, strlen(buf), stage_sha1[i]);
+ disk_cache_compute_key(ctx->Cache, buf, strlen(buf), stage_sha1[i]);
break;
}
default:
return memcmp(entry, key, CACHE_KEY_SIZE) == 0;
}
+void
+disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
+ cache_key key)
+{
+ _mesa_sha1_compute(data, size, key);
+}
+
#endif /* ENABLE_SHADER_CACHE */
bool
disk_cache_has_key(struct disk_cache *cache, const cache_key key);
+/**
+ * Compute the name \key from \data of given \size.
+ */
+void
+disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
+ cache_key key);
+
#else
static inline struct disk_cache *
return false;
}
+void
+disk_cache_compute_key(struct disk_cache *cache, const void *data, size_t size,
+ const cache_key key)
+{
+ return;
+}
+
#endif /* ENABLE_SHADER_CACHE */
#ifdef __cplusplus