[Mesa-dev] [PATCH 14/40] glsl: store subroutine remap table in shader cache
Nicolai Hähnle
nhaehnle at gmail.com
Fri Feb 10 11:48:03 UTC 2017
On 07.02.2017 04:42, Timothy Arceri wrote:
> From: Timothy Arceri <timothy.arceri at collabora.com>
>
> ---
> src/compiler/glsl/shader_cache.cpp | 57 ++++++++++++++++++++++++++++++++++----
> 1 file changed, 51 insertions(+), 6 deletions(-)
>
> diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
> index 7d651bc..deabc2a 100644
> --- a/src/compiler/glsl/shader_cache.cpp
> +++ b/src/compiler/glsl/shader_cache.cpp
> @@ -423,8 +423,8 @@ read_uniforms(struct blob_reader *metadata, struct gl_shader_program *prog)
>
>
> static void
> -write_uniform_remap_table(struct blob *metadata,
> - struct gl_shader_program *prog)
> +write_uniform_remap_tables(struct blob *metadata,
> + struct gl_shader_program *prog)
> {
> blob_write_uint32(metadata, prog->NumUniformRemapTable);
>
> @@ -444,11 +444,31 @@ write_uniform_remap_table(struct blob *metadata,
> blob_write_uint32(metadata, offset);
> }
> }
> +
> + for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
> + struct gl_linked_shader *sh = prog->_LinkedShaders[i];
> + if (sh) {
> + struct gl_program *glprog = sh->Program;
> + blob_write_uint32(metadata, glprog->sh.NumSubroutineUniformRemapTable);
> +
> + for (unsigned j = 0; j < glprog->sh.NumSubroutineUniformRemapTable; j++) {
> + struct gl_uniform_storage *sr =
> + glprog->sh.SubroutineUniformRemapTable[j];
> +
> + blob_write_uint64(metadata, ptr_to_uint64_t(sr));
> +
> + if (sr != INACTIVE_UNIFORM_EXPLICIT_LOCATION && sr != NULL) {
> + uint32_t offset = sr - prog->data->UniformStorage;
> + blob_write_uint32(metadata, offset);
> + }
Perhaps this dance with the "pointers" could be refactored out into a
general uniform storage helper? It also appears in patch #9.
Nicolai
> + }
> + }
> + }
> }
>
> static void
> -read_uniform_remap_table(struct blob_reader *metadata,
> - struct gl_shader_program *prog)
> +read_uniform_remap_tables(struct blob_reader *metadata,
> + struct gl_shader_program *prog)
> {
> prog->NumUniformRemapTable = blob_read_uint32(metadata);
>
> @@ -465,6 +485,31 @@ read_uniform_remap_table(struct blob_reader *metadata,
> prog->UniformRemapTable[i] = prog->data->UniformStorage + uni_offset;
> }
> }
> +
> + for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
> + struct gl_linked_shader *sh = prog->_LinkedShaders[i];
> + if (sh) {
> + struct gl_program *glprog = sh->Program;
> + glprog->sh.NumSubroutineUniformRemapTable = blob_read_uint32(metadata);
> +
> + glprog->sh.SubroutineUniformRemapTable =
> + rzalloc_array(glprog, struct gl_uniform_storage *,
> + glprog->sh.NumSubroutineUniformRemapTable);
> +
> + for (unsigned j = 0; j < glprog->sh.NumSubroutineUniformRemapTable; j++) {
> + uint64_t uni_ptr = blob_read_uint64(metadata);
> + if (uni_ptr == (uint64_t) INACTIVE_UNIFORM_EXPLICIT_LOCATION ||
> + uni_ptr == (uint64_t) NULL) {
> + glprog->sh.SubroutineUniformRemapTable[j] =
> + (gl_uniform_storage *) uni_ptr;
> + } else {
> + uint32_t uni_offset = blob_read_uint32(metadata);
> + glprog->sh.SubroutineUniformRemapTable[j] =
> + prog->data->UniformStorage + uni_offset;
> + }
> + }
> + }
> + }
> }
>
> struct whte_closure
> @@ -898,7 +943,7 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
>
> write_xfb(metadata, prog);
>
> - write_uniform_remap_table(metadata, prog);
> + write_uniform_remap_tables(metadata, prog);
>
> write_subroutines(metadata, prog);
>
> @@ -1015,7 +1060,7 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
>
> read_xfb(&metadata, prog);
>
> - read_uniform_remap_table(&metadata, prog);
> + read_uniform_remap_tables(&metadata, prog);
>
> read_subroutines(&metadata, prog);
>
>
More information about the mesa-dev
mailing list