[Mesa-dev] [PATCH 3/3] nir: drop the variable name when serializing

Timothy Arceri tarceri at itsqueeze.com
Fri Mar 1 06:38:44 UTC 2019


We know NIR can handle this because the shaders coming from spirv don't
have names. Dropping the name makes the shaders more generic which can
make it better when using the serialized NIR as a key for in memory
shader caches such as what we do for radeonsi.

Also it just means we can write/read less to and from the disk cache.

For now we add a param to keep uniform names as they are still
required by the st when assigning uniform locations.
---
 src/compiler/nir/nir_serialize.c              | 29 ++++++++++---------
 src/compiler/nir/nir_serialize.h              |  3 +-
 .../drivers/radeonsi/si_state_shaders.c       |  2 +-
 src/intel/vulkan/anv_pipeline_cache.c         |  2 +-
 .../drivers/dri/i965/brw_program_binary.c     |  2 +-
 src/mesa/state_tracker/st_shader_cache.c      |  2 +-
 6 files changed, 21 insertions(+), 19 deletions(-)

diff --git a/src/compiler/nir/nir_serialize.c b/src/compiler/nir/nir_serialize.c
index adcc0cf43df..e30e125d7b7 100644
--- a/src/compiler/nir/nir_serialize.c
+++ b/src/compiler/nir/nir_serialize.c
@@ -132,12 +132,12 @@ read_constant(read_ctx *ctx, nir_variable *nvar)
 }
 
 static void
-write_variable(write_ctx *ctx, const nir_variable *var)
+write_variable(write_ctx *ctx, const nir_variable *var, bool keep_name)
 {
    write_add_object(ctx, var);
    encode_type_to_blob(ctx->blob, var->type);
-   blob_write_uint32(ctx->blob, !!(var->name));
-   if (var->name)
+   blob_write_uint32(ctx->blob, (!!(var->name)) && keep_name);
+   if (var->name && keep_name)
       blob_write_string(ctx->blob, var->name);
    blob_write_bytes(ctx->blob, (uint8_t *) &var->data, sizeof(var->data));
    blob_write_uint32(ctx->blob, var->num_state_slots);
@@ -197,11 +197,11 @@ read_variable(read_ctx *ctx)
 }
 
 static void
-write_var_list(write_ctx *ctx, const struct exec_list *src)
+write_var_list(write_ctx *ctx, const struct exec_list *src, bool keep_names)
 {
    blob_write_uint32(ctx->blob, exec_list_length(src));
    foreach_list_typed(nir_variable, var, node, src) {
-      write_variable(ctx, var);
+      write_variable(ctx, var, keep_names);
    }
 }
 
@@ -996,7 +996,7 @@ read_cf_list(read_ctx *ctx, struct exec_list *cf_list)
 static void
 write_function_impl(write_ctx *ctx, const nir_function_impl *fi)
 {
-   write_var_list(ctx, &fi->locals);
+   write_var_list(ctx, &fi->locals, false);
    write_reg_list(ctx, &fi->registers);
    blob_write_uint32(ctx->blob, fi->reg_alloc);
 
@@ -1070,7 +1070,8 @@ read_function(read_ctx *ctx)
 }
 
 void
-nir_serialize(struct blob *blob, const nir_shader *nir)
+nir_serialize(struct blob *blob, const nir_shader *nir,
+              bool keep_uniform_names)
 {
    write_ctx ctx;
    ctx.remap_table = _mesa_pointer_hash_table_create(NULL);
@@ -1085,12 +1086,12 @@ nir_serialize(struct blob *blob, const nir_shader *nir)
    info.name = info.label = NULL;
    blob_write_bytes(blob, (uint8_t *) &info, sizeof(info));
 
-   write_var_list(&ctx, &nir->uniforms);
-   write_var_list(&ctx, &nir->inputs);
-   write_var_list(&ctx, &nir->outputs);
-   write_var_list(&ctx, &nir->shared);
-   write_var_list(&ctx, &nir->globals);
-   write_var_list(&ctx, &nir->system_values);
+   write_var_list(&ctx, &nir->uniforms, keep_uniform_names);
+   write_var_list(&ctx, &nir->inputs, false);
+   write_var_list(&ctx, &nir->outputs, false);
+   write_var_list(&ctx, &nir->shared, false);
+   write_var_list(&ctx, &nir->globals, false);
+   write_var_list(&ctx, &nir->system_values, false);
 
    write_reg_list(&ctx, &nir->registers);
    blob_write_uint32(blob, nir->reg_alloc);
@@ -1178,7 +1179,7 @@ nir_shader_serialize_deserialize(void *mem_ctx, nir_shader *s)
 
    struct blob writer;
    blob_init(&writer);
-   nir_serialize(&writer, s);
+   nir_serialize(&writer, s, true);
    ralloc_free(s);
 
    struct blob_reader reader;
diff --git a/src/compiler/nir/nir_serialize.h b/src/compiler/nir/nir_serialize.h
index f77d8e367ff..41e4de5211e 100644
--- a/src/compiler/nir/nir_serialize.h
+++ b/src/compiler/nir/nir_serialize.h
@@ -31,7 +31,8 @@
 extern "C" {
 #endif
 
-void nir_serialize(struct blob *blob, const nir_shader *nir);
+void nir_serialize(struct blob *blob, const nir_shader *nir,
+                   bool keep_uniform_names);
 nir_shader *nir_deserialize(void *mem_ctx,
                             const struct nir_shader_compiler_options *options,
                             struct blob_reader *blob);
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 5bdfd4f6ac1..ea824b278e4 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -58,7 +58,7 @@ void *si_get_ir_binary(struct si_shader_selector *sel)
 		assert(sel->nir);
 
 		blob_init(&blob);
-		nir_serialize(&blob, sel->nir);
+		nir_serialize(&blob, sel->nir, false);
 		ir_binary = blob.data;
 		ir_size = blob.size;
 	}
diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c
index ad1bcf0940f..04d3fdfbbdd 100644
--- a/src/intel/vulkan/anv_pipeline_cache.c
+++ b/src/intel/vulkan/anv_pipeline_cache.c
@@ -753,7 +753,7 @@ anv_device_upload_nir(struct anv_device *device,
       struct blob blob;
       blob_init(&blob);
 
-      nir_serialize(&blob, nir);
+      nir_serialize(&blob, nir, false);
       if (blob.out_of_memory) {
          blob_finish(&blob);
          return;
diff --git a/src/mesa/drivers/dri/i965/brw_program_binary.c b/src/mesa/drivers/dri/i965/brw_program_binary.c
index 1298d9e765e..85776cb2d87 100644
--- a/src/mesa/drivers/dri/i965/brw_program_binary.c
+++ b/src/mesa/drivers/dri/i965/brw_program_binary.c
@@ -132,7 +132,7 @@ serialize_nir_part(struct blob *writer, struct gl_program *prog)
    blob_write_uint32(writer, NIR_PART);
    intptr_t size_offset = blob_reserve_uint32(writer);
    size_t nir_start = writer->size;
-   nir_serialize(writer, prog->nir);
+   nir_serialize(writer, prog->nir, false);
    blob_overwrite_uint32(writer, size_offset, writer->size - nir_start);
 }
 
diff --git a/src/mesa/state_tracker/st_shader_cache.c b/src/mesa/state_tracker/st_shader_cache.c
index c82ce3eaa2d..a436b695a6c 100644
--- a/src/mesa/state_tracker/st_shader_cache.c
+++ b/src/mesa/state_tracker/st_shader_cache.c
@@ -66,7 +66,7 @@ write_tgsi_to_cache(struct blob *blob, const struct tgsi_token *tokens,
 static void
 write_nir_to_cache(struct blob *blob, struct gl_program *prog)
 {
-   nir_serialize(blob, prog->nir);
+   nir_serialize(blob, prog->nir, true);
    copy_blob_to_driver_cache_blob(blob, prog);
 }
 
-- 
2.20.1



More information about the mesa-dev mailing list