When the mask is not 0xf we need to update the number of enabled channels, otherwise the hardware won't emit the components that are combined.
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/amd/common/ac_llvm_build.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index 15144addb9..8e21de1302 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1709,6 +1709,7 @@ void ac_get_image_intr_name(const char *base_name, } #define AC_EXP_TARGET (HAVE_LLVM >= 0x0500 ? 0 : 3) +#define AC_EXP_ENABLED_CHANNELS (HAVE_LLVM >= 0x0500 ? 1 : 0) #define AC_EXP_OUT0 (HAVE_LLVM >= 0x0500 ? 2 : 5) enum ac_ir_type { @@ -1781,7 +1782,8 @@ static bool ac_eliminate_const_output(uint8_t *vs_output_param_offset, return true; } -static bool ac_eliminate_duplicated_output(uint8_t *vs_output_param_offset, +static bool ac_eliminate_duplicated_output(struct ac_llvm_context *ctx, + uint8_t *vs_output_param_offset, uint32_t num_outputs, struct ac_vs_exports *processed, struct ac_vs_exp_inst *exp) @@ -1833,6 +1835,10 @@ static bool ac_eliminate_duplicated_output(uint8_t *vs_output_param_offset, */ struct ac_vs_exp_inst *match = &processed->exp[p]; + /* Get current enabled channels mask. */ + LLVMValueRef arg = LLVMGetOperand(match->inst, AC_EXP_ENABLED_CHANNELS); + unsigned enabled_channels = LLVMConstIntGetZExtValue(arg); + while (copy_back_channels) { unsigned chan = u_bit_scan(©_back_channels); @@ -1840,6 +1846,13 @@ static bool ac_eliminate_duplicated_output(uint8_t *vs_output_param_offset, LLVMSetOperand(match->inst, AC_EXP_OUT0 + chan, exp->chan[chan].value); match->chan[chan] = exp->chan[chan]; + + /* Update number of enabled channels because the original mask + * is not always 0xf. + */ + enabled_channels |= (1 << chan); + LLVMSetOperand(match->inst, AC_EXP_ENABLED_CHANNELS, + LLVMConstInt(ctx->i32, enabled_channels, 0)); } /* The PARAM export is duplicated. Kill it. */ @@ -1927,7 +1940,8 @@ void ac_optimize_vs_outputs(struct ac_llvm_context *ctx, /* Eliminate constant and duplicated PARAM exports. */ if (ac_eliminate_const_output(vs_output_param_offset, num_outputs, &exp) || - ac_eliminate_duplicated_output(vs_output_param_offset, + ac_eliminate_duplicated_output(ctx, + vs_output_param_offset, num_outputs, &exports, &exp)) { removed_any = true; -- 2.16.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev