aco: do not set COMPR for exports but use 0x3 channel mask on GFX11

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16369>
This commit is contained in:
Samuel Pitoiset 2022-05-06 11:57:10 +02:00 committed by Marge Bot
parent a6e1445d5f
commit b6ba4cb407

View file

@ -10735,19 +10735,19 @@ export_fs_mrt_z(isel_context* ctx)
/* Both stencil and sample mask only need 16-bits. */ /* Both stencil and sample mask only need 16-bits. */
if (!ctx->program->info.ps.writes_z && if (!ctx->program->info.ps.writes_z &&
(ctx->program->info.ps.writes_stencil || ctx->program->info.ps.writes_sample_mask)) { (ctx->program->info.ps.writes_stencil || ctx->program->info.ps.writes_sample_mask)) {
compr = true; /* COMPR flag */ compr = ctx->program->chip_class < GFX11; /* COMPR flag */
if (ctx->program->info.ps.writes_stencil) { if (ctx->program->info.ps.writes_stencil) {
/* Stencil should be in X[23:16]. */ /* Stencil should be in X[23:16]. */
values[0] = Operand(ctx->outputs.temps[FRAG_RESULT_STENCIL * 4u]); values[0] = Operand(ctx->outputs.temps[FRAG_RESULT_STENCIL * 4u]);
values[0] = bld.vop2(aco_opcode::v_lshlrev_b32, bld.def(v1), Operand::c32(16u), values[0]); values[0] = bld.vop2(aco_opcode::v_lshlrev_b32, bld.def(v1), Operand::c32(16u), values[0]);
enabled_channels |= 0x3; enabled_channels |= ctx->program->chip_class >= GFX11 ? 0x1 : 0x3;
} }
if (ctx->program->info.ps.writes_sample_mask) { if (ctx->program->info.ps.writes_sample_mask) {
/* SampleMask should be in Y[15:0]. */ /* SampleMask should be in Y[15:0]. */
values[1] = Operand(ctx->outputs.temps[FRAG_RESULT_SAMPLE_MASK * 4u]); values[1] = Operand(ctx->outputs.temps[FRAG_RESULT_SAMPLE_MASK * 4u]);
enabled_channels |= 0xc; enabled_channels |= ctx->program->chip_class >= GFX11 ? 0x2 : 0xc;
} }
} else { } else {
if (ctx->program->info.ps.writes_z) { if (ctx->program->info.ps.writes_z) {
@ -10839,6 +10839,14 @@ export_fs_mrt_color(isel_context* ctx, int slot)
values[i] = enabled_channels & (1 << i) ? values[i] : Operand(v1); values[i] = enabled_channels & (1 << i) ? values[i] : Operand(v1);
} }
if (ctx->program->chip_class >= GFX11) {
/* GFX11 doesn't use COMPR for exports, but the channel mask should be
* 0x3 instead.
*/
enabled_channels = compr ? 0x3 : enabled_channels;
compr = false;
}
bld.exp(aco_opcode::exp, values[0], values[1], values[2], values[3], enabled_channels, target, bld.exp(aco_opcode::exp, values[0], values[1], values[2], values[3], enabled_channels, target,
compr); compr);
return true; return true;