diff options
author | Carl Worth <cworth@cworth.org> | 2014-11-12 23:57:15 -0800 |
---|---|---|
committer | Carl Worth <cworth@cworth.org> | 2015-07-10 10:25:16 -0700 |
commit | 2697b04af51844685185174166fed0be4a606289 (patch) | |
tree | c4238d2f8c584f47ce6c52a9532405b91eaf9457 | |
parent | 44fb1d29d096aeff2b3e1a106976dc77d244c898 (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.cpp | 74 |
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); |