From b4da2f6667e8fcdd4f8fdd45f3859e036a3b855c Mon Sep 17 00:00:00 2001 From: Hyunjun Ko Date: Thu, 30 Aug 2018 11:58:53 +0900 Subject: [PATCH] freedreno/ir3: make immediates array dynamic 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. Signed-off-by: Rob Clark --- 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 0ee8ea2e0ea..ea92f6b8577 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 7bb4263b177..125bf3b983e 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 288e9fa4e70..456701be7db 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.30.2