glsl/serialize: restructure remap table code

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
This commit is contained in:
Marek Olšák
2019-10-24 22:54:24 -04:00
parent f306d07932
commit e90269d90a
+55 -62
View File
@@ -572,19 +572,26 @@ enum uniform_remap_type
};
static void
write_uniform_remap_table_entry(struct blob *metadata,
gl_uniform_storage *uniform_storage,
gl_uniform_storage *entry)
write_uniform_remap_table(struct blob *metadata,
unsigned num_entries,
gl_uniform_storage *uniform_storage,
gl_uniform_storage **remap_table)
{
if (entry == INACTIVE_UNIFORM_EXPLICIT_LOCATION) {
blob_write_uint32(metadata, remap_type_inactive_explicit_location);
} else if (entry == NULL) {
blob_write_uint32(metadata, remap_type_null_ptr);
} else {
blob_write_uint32(metadata, remap_type_uniform_offset);
blob_write_uint32(metadata, num_entries);
uint32_t offset = entry - uniform_storage;
blob_write_uint32(metadata, offset);
for (unsigned i = 0; i < num_entries; i++) {
gl_uniform_storage *entry = remap_table[i];
if (entry == INACTIVE_UNIFORM_EXPLICIT_LOCATION) {
blob_write_uint32(metadata, remap_type_inactive_explicit_location);
} else if (entry == NULL) {
blob_write_uint32(metadata, remap_type_null_ptr);
} else {
blob_write_uint32(metadata, remap_type_uniform_offset);
uint32_t offset = entry - uniform_storage;
blob_write_uint32(metadata, offset);
}
}
}
@@ -592,80 +599,66 @@ static void
write_uniform_remap_tables(struct blob *metadata,
struct gl_shader_program *prog)
{
blob_write_uint32(metadata, prog->NumUniformRemapTable);
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
write_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
prog->UniformRemapTable[i]);
}
write_uniform_remap_table(metadata, prog->NumUniformRemapTable,
prog->data->UniformStorage,
prog->UniformRemapTable);
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]);
}
write_uniform_remap_table(metadata,
sh->Program->sh.NumSubroutineUniformRemapTable,
prog->data->UniformStorage,
sh->Program->sh.SubroutineUniformRemapTable);
}
}
}
static void
read_uniform_remap_table_entry(struct blob_reader *metadata,
gl_uniform_storage *uniform_storage,
gl_uniform_storage **entry,
enum uniform_remap_type type)
static struct gl_uniform_storage **
read_uniform_remap_table(struct blob_reader *metadata,
struct gl_shader_program *prog,
unsigned *num_entries,
gl_uniform_storage *uniform_storage)
{
if (type == remap_type_inactive_explicit_location) {
*entry = INACTIVE_UNIFORM_EXPLICIT_LOCATION;
} else if (type == remap_type_null_ptr) {
*entry = NULL;
} else {
uint32_t uni_offset = blob_read_uint32(metadata);
*entry = uniform_storage + uni_offset;
unsigned num = blob_read_uint32(metadata);
*num_entries = num;
struct gl_uniform_storage **remap_table =
rzalloc_array(prog, struct gl_uniform_storage *, num);
for (unsigned i = 0; i < num; i++) {
enum uniform_remap_type type =
(enum uniform_remap_type) blob_read_uint32(metadata);
if (type == remap_type_inactive_explicit_location) {
remap_table[i] = INACTIVE_UNIFORM_EXPLICIT_LOCATION;
} else if (type == remap_type_null_ptr) {
remap_table[i] = NULL;
} else {
uint32_t uni_offset = blob_read_uint32(metadata);
remap_table[i] = uniform_storage + uni_offset;
}
}
return remap_table;
}
static void
read_uniform_remap_tables(struct blob_reader *metadata,
struct gl_shader_program *prog)
{
prog->NumUniformRemapTable = blob_read_uint32(metadata);
prog->UniformRemapTable = rzalloc_array(prog, struct gl_uniform_storage *,
prog->NumUniformRemapTable);
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
enum uniform_remap_type type =
(enum uniform_remap_type) blob_read_uint32(metadata);
read_uniform_remap_table_entry(metadata, prog->data->UniformStorage,
&prog->UniformRemapTable[i], type);
}
prog->UniformRemapTable =
read_uniform_remap_table(metadata, prog, &prog->NumUniformRemapTable,
prog->data->UniformStorage);
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);
}
read_uniform_remap_table(metadata, prog,
&glprog->sh.NumSubroutineUniformRemapTable,
prog->data->UniformStorage);
}
}
}