freedreno/ir3: make immediates array dynamic
authorHyunjun Ko <zzoon@igalia.com>
Thu, 30 Aug 2018 02:58:53 +0000 (11:58 +0900)
committerRob Clark <robdclark@gmail.com>
Wed, 5 Sep 2018 17:38:43 +0000 (13:38 -0400)
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 <robdclark@gmail.com>
src/gallium/drivers/freedreno/ir3/ir3_cp.c
src/gallium/drivers/freedreno/ir3/ir3_shader.c
src/gallium/drivers/freedreno/ir3/ir3_shader.h

index 0ee8ea2e0ea295c1c8fea091dabeea180448a603..ea92f6b85779b304e6221dd2e2e8c9e6360fd75e 100644 (file)
@@ -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;
index 7bb4263b1774a055674d81ffb92a46cc22b5140c..125bf3b983ecd1e9fe8b361ef80153a19a00fb87 100644 (file)
@@ -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);
 }
 
index 288e9fa4e70fd509850d8879331ec884995c5e0f..456701be7db58df0f14d2e3b49ac0b89c54bd808 100644 (file)
@@ -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