diff options
author | Carl Worth <[email protected]> | 2014-11-12 23:57:15 -0800 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2017-02-17 11:18:42 +1100 |
commit | a01973a78450573ab5bc66bbabd2bcd50a783a8e (patch) | |
tree | 4fb3871ab44a8659afc0fd15325c98584b929d2e /src/compiler/glsl/shader_cache.cpp | |
parent | e5bb4a0b0f4743fa0a0567991dca751ef49a7200 (diff) |
glsl: Serialize three additional hash tables with program metadata
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 <[email protected]>, 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.
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/compiler/glsl/shader_cache.cpp')
-rw-r--r-- | src/compiler/glsl/shader_cache.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp index 5064dc308d6..b0f8e025668 100644 --- a/src/compiler/glsl/shader_cache.cpp +++ b/src/compiler/glsl/shader_cache.cpp @@ -303,6 +303,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 entries 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) @@ -441,6 +511,8 @@ shader_cache_write_program_metadata(struct gl_context *ctx, write_uniforms(metadata, prog); + write_hash_tables(metadata, prog); + blob_write_uint32(metadata, prog->data->Version); blob_write_uint32(metadata, prog->data->linked_stages); @@ -551,6 +623,8 @@ shader_cache_read_program_metadata(struct gl_context *ctx, read_uniforms(&metadata, prog); + read_hash_tables(&metadata, prog); + prog->data->Version = blob_read_uint32(&metadata); prog->data->linked_stages = blob_read_uint32(&metadata); |