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);
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;
}
{
remap_type_inactive_explicit_location,
remap_type_null_ptr,
- remap_type_uniform_offset
+ remap_type_uniform_offset,
+ remap_type_uniform_offsets_equal,
};
static void
for (unsigned i = 0; i < num_entries; i++) {
gl_uniform_storage *entry = remap_table[i];
+ uint32_t offset = entry - uniform_storage;
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);
- uint32_t offset = entry - uniform_storage;
blob_write_uint32(metadata, offset);
}
}
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;
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;
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++) {
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;