From: Marek Olšák <[email protected]>

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.
---
 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;
        }
 }
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to