pan/bi: Fix dual texturing with uniforms

The GLSL code sequence:

   texture2D(tex0, u_coords) + texture2D(tex1, u_coords)

will be optimized to

   TEXC_DUAL tex0/tex1, u_coords, #texture_descriptor

If this optimization happens after lowering FAU, the resulting TEXC instruction
is unschedulable: both the uniform and the constant descriptor fight for the
same FAU slot.

However, if this optimization happens before lowering FAU, then the FAU lowering
will move the descriptor into a register, complicating the dual texturing fixup
in RA.

To fix this interaction, fuse dual texturing before lowering FAU and keep
texture descriptors as constants when lowering FAU of TEXC.

Fixes scheduling failure in piglit drawoverhead -test 3 with uniform reordering.

Fixes: a4d3a29647 ("pan/bi: Enable dual texture fusing pass")
Fixes: 6b2eda6b72 ("pan/bi: Reorder pushed uniforms to avoid moves")
Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18378>
This commit is contained in:
Alyssa Rosenzweig
2022-09-01 15:11:36 -04:00
committed by Marge Bot
parent d01cbced85
commit c5b9a01fea
2 changed files with 21 additions and 10 deletions

View File

@@ -2015,6 +2015,14 @@ bi_lower_fau(bi_context *ctx)
if (ins->op == BI_OPCODE_ATEST) if (ins->op == BI_OPCODE_ATEST)
fau = ins->src[2]; fau = ins->src[2];
/* Dual texturing requires the texture operation descriptor
* encoded as an immediate so we can fix up.
*/
if (ins->op == BI_OPCODE_TEXC) {
assert(ins->src[3].type == BI_INDEX_CONSTANT);
constants[cwords++] = ins->src[3].value;
}
bi_foreach_src(ins, s) { bi_foreach_src(ins, s) {
if (bi_check_fau_src(ins, s, constants, &cwords, &fau)) continue; if (bi_check_fau_src(ins, s, constants, &cwords, &fau)) continue;

View File

@@ -5107,16 +5107,6 @@ bi_compile_variant_nir(nir_shader *nir,
if (bifrost_debug & BIFROST_DBG_SHADERS && !skip_internal) if (bifrost_debug & BIFROST_DBG_SHADERS && !skip_internal)
bi_print_shader(ctx, stdout); bi_print_shader(ctx, stdout);
if (ctx->arch <= 8) {
bi_lower_fau(ctx);
}
/* Lowering FAU can create redundant moves. Run CSE+DCE to clean up. */
if (likely(optimize)) {
bi_opt_cse(ctx);
bi_opt_dead_code_eliminate(ctx);
}
/* Analyze before register allocation to avoid false dependencies. The /* Analyze before register allocation to avoid false dependencies. The
* skip bit is a function of only the data flow graph and is invariant * skip bit is a function of only the data flow graph and is invariant
* under valid scheduling. Helpers are only defined for fragment * under valid scheduling. Helpers are only defined for fragment
@@ -5131,6 +5121,19 @@ bi_compile_variant_nir(nir_shader *nir,
bi_opt_fuse_dual_texture(ctx); bi_opt_fuse_dual_texture(ctx);
} }
/* Lower FAU after fusing dual texture, because fusing dual texture
* creates new immediates that themselves may need lowering.
*/
if (ctx->arch <= 8) {
bi_lower_fau(ctx);
}
/* Lowering FAU can create redundant moves. Run CSE+DCE to clean up. */
if (likely(optimize)) {
bi_opt_cse(ctx);
bi_opt_dead_code_eliminate(ctx);
}
if (likely(!(bifrost_debug & BIFROST_DBG_NOPSCHED))) if (likely(!(bifrost_debug & BIFROST_DBG_NOPSCHED)))
bi_pressure_schedule(ctx); bi_pressure_schedule(ctx);