[Mesa-dev] [PATCH 1/2] freedreno/ir3: make immediates array dynamic

Hyunjun Ko zzoon at igalia.com
Thu Aug 30 02:58:53 UTC 2018


Since most shaders wouldn't need that large array of immediates, making
the array dynamic could save unnecessary spaces.

In addition, sometimes we can potentially have a much larger array
of immediates to be lowered, which might be more than 64.
---
 src/gallium/drivers/freedreno/ir3/ir3_cp.c     | 7 +++++++
 src/gallium/drivers/freedreno/ir3/ir3_shader.c | 2 ++
 src/gallium/drivers/freedreno/ir3/ir3_shader.h | 3 ++-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cp.c b/src/gallium/drivers/freedreno/ir3/ir3_cp.c
index 0ee8ea2e0e..ea92f6b857 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cp.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cp.c
@@ -286,6 +286,13 @@ lower_immed(struct ir3_cp_ctx *ctx, struct ir3_register *reg, unsigned new_flags
 		new_flags &= ~IR3_REG_FNEG;
 	}
 
+	/* Reallocate for 4 more elements whenever it's necessary */
+	if (ctx->immediate_idx == ctx->so->immediates_size * 4) {
+		ctx->so->immediates_size += 4;
+		ctx->so->immediates = realloc (ctx->so->immediates,
+			ctx->so->immediates_size * sizeof (ctx->so->immediates[0]));
+	}
+
 	for (i = 0; i < ctx->immediate_idx; i++) {
 		swiz = i % 4;
 		idx  = i / 4;
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.c b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
index 7bb4263b17..125bf3b983 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.c
@@ -54,6 +54,8 @@ delete_variant(struct ir3_shader_variant *v)
 		ir3_destroy(v->ir);
 	if (v->bo)
 		fd_bo_del(v->bo);
+	if (v->immediates)
+		free(v->immediates);
 	free(v);
 }
 
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.h b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
index 288e9fa4e7..456701be7d 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.h
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
@@ -325,9 +325,10 @@ struct ir3_shader_variant {
 	} constbase;
 
 	unsigned immediates_count;
+	unsigned immediates_size;
 	struct {
 		uint32_t val[4];
-	} immediates[64];
+	} *immediates;
 
 	/* for astc srgb workaround, the number/base of additional
 	 * alpha tex states we need, and index of original tex states
-- 
2.17.1



More information about the mesa-dev mailing list