[Mesa-dev] [PATCH 08/40] glsl: Serialize three additional hash tables with program metadata
Nicolai Hähnle
nhaehnle at gmail.com
Fri Feb 10 10:49:31 UTC 2017
On 07.02.2017 04:42, Timothy Arceri wrote:
> From: Carl Worth <cworth at cworth.org>
>
> 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 at 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.
This patch should probably be moved earlier in the series.
Nicolai
> ---
> src/compiler/glsl/shader_cache.cpp | 74 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 74 insertions(+)
>
> diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
> index 91f8d99..ba05655 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 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)
> @@ -445,6 +515,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);
>
> @@ -563,6 +635,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);
>
>
More information about the mesa-dev
mailing list