nir: Fix printing of individual instructions with io semantics.
[mesa.git] / src / compiler / glsl / serialize.cpp
index 4feea7c98a565226495e04c8ba7516f7a2483ce3..2f68d1b97853ed20ca3f9f52a9e85032cdfec686 100644 (file)
@@ -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,7 +568,8 @@ 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
@@ -581,15 +582,32 @@ write_uniform_remap_table(struct blob *metadata,
 
    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);
       }
    }
@@ -634,6 +652,14 @@ read_uniform_remap_table(struct blob_reader *metadata,
          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;
@@ -1196,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;
 
@@ -1230,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++) {
@@ -1288,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;