Mesa (main): ir3: Add functions to serialize variants

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri May 13 17:52:17 UTC 2022


Module: Mesa
Branch: main
Commit: c7a62936357ec6166c8aae9fe16996e56baf51b7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=c7a62936357ec6166c8aae9fe16996e56baf51b7

Author: Connor Abbott <cwabbott0 at gmail.com>
Date:   Mon Apr 25 12:11:17 2022 +0200

ir3: Add functions to serialize variants

This will be used by turnip to create free-floating variant objects that
integrate into the Vulkan cache system.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16147>

---

 src/freedreno/ir3/ir3_compiler.h   |  8 +++++--
 src/freedreno/ir3/ir3_disk_cache.c | 49 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 2 deletions(-)

diff --git a/src/freedreno/ir3/ir3_compiler.h b/src/freedreno/ir3/ir3_compiler.h
index 0bc300f92a1..65239119ac6 100644
--- a/src/freedreno/ir3/ir3_compiler.h
+++ b/src/freedreno/ir3/ir3_compiler.h
@@ -208,9 +208,13 @@ struct ir3_compiler *ir3_compiler_create(struct fd_device *dev,
 void ir3_disk_cache_init(struct ir3_compiler *compiler);
 void ir3_disk_cache_init_shader_key(struct ir3_compiler *compiler,
                                     struct ir3_shader *shader);
-bool ir3_disk_cache_retrieve(struct ir3_compiler *compiler,
+struct ir3_shader_variant *ir3_retrieve_variant(struct blob_reader *blob,
+                                                struct ir3_compiler *compiler,
+                                                void *mem_ctx);
+void ir3_store_variant(struct blob *blob, struct ir3_shader_variant *v);
+bool ir3_disk_cache_retrieve(struct ir3_shader *shader,
                              struct ir3_shader_variant *v);
-void ir3_disk_cache_store(struct ir3_compiler *compiler,
+void ir3_disk_cache_store(struct ir3_shader *shader,
                           struct ir3_shader_variant *v);
 
 const nir_shader_compiler_options *
diff --git a/src/freedreno/ir3/ir3_disk_cache.c b/src/freedreno/ir3/ir3_disk_cache.c
index 332e45e249f..9dd6fbc6987 100644
--- a/src/freedreno/ir3/ir3_disk_cache.c
+++ b/src/freedreno/ir3/ir3_disk_cache.c
@@ -163,6 +163,55 @@ store_variant(struct blob *blob, struct ir3_shader_variant *v)
    }
 }
 
+struct ir3_shader_variant *
+ir3_retrieve_variant(struct blob_reader *blob, struct ir3_compiler *compiler,
+                     void *mem_ctx)
+{
+   struct ir3_shader_variant *v = rzalloc_size(mem_ctx, sizeof(*v));
+
+   v->id = 0;
+   v->compiler = compiler;
+   v->binning_pass = false;
+   v->nonbinning = NULL;
+   v->binning = NULL;
+   blob_copy_bytes(blob, &v->key, sizeof(v->key));
+   v->type = blob_read_uint32(blob);
+   v->mergedregs = blob_read_uint32(blob);
+   v->const_state = rzalloc_size(v, sizeof(*v->const_state));
+
+   retrieve_variant(blob, v);
+
+   if (v->type == MESA_SHADER_VERTEX && ir3_has_binning_vs(&v->key)) {
+      v->binning = rzalloc_size(v, sizeof(*v->binning));
+      v->binning->id = 0;
+      v->binning->compiler = compiler;
+      v->binning->binning_pass = true;
+      v->binning->nonbinning = v;
+      v->binning->key = v->key;
+      v->binning->type = MESA_SHADER_VERTEX;
+      v->binning->mergedregs = v->mergedregs;
+      v->binning->const_state = v->const_state;
+
+      retrieve_variant(blob, v->binning);
+   }
+   
+   return v;
+}
+
+void
+ir3_store_variant(struct blob *blob, struct ir3_shader_variant *v)
+{
+   blob_write_bytes(blob, &v->key, sizeof(v->key));
+   blob_write_uint32(blob, v->type);
+   blob_write_uint32(blob, v->mergedregs);
+
+   store_variant(blob, v);
+
+   if (v->type == MESA_SHADER_VERTEX && ir3_has_binning_vs(&v->key)) {
+      store_variant(blob, v->binning);
+   }
+}
+
 bool
 ir3_disk_cache_retrieve(struct ir3_shader *shader,
                         struct ir3_shader_variant *v)



More information about the mesa-commit mailing list