st/nine: Correctly declare NineTranslateInstruction_Mkxn inputs
authorAxel Davy <axel.davy@ens.fr>
Fri, 26 Dec 2014 08:22:26 +0000 (09:22 +0100)
committerEmil Velikov <emil.l.velikov@gmail.com>
Thu, 22 Jan 2015 22:16:20 +0000 (22:16 +0000)
Let's say we have c1 and c2 declared in the shader and c0 given by the app

Then here we would have read c0, c1 and c2 given by the app, instead
of the correct c0, c1, c2.

This correction fixes several issues in some games.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Axel Davy <axel.davy@ens.fr>
Cc: "10.4" <mesa-stable@lists.freedesktop.org>
src/gallium/state_trackers/nine/nine_shader.c

index 735f56b29f1f59df436d73ac2de977377c4466fc..3a3e6bd43921936587b401dd96ec7bcbb330b779 100644 (file)
@@ -1158,16 +1158,19 @@ NineTranslateInstruction_Mkxn(struct shader_translator *tx, const unsigned k, co
     struct ureg_program *ureg = tx->ureg;
     struct ureg_dst dst;
     struct ureg_src src[2];
+    struct sm1_src_param *src_mat = &tx->insn.src[1];
     unsigned i;
 
     dst = tx_dst_param(tx, &tx->insn.dst[0]);
     src[0] = tx_src_param(tx, &tx->insn.src[0]);
-    src[1] = tx_src_param(tx, &tx->insn.src[1]);
 
-    for (i = 0; i < n; i++, src[1].Index++)
+    for (i = 0; i < n; i++)
     {
         const unsigned m = (1 << i);
 
+        src[1] = tx_src_param(tx, src_mat);
+        src_mat->idx++;
+
         if (!(dst.WriteMask & m))
             continue;