Mesa (main): ir3: Add ir3_shader_create_variant()

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


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

Author: Connor Abbott <cwabbott0 at gmail.com>
Date:   Thu Feb 17 12:48:43 2022 +0100

ir3: Add ir3_shader_create_variant()

This is similar to ir3_shader_get_variant(), but always compiles the
variant from scratch and returns a variant that's owned by the user
rather than the shader. We'll need this because when variants are stored
in the Vulkan pipeline cache they will outlive their shader.

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

---

 src/freedreno/ir3/ir3_shader.c | 19 +++++++++++++------
 src/freedreno/ir3/ir3_shader.h |  5 +++++
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/src/freedreno/ir3/ir3_shader.c b/src/freedreno/ir3/ir3_shader.c
index 73535808738..6543f24528a 100644
--- a/src/freedreno/ir3/ir3_shader.c
+++ b/src/freedreno/ir3/ir3_shader.c
@@ -314,9 +314,8 @@ compile_variant(struct ir3_shader *shader, struct ir3_shader_variant *v)
  */
 static struct ir3_shader_variant *
 alloc_variant(struct ir3_shader *shader, const struct ir3_shader_key *key,
-              struct ir3_shader_variant *nonbinning)
+              struct ir3_shader_variant *nonbinning, void *mem_ctx)
 {
-   void *mem_ctx = shader;
    /* hang the binning variant off it's non-binning counterpart instead
     * of the shader, to simplify the error cleanup paths
     */
@@ -393,9 +392,9 @@ needs_binning_variant(struct ir3_shader_variant *v)
 
 static struct ir3_shader_variant *
 create_variant(struct ir3_shader *shader, const struct ir3_shader_key *key,
-               bool write_disasm)
+               bool write_disasm, void *mem_ctx)
 {
-   struct ir3_shader_variant *v = alloc_variant(shader, key, NULL);
+   struct ir3_shader_variant *v = alloc_variant(shader, key, NULL, mem_ctx);
 
    if (!v)
       goto fail;
@@ -403,7 +402,7 @@ create_variant(struct ir3_shader *shader, const struct ir3_shader_key *key,
    v->disasm_info.write_disasm = write_disasm;
 
    if (needs_binning_variant(v)) {
-      v->binning = alloc_variant(shader, key, v);
+      v->binning = alloc_variant(shader, key, v, mem_ctx);
       if (!v->binning)
          goto fail;
       v->binning->disasm_info.write_disasm = write_disasm;
@@ -442,6 +441,14 @@ fail:
    return NULL;
 }
 
+struct ir3_shader_variant *
+ir3_shader_create_variant(struct ir3_shader *shader,
+                          const struct ir3_shader_key *key,
+                          bool keep_ir)
+{
+   return create_variant(shader, key, keep_ir, NULL);
+}
+
 static inline struct ir3_shader_variant *
 shader_variant(struct ir3_shader *shader, const struct ir3_shader_key *key)
 {
@@ -464,7 +471,7 @@ ir3_shader_get_variant(struct ir3_shader *shader,
 
    if (!v) {
       /* compile new variant if it doesn't exist already: */
-      v = create_variant(shader, key, write_disasm);
+      v = create_variant(shader, key, write_disasm, shader);
       if (v) {
          v->next = shader->variants;
          shader->variants = v;
diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h
index c9d1518b220..79dde853974 100644
--- a/src/freedreno/ir3/ir3_shader.h
+++ b/src/freedreno/ir3/ir3_shader.h
@@ -912,10 +912,15 @@ ir3_max_const(const struct ir3_shader_variant *v)
 
 void *ir3_shader_assemble(struct ir3_shader_variant *v);
 struct ir3_shader_variant *
+ir3_shader_create_variant(struct ir3_shader *shader,
+                          const struct ir3_shader_key *key,
+                          bool keep_ir);
+struct ir3_shader_variant *
 ir3_shader_get_variant(struct ir3_shader *shader,
                        const struct ir3_shader_key *key, bool binning_pass,
                        bool keep_ir, bool *created);
 
+
 struct ir3_shader_options {
    unsigned reserved_user_consts;
    enum ir3_wavesize_option api_wavesize, real_wavesize;



More information about the mesa-commit mailing list