diff options
author | Marek Olšák <[email protected]> | 2017-05-08 16:37:26 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-05-08 19:18:29 +0200 |
commit | 34bc470fa61fd667514a82a412bce310ab9c9653 (patch) | |
tree | 25af0f7768af3b1a66c910368bef7e0bd535c260 /src/amd | |
parent | 0160fb1d50d314b9de496d49475a33ddff0f5702 (diff) |
ac: fix broken elimination of duplicated VS exports
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
[email protected]@execution@interface-blocks-complex-vs-fs
Reported by Michel Dänzer.
Fixes: b08715499e61 ("ac: eliminate duplicated VS exports")
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 28 |
1 files 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; } } |