X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fglsl%2Fserialize.cpp;h=2f68d1b97853ed20ca3f9f52a9e85032cdfec686;hb=a3a8322dcd7aaede8dedff131c7d73bdbe3f06f9;hp=552300f7eaf75664eb01dca53c91e927e38c4a91;hpb=761b0fe95f00a9a5adfd0369326eeffb23af449a;p=mesa.git diff --git a/src/compiler/glsl/serialize.cpp b/src/compiler/glsl/serialize.cpp index 552300f7eaf..2f68d1b9785 100644 --- a/src/compiler/glsl/serialize.cpp +++ b/src/compiler/glsl/serialize.cpp @@ -139,10 +139,10 @@ write_buffer_blocks(struct blob *metadata, struct gl_shader_program *prog) struct gl_program *glprog = sh->Program; - blob_write_uint32(metadata, glprog->info.num_ubos); + blob_write_uint32(metadata, glprog->sh.NumUniformBlocks); blob_write_uint32(metadata, glprog->info.num_ssbos); - for (unsigned j = 0; j < glprog->info.num_ubos; j++) { + for (unsigned j = 0; j < glprog->sh.NumUniformBlocks; j++) { uint32_t offset = glprog->sh.UniformBlocks[j] - prog->data->UniformBlocks; blob_write_uint32(metadata, offset); @@ -215,15 +215,15 @@ read_buffer_blocks(struct blob_reader *metadata, struct gl_program *glprog = sh->Program; - glprog->info.num_ubos = blob_read_uint32(metadata); + glprog->sh.NumUniformBlocks = blob_read_uint32(metadata); glprog->info.num_ssbos = blob_read_uint32(metadata); glprog->sh.UniformBlocks = - rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ubos); + rzalloc_array(glprog, gl_uniform_block *, glprog->sh.NumUniformBlocks); glprog->sh.ShaderStorageBlocks = rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ssbos); - for (unsigned j = 0; j < glprog->info.num_ubos; j++) { + for (unsigned j = 0; j < glprog->sh.NumUniformBlocks; j++) { uint32_t offset = blob_read_uint32(metadata); glprog->sh.UniformBlocks[j] = prog->data->UniformBlocks + offset; } @@ -568,23 +568,48 @@ enum uniform_remap_type { remap_type_inactive_explicit_location, remap_type_null_ptr, - remap_type_uniform_offset + remap_type_uniform_offset, + remap_type_uniform_offsets_equal, }; 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); + for (unsigned i = 0; i < num_entries; i++) { + gl_uniform_storage *entry = remap_table[i]; uint32_t offset = entry - uniform_storage; - blob_write_uint32(metadata, offset); + + 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 if (i+1 < num_entries && entry == remap_table[i+1]) { + blob_write_uint32(metadata, remap_type_uniform_offsets_equal); + + /* If many offsets are equal, write only one offset and the number + * of consecutive entries being equal. + */ + unsigned count = 1; + for (unsigned j = i + 1; j < num_entries; j++) { + if (entry != remap_table[j]) + break; + + count++; + } + + blob_write_uint32(metadata, offset); + blob_write_uint32(metadata, count); + i += count - 1; + } else { + blob_write_uint32(metadata, remap_type_uniform_offset); + + blob_write_uint32(metadata, offset); + } } } @@ -592,80 +617,74 @@ 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 if (type == remap_type_uniform_offsets_equal) { + uint32_t uni_offset = blob_read_uint32(metadata); + uint32_t count = blob_read_uint32(metadata); + struct gl_uniform_storage *entry = uniform_storage + uni_offset; + + for (unsigned j = 0; j < count; j++) + remap_table[i+j] = entry; + i += count - 1; + } 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); } } } @@ -1015,6 +1034,8 @@ write_shader_parameters(struct blob *metadata, blob_write_uint32(metadata, param->DataType); blob_write_bytes(metadata, param->StateIndexes, sizeof(param->StateIndexes)); + blob_write_uint32(metadata, param->UniformStorageIndex); + blob_write_uint32(metadata, param->MainUniformStorageIndex); i++; } @@ -1046,6 +1067,10 @@ read_shader_parameters(struct blob_reader *metadata, _mesa_add_parameter(params, type, name, size, data_type, NULL, state_indexes, padded); + gl_program_parameter *param = ¶ms->Parameters[i]; + param->UniformStorageIndex = blob_read_uint32(metadata); + param->MainUniformStorageIndex = blob_read_uint32(metadata); + i++; } @@ -1197,8 +1222,7 @@ create_linked_shader_and_program(struct gl_context *ctx, struct gl_linked_shader *linked = rzalloc(NULL, struct gl_linked_shader); linked->Stage = stage; - glprog = ctx->Driver.NewProgram(ctx, _mesa_shader_stage_to_program(stage), - prog->Name, false); + glprog = ctx->Driver.NewProgram(ctx, stage, prog->Name, false); glprog->info.stage = stage; linked->Program = glprog; @@ -1231,6 +1255,7 @@ serialize_glsl_program(struct blob *blob, struct gl_context *ctx, write_hash_tables(blob, prog); blob_write_uint32(blob, prog->data->Version); + blob_write_uint32(blob, prog->IsES); blob_write_uint32(blob, prog->data->linked_stages); for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) { @@ -1289,6 +1314,7 @@ deserialize_glsl_program(struct blob_reader *blob, struct gl_context *ctx, read_hash_tables(blob, prog); prog->data->Version = blob_read_uint32(blob); + prog->IsES = blob_read_uint32(blob); prog->data->linked_stages = blob_read_uint32(blob); unsigned mask = prog->data->linked_stages;