nv40: vp const/immd fix
authorBen Skeggs <skeggsb@gmail.com>
Sun, 30 Mar 2008 09:00:07 +0000 (19:00 +1000)
committerBen Skeggs <skeggsb@gmail.com>
Sun, 30 Mar 2008 09:57:18 +0000 (19:57 +1000)
src/gallium/drivers/nv40/nv40_vertprog.c

index e5ce894375267d7a82f114f76e61e3381d5a2807..41885b9d4a52b06d09164033876e02a21c34286b 100644 (file)
@@ -328,7 +328,7 @@ nv40_vertprog_parse_instruction(struct nv40_vpc *vpc,
        struct nv40_sreg src[3], dst, tmp;
        struct nv40_sreg none = nv40_sr(NV40SR_NONE, 0);
        int mask;
-       int ai = -1, ci = -1;
+       int ai = -1, ci = -1, ii = -1;
        int i;
 
        if (finst->Instruction.Opcode == TGSI_OPCODE_END)
@@ -358,12 +358,9 @@ nv40_vertprog_parse_instruction(struct nv40_vpc *vpc,
                                      tgsi_src(vpc, fsrc), none, none);
                        }
                        break;
-               /*XXX: index comparison is broken now that consts come from
-                *     two different register files.
-                */
                case TGSI_FILE_CONSTANT:
-               case TGSI_FILE_IMMEDIATE:
-                       if (ci == -1 || ci == fsrc->SrcRegister.Index) {
+                       if ((ci == -1 && ii == -1) ||
+                           ci == fsrc->SrcRegister.Index) {
                                ci = fsrc->SrcRegister.Index;
                                src[i] = tgsi_src(vpc, fsrc);
                        } else {
@@ -372,6 +369,17 @@ nv40_vertprog_parse_instruction(struct nv40_vpc *vpc,
                                      tgsi_src(vpc, fsrc), none, none);
                        }
                        break;
+               case TGSI_FILE_IMMEDIATE:
+                       if ((ci == -1 && ii == -1) ||
+                           ii == fsrc->SrcRegister.Index) {
+                               ii = fsrc->SrcRegister.Index;
+                               src[i] = tgsi_src(vpc, fsrc);
+                       } else {
+                               src[i] = temp(vpc);
+                               arith(vpc, 0, OP_MOV, src[i], MASK_ALL,
+                                     tgsi_src(vpc, fsrc), none, none);
+                       }
+                       break;
                case TGSI_FILE_TEMPORARY:
                        /* handled above */
                        break;