summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2016-04-12 15:10:24 +1000
committerTimothy Arceri <[email protected]>2017-02-17 11:18:42 +1100
commit6761259958dd9c8450c46322048d34409e424c45 (patch)
treef92f1fae5a3c08eafc64201609804265f4b59d45
parent787535fb11b08f41ac4f19683e112a04a84afe53 (diff)
glsl: store subroutine remap table in shader cache
V2: use new helpers to store/restore table entries. Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r--src/compiler/glsl/shader_cache.cpp48
1 files changed, 42 insertions, 6 deletions
diff --git a/src/compiler/glsl/shader_cache.cpp b/src/compiler/glsl/shader_cache.cpp
index a9bb7715ef9..b76b4cb33fc 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -446,8 +446,8 @@ write_uniform_remap_table_entry(struct blob *metadata,
}
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);
@@ -455,6 +455,20 @@ write_uniform_remap_table(struct blob *metadata,
write_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
prog->UniformRemapTable[i]);
}
+
+ 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++) {
+ write_uniform_remap_table_entry(metadata,
+ prog->data->UniformStorage,
+ glprog->sh.SubroutineUniformRemapTable[j]);
+ }
+ }
+ }
}
static void
@@ -474,8 +488,8 @@ read_uniform_remap_table_entry(struct blob_reader *metadata,
}
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);
@@ -489,6 +503,28 @@ read_uniform_remap_table(struct blob_reader *metadata,
read_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
&prog->UniformRemapTable[i], type);
}
+
+ 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++) {
+ enum uniform_remap_type type =
+ (enum uniform_remap_type) blob_read_uint32(metadata);
+
+ read_uniform_remap_table_entry(metadata,
+ prog->data->UniformStorage,
+ &glprog->sh.SubroutineUniformRemapTable[j],
+ type);
+ }
+ }
+ }
}
struct whte_closure
@@ -918,7 +954,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);
@@ -1027,7 +1063,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);