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
spec@glsl-1.50@execution@interface-blocks-complex-vs-fs
Reported by Michel Dänzer.
Fixes: b08715499e ("ac: eliminate duplicated VS exports")
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user