[Mesa-dev] [PATCH 1/2] ac: fix broken elimination of duplicated VS exports
Nicolai Hähnle
nhaehnle at gmail.com
Mon May 8 17:00:11 UTC 2017
On 08.05.2017 18:38, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> 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 at arb_gpu_shader5@arb_gpu_shader5-interpolateatcentroid-packing
> spec at glsl-1.50@execution at interface-blocks-complex-vs-fs
>
> Reported by Michel Dänzer.
That does look cleaner.
Fixes: b08715499e61 ("ac: eliminate duplicated VS exports")
Cc: mesa-stable at lists.freedesktop.org
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
Also R-b for patch #2.
> ---
> 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 9853d17..87a1fb7 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -1401,37 +1401,37 @@ void ac_optimize_vs_outputs(struct ac_llvm_context *ctx,
> exports.exp[exports.num++] = exp;
> }
> }
> bb = LLVMGetNextBasicBlock(bb);
> }
>
> /* Remove holes in export memory due to removed PARAM exports.
> * 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;
> }
> }
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the mesa-dev
mailing list