summaryrefslogtreecommitdiffstats
path: root/src/amd
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-05-08 16:37:26 +0200
committerMarek Olšák <[email protected]>2017-05-08 19:18:29 +0200
commit34bc470fa61fd667514a82a412bce310ab9c9653 (patch)
tree25af0f7768af3b1a66c910368bef7e0bd535c260 /src/amd
parent0160fb1d50d314b9de496d49475a33ddff0f5702 (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.c28
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;
}
}