From b82ac27ec3242a2cf609bcec4f69886327b10f74 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 14 May 2021 15:05:31 -0400 Subject: [PATCH] panfrost: Pack blend equations at CSO create time These are large. Get them out of the per-draw path. Signed-off-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/panfrost/pan_blend_cso.c | 4 +-- src/gallium/drivers/panfrost/pan_blend_cso.h | 2 +- src/gallium/drivers/panfrost/pan_cmdstream.c | 38 ++++++++++++++++---- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.c b/src/gallium/drivers/panfrost/pan_blend_cso.c index de5aa4fb45f..6846d1991c3 100644 --- a/src/gallium/drivers/panfrost/pan_blend_cso.c +++ b/src/gallium/drivers/panfrost/pan_blend_cso.c @@ -119,8 +119,8 @@ panfrost_create_blend_state(struct pipe_context *pipe, /* Converting equations to Mali style is expensive, do it at * CSO create time instead of draw-time */ if (so->info[c].fixed_function) { - pan_blend_to_fixed_function_equation(equation, - &so->equation[c]); + pan_pack(&so->equation[c], BLEND_EQUATION, cfg) + pan_blend_to_fixed_function_equation(equation, &cfg); } } diff --git a/src/gallium/drivers/panfrost/pan_blend_cso.h b/src/gallium/drivers/panfrost/pan_blend_cso.h index ccabf6ab8b9..9acac7566d8 100644 --- a/src/gallium/drivers/panfrost/pan_blend_cso.h +++ b/src/gallium/drivers/panfrost/pan_blend_cso.h @@ -60,7 +60,7 @@ struct panfrost_blend_state { struct pipe_blend_state base; struct pan_blend_state pan; struct pan_blend_info info[PIPE_MAX_COLOR_BUFS]; - struct MALI_BLEND_EQUATION equation[PIPE_MAX_COLOR_BUFS]; + struct mali_blend_equation_packed equation[PIPE_MAX_COLOR_BUFS]; }; /* Container for a final blend state, specialized to constants and a diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index 5b9a0addc01..6dee5ae60bd 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -325,7 +325,9 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch, continue; } - pan_pack(rts + i * MALI_BLEND_LENGTH, BLEND, cfg) { + struct mali_blend_packed *packed = rts + (i * MALI_BLEND_LENGTH); + + pan_pack(packed, BLEND, cfg) { struct pan_blend_info info = so->info[i]; if (info.no_colour) { @@ -364,8 +366,6 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch, for (unsigned i = 0; i < format_desc->nr_channels; i++) chan_size = MAX2(format_desc->channel[0].size, chan_size); - cfg.bifrost.equation = so->equation[i]; - /* Fixed point constant */ u16 constant = blend[i].equation.constant * ((1 << chan_size) - 1); constant <<= 16 - chan_size; @@ -386,6 +386,12 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch, cfg.bifrost.internal.fixed_function.rt = i; } } + + if (!blend[i].is_shader) { + /* Word 1: Blend Equation */ + STATIC_ASSERT(MALI_BLEND_EQUATION_LENGTH == 4); + packed->opaque[1] = so->equation[i].opaque[0]; + } } } @@ -400,9 +406,11 @@ panfrost_emit_midgard_blend(struct panfrost_batch *batch, /* Always have at least one render target for depth-only passes */ for (unsigned i = 0; i < MAX2(rt_count, 1); ++i) { + struct mali_blend_packed *packed = rts + (i * MALI_BLEND_LENGTH); + /* Disable blending for unbacked render targets */ if (rt_count == 0 || !batch->key.cbufs[i]) { - pan_pack(rts + i * MALI_BLEND_LENGTH, BLEND, cfg) { + pan_pack(packed, BLEND, cfg) { cfg.midgard.equation.color_mask = 0xf; cfg.midgard.equation.rgb.a = MALI_BLEND_OPERAND_A_SRC; cfg.midgard.equation.rgb.b = MALI_BLEND_OPERAND_B_SRC; @@ -415,7 +423,7 @@ panfrost_emit_midgard_blend(struct panfrost_batch *batch, continue; } - pan_pack(rts + i * MALI_BLEND_LENGTH, BLEND, cfg) { + pan_pack(packed, BLEND, cfg) { struct pan_blend_info info = so->info[i]; if (info.no_colour) { @@ -431,10 +439,15 @@ panfrost_emit_midgard_blend(struct panfrost_batch *batch, if (blend[i].is_shader) { cfg.midgard.shader_pc = blend[i].shader.gpu | blend[i].shader.first_tag; } else { - cfg.midgard.equation = ctx->blend->equation[i]; cfg.midgard.constant = blend[i].equation.constant; } } + + if (!blend[i].is_shader) { + /* Word 2: Blend Equation */ + STATIC_ASSERT(MALI_BLEND_EQUATION_LENGTH == 4); + packed->opaque[2] = so->equation[i].opaque[0]; + } } } @@ -569,7 +582,6 @@ panfrost_prepare_midgard_fs_state(struct panfrost_context *ctx, state->sfbd_blend_shader = blend[0].shader.gpu | blend[0].shader.first_tag; } else { - state->sfbd_blend_equation = so->equation[0]; state->sfbd_blend_constant = blend[0].equation.constant; } } else if (dev->quirks & MIDGARD_SFBD) { @@ -595,6 +607,7 @@ panfrost_prepare_midgard_fs_state(struct panfrost_context *ctx, break; } } + } static void @@ -656,9 +669,20 @@ panfrost_emit_frag_shader(struct panfrost_context *ctx, struct mali_renderer_state_packed *fragmeta, struct panfrost_blend_final *blend) { + struct panfrost_device *dev = pan_device(ctx->base.screen); + pan_pack(fragmeta, RENDERER_STATE, cfg) { panfrost_prepare_fs_state(ctx, blend, &cfg); } + + if ((dev->quirks & MIDGARD_SFBD) + && ctx->pipe_framebuffer.nr_cbufs > 0 + && !blend[0].is_shader) { + + /* Word 14: SFBD Blend Equation */ + STATIC_ASSERT(MALI_BLEND_EQUATION_LENGTH == 4); + fragmeta->opaque[14] = ctx->blend->equation[0].opaque[0]; + } } mali_ptr