nir: add a strip parameter to nir_serialize
authorMarek Olšák <marek.olsak@amd.com>
Wed, 9 Oct 2019 17:27:07 +0000 (13:27 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 10 Oct 2019 19:47:07 +0000 (15:47 -0400)
so that drivers don't have to call nir_strip manually.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Rob Clark <robdclark@gmail.com>
src/compiler/nir/nir_serialize.c
src/compiler/nir/nir_serialize.h
src/gallium/drivers/iris/iris_program.c
src/gallium/drivers/radeonsi/si_shader_nir.c
src/gallium/drivers/radeonsi/si_state_shaders.c
src/intel/vulkan/anv_pipeline_cache.c
src/mesa/drivers/dri/i965/brw_program_binary.c
src/mesa/state_tracker/st_shader_cache.c

index 0a953c8daf419a8b8e8e4ed1f4bbe49d3a48c8a4..b7b44f6af888e608823af40759eca72bece28d63 100644 (file)
@@ -1090,8 +1090,20 @@ 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 strip)
 {
+   nir_shader *stripped = NULL;
+
+   if (strip) {
+      /* Drop unnecessary information (like variable names), so the serialized
+       * NIR is smaller, and also to let us detect more isomorphic shaders
+       * when hashing, increasing cache hits.
+       */
+      stripped = nir_shader_clone(NULL, nir);
+      nir_strip(stripped);
+      nir = stripped;
+   }
+
    write_ctx ctx;
    ctx.remap_table = _mesa_pointer_hash_table_create(NULL);
    ctx.next_idx = 0;
@@ -1145,6 +1157,9 @@ nir_serialize(struct blob *blob, const nir_shader *nir)
 
    _mesa_hash_table_destroy(ctx.remap_table, NULL);
    util_dynarray_fini(&ctx.phi_fixups);
+
+   if (strip)
+      ralloc_free(stripped);
 }
 
 nir_shader *
@@ -1213,7 +1228,7 @@ nir_shader_serialize_deserialize(nir_shader *shader)
 
    struct blob writer;
    blob_init(&writer);
-   nir_serialize(&writer, shader);
+   nir_serialize(&writer, shader, false);
 
    /* Delete all of dest's ralloc children but leave dest alone */
    void *dead_ctx = ralloc_context(NULL);
index 528988f5e4afd66d85a585d6afd15dfb6218cdde..e813f2c74776d5f856762bc12cbad7fd52c8d145 100644 (file)
@@ -31,7 +31,7 @@
 extern "C" {
 #endif
 
-void nir_serialize(struct blob *blob, const nir_shader *nir);
+void nir_serialize(struct blob *blob, const nir_shader *nir, bool strip);
 nir_shader *nir_deserialize(void *mem_ctx,
                             const struct nir_shader_compiler_options *options,
                             struct blob_reader *blob);
index 886cdff56b665452b754bcbc1b45ab0bac3c292d..2670bc285795667688274cc82b698b3f9840e730 100644 (file)
@@ -2019,22 +2019,15 @@ iris_create_uncompiled_shader(struct pipe_context *ctx,
 
    if (screen->disk_cache) {
       /* Serialize the NIR to a binary blob that we can hash for the disk
-       * cache.  First, drop unnecessary information (like variable names)
+       * cache.  Drop unnecessary information (like variable names)
        * so the serialized NIR is smaller, and also to let us detect more
-       * isomorphic shaders when hashing, increasing cache hits.  We clone
-       * the NIR before stripping away this info because it can be useful
-       * when inspecting and debugging shaders.
+       * isomorphic shaders when hashing, increasing cache hits.
        */
-      nir_shader *clone = nir_shader_clone(NULL, nir);
-      nir_strip(clone);
-
       struct blob blob;
       blob_init(&blob);
-      nir_serialize(&blob, clone);
+      nir_serialize(&blob, nir, true);
       _mesa_sha1_compute(blob.data, blob.size, ish->nir_sha1);
       blob_finish(&blob);
-
-      ralloc_free(clone);
    }
 
    return ish;
index 6c267bbdafaa0c9cdd74f169316e41df3fcc0b44..e97e5ccb07b2653806ee8c9c103fe9f6c75814e5 100644 (file)
@@ -1004,11 +1004,6 @@ void si_lower_nir(struct si_shader_selector *sel)
        si_nir_opts(sel->nir);
 
        NIR_PASS_V(sel->nir, nir_lower_bool_to_int32);
-
-       /* Strip the resulting shader so that the shader cache is more likely
-        * to hit from other similar shaders.
-        */
-       nir_strip(sel->nir);
 }
 
 static void declare_nir_input_vs(struct si_shader_context *ctx,
index 04443db7a440964b7a55d4b3830b06b52f4e7ad8..b2071a21b31c96068fd2d025cb05130953c5fb9b 100644 (file)
@@ -59,7 +59,7 @@ void *si_get_ir_binary(struct si_shader_selector *sel, bool ngg, bool es)
                assert(sel->nir);
 
                blob_init(&blob);
-               nir_serialize(&blob, sel->nir);
+               nir_serialize(&blob, sel->nir, true);
                ir_binary = blob.data;
                ir_size = blob.size;
        }
index 9c315d5f44c0a54090298fb134adc548bece260c..e1d48b879b07effede1be87a0355a76b0e36a120 100644 (file)
@@ -779,7 +779,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;
index bf875341e21e301533e70f932ab9fcd341b20d44..a126f863ae245a48e30dc8b94c47d1e4bb70d9e9 100644 (file)
@@ -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);
 }
 
index ae1602310dbd89303d2f1fd0d2cf1e5c5235a847..a56e9fa354cff83f588c8b426a977fa797f270bc 100644 (file)
@@ -67,7 +67,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, false);
    copy_blob_to_driver_cache_blob(blob, prog);
 }