freedreno/ir3: Plumb the ir3_shader_variant into legalize.
authorEric Anholt <eric@anholt.net>
Wed, 22 Jan 2020 18:53:17 +0000 (10:53 -0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 23 Jan 2020 17:38:29 +0000 (17:38 +0000)
legalize is computing a lot of state that goes in the variant, let's just
store it directly instead of passing pointers around.  This leaves
max_bary in place, which is doing some surprising work (overwriting the
original total_in in some cases).

Reviewed-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3494>

src/freedreno/ir3/ir3.h
src/freedreno/ir3/ir3_compiler_nir.c
src/freedreno/ir3/ir3_legalize.c

index e777bf440e67d1b654ba06f951fd0b8214cd7450..b5135fa40175c725659124c65fda6aa028b16849 100644 (file)
@@ -1138,7 +1138,7 @@ struct ir3_ra_reg_set * ir3_ra_alloc_reg_set(struct ir3_compiler *compiler);
 int ir3_ra(struct ir3_shader_variant *v, struct ir3_instruction **precolor, unsigned nprecolor);
 
 /* legalize: */
-void ir3_legalize(struct ir3 *ir, bool *has_ssbo, bool *need_pixlod, int *max_bary);
+void ir3_legalize(struct ir3 *ir, struct ir3_shader_variant *so, int *max_bary);
 
 /* ************************************************************************* */
 /* instruction helpers */
index 656c85e67f18bcabd72afe302deeb9ed1f9b2611..602b36121655bf6c77c74b42ac267df1c6104533 100644 (file)
@@ -3528,7 +3528,7 @@ ir3_compile_shader_nir(struct ir3_compiler *compiler,
        /* We need to do legalize after (for frag shader's) the "bary.f"
         * offsets (inloc) have been assigned.
         */
-       ir3_legalize(ir, &so->has_ssbo, &so->need_pixlod, &max_bary);
+       ir3_legalize(ir, so, &max_bary);
 
        ir3_debug_print(ir, "AFTER LEGALIZE");
 
index 1920fcfb93a4ae3b60f8a49f274f121e1f4ec50e..7894b75c0e862b14ca2d5e143b741b6f263047a5 100644 (file)
@@ -41,9 +41,8 @@
 
 struct ir3_legalize_ctx {
        struct ir3_compiler *compiler;
+       struct ir3_shader_variant *so;
        gl_shader_stage type;
-       bool has_ssbo;
-       bool need_pixlod;
        int max_bary;
 };
 
@@ -252,7 +251,7 @@ legalize_block(struct ir3_legalize_ctx *ctx, struct ir3_block *block)
 
                if (is_tex(n) || (n->opc == OPC_META_TEX_PREFETCH)) {
                        regmask_set(&state->needs_sy, n->regs[0]);
-                       ctx->need_pixlod = true;
+                       ctx->so->need_pixlod = true;
                        if (n->opc == OPC_META_TEX_PREFETCH)
                                has_tex_prefetch = true;
                } else if (n->opc == OPC_RESINFO) {
@@ -281,7 +280,7 @@ legalize_block(struct ir3_legalize_ctx *ctx, struct ir3_block *block)
                }
 
                if (is_ssbo(n->opc) || (is_atomic(n->opc) && (n->flags & IR3_INSTR_G)))
-                       ctx->has_ssbo = true;
+                       ctx->so->has_ssbo = true;
 
                /* both tex/sfu appear to not always immediately consume
                 * their src register(s):
@@ -568,11 +567,12 @@ mark_xvergence_points(struct ir3 *ir)
 }
 
 void
-ir3_legalize(struct ir3 *ir, bool *has_ssbo, bool *need_pixlod, int *max_bary)
+ir3_legalize(struct ir3 *ir, struct ir3_shader_variant *so, int *max_bary)
 {
        struct ir3_legalize_ctx *ctx = rzalloc(ir, struct ir3_legalize_ctx);
        bool progress;
 
+       ctx->so = so;
        ctx->max_bary = -1;
        ctx->compiler = ir->compiler;
        ctx->type = ir->type;
@@ -590,8 +590,6 @@ ir3_legalize(struct ir3 *ir, bool *has_ssbo, bool *need_pixlod, int *max_bary)
                }
        } while (progress);
 
-       *has_ssbo = ctx->has_ssbo;
-       *need_pixlod = ctx->need_pixlod;
        *max_bary = ctx->max_bary;
 
        do {