summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2014-11-12 23:57:15 -0800
committerCarl Worth <cworth@cworth.org>2015-07-10 10:25:16 -0700
commit2697b04af51844685185174166fed0be4a606289 (patch)
treec4238d2f8c584f47ce6c52a9532405b91eaf9457
parent44fb1d29d096aeff2b3e1a106976dc77d244c898 (diff)
shader-cache: Serialize three additional hash tables with program metadatashader-cache
The three additional tables are AttributeBindings, FragDataBindings, and FragDataIndexBindings. The first table (AttributeBindings) was identified as missing by trying to test the shader cache with a program that called glGetAttribLocation. Many thanks to Tapani Pälli <tapani.palli@intel.com>, as it was review of related work that he had done previously that pointed me to the necessity to also save and restore FragDataBindings and FragDataIndexBindings.
-rw-r--r--src/glsl/shader_cache.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/glsl/shader_cache.cpp b/src/glsl/shader_cache.cpp
index ff92b69b9b..dd3bf3e043 100644
--- a/src/glsl/shader_cache.cpp
+++ b/src/glsl/shader_cache.cpp
@@ -228,6 +228,76 @@ read_uniform_remap_table(struct blob_reader *metadata,
}
}
+struct whte_closure
+{
+ struct blob *blob;
+ size_t num_entries;
+};
+
+static void
+write_hash_table_entry(const char *key, unsigned value, void *closure)
+{
+ struct whte_closure *whte = (struct whte_closure *) closure;
+
+ blob_write_string(whte->blob, key);
+ blob_write_uint32(whte->blob, value);
+
+ whte->num_entries++;
+}
+
+static void
+write_hash_table(struct blob *metadata, struct string_to_uint_map *hash)
+{
+ size_t offset;
+ struct whte_closure whte;
+
+ whte.blob = metadata;
+ whte.num_entries = 0;
+
+ offset = metadata->size;
+
+ /* Write a placeholder for the hashtable size. */
+ blob_write_uint32 (metadata, 0);
+
+ hash->iterate(write_hash_table_entry, &whte);
+
+ /* Overwrite with the computed number of entires written. */
+ blob_overwrite_uint32 (metadata, offset, whte.num_entries);
+}
+
+static void
+read_hash_table(struct blob_reader *metadata, struct string_to_uint_map *hash)
+{
+ size_t i, num_entries;
+ const char *key;
+ uint32_t value;
+
+ num_entries = blob_read_uint32 (metadata);
+
+ for (i = 0; i < num_entries; i++) {
+ key = blob_read_string(metadata);
+ value = blob_read_uint32(metadata);
+
+ hash->put(value, key);
+ }
+}
+
+static void
+write_hash_tables(struct blob *metadata, struct gl_shader_program *prog)
+{
+ write_hash_table(metadata, prog->AttributeBindings);
+ write_hash_table(metadata, prog->FragDataBindings);
+ write_hash_table(metadata, prog->FragDataIndexBindings);
+}
+
+static void
+read_hash_tables(struct blob_reader *metadata, struct gl_shader_program *prog)
+{
+ read_hash_table(metadata, prog->AttributeBindings);
+ read_hash_table(metadata, prog->FragDataBindings);
+ read_hash_table(metadata, prog->FragDataIndexBindings);
+}
+
static void
write_shader_parameters(struct blob *metadata,
struct gl_program_parameter_list *params)
@@ -351,6 +421,8 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
write_uniforms(metadata, prog);
+ write_hash_tables(metadata, prog);
+
write_uniform_remap_table(metadata, prog);
write_shader_metadata(metadata, prog->_LinkedShaders[MESA_SHADER_VERTEX]);
@@ -415,6 +487,8 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
read_uniforms(&metadata, prog);
+ read_hash_tables(&metadata, prog);
+
read_uniform_remap_table(&metadata, prog);
linked = ctx->Driver.NewShader(NULL, 0, GL_VERTEX_SHADER);