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