From 34bc470fa61fd667514a82a412bce310ab9c9653 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 8 May 2017 16:37:26 +0200 Subject: [PATCH] ac: fix broken elimination of duplicated VS exports MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The renumbering code didn't take into account that multiple VS exports can have the same PARAM index. This also significantly simplifies the renumbering. Thankfully, we have piglits for this: spec@arb_gpu_shader5@arb_gpu_shader5-interpolateatcentroid-packing spec@glsl-1.50@execution@interface-blocks-complex-vs-fs Reported by Michel Dänzer. Fixes: b08715499e61 ("ac: eliminate duplicated VS exports") Reviewed-by: Nicolai Hähnle --- src/amd/common/ac_llvm_build.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index 9853d177df5..87a1fb77d85 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1408,30 +1408,30 @@ void ac_optimize_vs_outputs(struct ac_llvm_context *ctx, * This is done by renumbering all PARAM exports. */ if (removed_any) { - uint8_t current_offset[VARYING_SLOT_MAX]; - unsigned new_count = 0; + uint8_t old_offset[VARYING_SLOT_MAX]; unsigned out, i; /* Make a copy of the offsets. We need the old version while * we are modifying some of them. */ - memcpy(current_offset, vs_output_param_offset, - sizeof(current_offset)); + memcpy(old_offset, vs_output_param_offset, + sizeof(old_offset)); for (i = 0; i < exports.num; i++) { unsigned offset = exports.exp[i].offset; + /* Update vs_output_param_offset. Multiple outputs can + * have the same offset. + */ for (out = 0; out < num_outputs; out++) { - if (current_offset[out] != offset) - continue; - - LLVMSetOperand(exports.exp[i].inst, AC_EXP_TARGET, - LLVMConstInt(ctx->i32, - V_008DFC_SQ_EXP_PARAM + new_count, 0)); - vs_output_param_offset[out] = new_count; - new_count++; - break; + if (old_offset[out] == offset) + vs_output_param_offset[out] = i; } + + /* Change the PARAM offset in the instruction. */ + LLVMSetOperand(exports.exp[i].inst, AC_EXP_TARGET, + LLVMConstInt(ctx->i32, + V_008DFC_SQ_EXP_PARAM + i, 0)); } - *num_param_exports = new_count; + *num_param_exports = exports.num; } } -- 2.30.2