panfrost: Pack blend equations at CSO create time
These are large. Get them out of the per-draw path. Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10869>
This commit is contained in:

committed by
Marge Bot

parent
aa85a64821
commit
b82ac27ec3
@@ -119,8 +119,8 @@ panfrost_create_blend_state(struct pipe_context *pipe,
|
|||||||
/* Converting equations to Mali style is expensive, do it at
|
/* Converting equations to Mali style is expensive, do it at
|
||||||
* CSO create time instead of draw-time */
|
* CSO create time instead of draw-time */
|
||||||
if (so->info[c].fixed_function) {
|
if (so->info[c].fixed_function) {
|
||||||
pan_blend_to_fixed_function_equation(equation,
|
pan_pack(&so->equation[c], BLEND_EQUATION, cfg)
|
||||||
&so->equation[c]);
|
pan_blend_to_fixed_function_equation(equation, &cfg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -60,7 +60,7 @@ struct panfrost_blend_state {
|
|||||||
struct pipe_blend_state base;
|
struct pipe_blend_state base;
|
||||||
struct pan_blend_state pan;
|
struct pan_blend_state pan;
|
||||||
struct pan_blend_info info[PIPE_MAX_COLOR_BUFS];
|
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
|
/* Container for a final blend state, specialized to constants and a
|
||||||
|
@@ -325,7 +325,9 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch,
|
|||||||
continue;
|
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];
|
struct pan_blend_info info = so->info[i];
|
||||||
|
|
||||||
if (info.no_colour) {
|
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++)
|
for (unsigned i = 0; i < format_desc->nr_channels; i++)
|
||||||
chan_size = MAX2(format_desc->channel[0].size, chan_size);
|
chan_size = MAX2(format_desc->channel[0].size, chan_size);
|
||||||
|
|
||||||
cfg.bifrost.equation = so->equation[i];
|
|
||||||
|
|
||||||
/* Fixed point constant */
|
/* Fixed point constant */
|
||||||
u16 constant = blend[i].equation.constant * ((1 << chan_size) - 1);
|
u16 constant = blend[i].equation.constant * ((1 << chan_size) - 1);
|
||||||
constant <<= 16 - chan_size;
|
constant <<= 16 - chan_size;
|
||||||
@@ -386,6 +386,12 @@ panfrost_emit_bifrost_blend(struct panfrost_batch *batch,
|
|||||||
cfg.bifrost.internal.fixed_function.rt = i;
|
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 */
|
/* Always have at least one render target for depth-only passes */
|
||||||
for (unsigned i = 0; i < MAX2(rt_count, 1); ++i) {
|
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 */
|
/* Disable blending for unbacked render targets */
|
||||||
if (rt_count == 0 || !batch->key.cbufs[i]) {
|
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.color_mask = 0xf;
|
||||||
cfg.midgard.equation.rgb.a = MALI_BLEND_OPERAND_A_SRC;
|
cfg.midgard.equation.rgb.a = MALI_BLEND_OPERAND_A_SRC;
|
||||||
cfg.midgard.equation.rgb.b = MALI_BLEND_OPERAND_B_SRC;
|
cfg.midgard.equation.rgb.b = MALI_BLEND_OPERAND_B_SRC;
|
||||||
@@ -415,7 +423,7 @@ panfrost_emit_midgard_blend(struct panfrost_batch *batch,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pan_pack(rts + i * MALI_BLEND_LENGTH, BLEND, cfg) {
|
pan_pack(packed, BLEND, cfg) {
|
||||||
struct pan_blend_info info = so->info[i];
|
struct pan_blend_info info = so->info[i];
|
||||||
|
|
||||||
if (info.no_colour) {
|
if (info.no_colour) {
|
||||||
@@ -431,10 +439,15 @@ panfrost_emit_midgard_blend(struct panfrost_batch *batch,
|
|||||||
if (blend[i].is_shader) {
|
if (blend[i].is_shader) {
|
||||||
cfg.midgard.shader_pc = blend[i].shader.gpu | blend[i].shader.first_tag;
|
cfg.midgard.shader_pc = blend[i].shader.gpu | blend[i].shader.first_tag;
|
||||||
} else {
|
} else {
|
||||||
cfg.midgard.equation = ctx->blend->equation[i];
|
|
||||||
cfg.midgard.constant = blend[i].equation.constant;
|
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 |
|
state->sfbd_blend_shader = blend[0].shader.gpu |
|
||||||
blend[0].shader.first_tag;
|
blend[0].shader.first_tag;
|
||||||
} else {
|
} else {
|
||||||
state->sfbd_blend_equation = so->equation[0];
|
|
||||||
state->sfbd_blend_constant = blend[0].equation.constant;
|
state->sfbd_blend_constant = blend[0].equation.constant;
|
||||||
}
|
}
|
||||||
} else if (dev->quirks & MIDGARD_SFBD) {
|
} else if (dev->quirks & MIDGARD_SFBD) {
|
||||||
@@ -595,6 +607,7 @@ panfrost_prepare_midgard_fs_state(struct panfrost_context *ctx,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -656,9 +669,20 @@ panfrost_emit_frag_shader(struct panfrost_context *ctx,
|
|||||||
struct mali_renderer_state_packed *fragmeta,
|
struct mali_renderer_state_packed *fragmeta,
|
||||||
struct panfrost_blend_final *blend)
|
struct panfrost_blend_final *blend)
|
||||||
{
|
{
|
||||||
|
struct panfrost_device *dev = pan_device(ctx->base.screen);
|
||||||
|
|
||||||
pan_pack(fragmeta, RENDERER_STATE, cfg) {
|
pan_pack(fragmeta, RENDERER_STATE, cfg) {
|
||||||
panfrost_prepare_fs_state(ctx, blend, &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
|
mali_ptr
|
||||||
|
Reference in New Issue
Block a user