nv40: catch fp extra-const cases where both const and immd have same idx
authorBen Skeggs <skeggsb@gmail.com>
Sun, 23 Mar 2008 05:31:31 +0000 (16:31 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Sun, 23 Mar 2008 05:32:00 +0000 (16:32 +1100)
src/gallium/drivers/nv40/nv40_fragprog.c

index 4cdbf962ab417746d6c7adf42313198a372eac9b..c854ae89f74548669e0171863e80157a82ec224f 100644 (file)
@@ -384,7 +384,7 @@ nv40_fragprog_parse_instruction(struct nv40_fpc *fpc,
        const struct nv40_sreg none = nv40_sr(NV40SR_NONE, 0);
        struct nv40_sreg src[3], dst, tmp;
        int mask, sat, unit;
-       int ai = -1, ci = -1;
+       int ai = -1, ci = -1, ii = -1;
        int i;
 
        if (finst->Instruction.Opcode == TGSI_OPCODE_END)
@@ -428,8 +428,8 @@ nv40_fragprog_parse_instruction(struct nv40_fpc *fpc,
                        }
                        break;
                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(fpc, fsrc);
                        } else {
@@ -438,6 +438,17 @@ nv40_fragprog_parse_instruction(struct nv40_fpc *fpc,
                                      tgsi_src(fpc, 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(fpc, fsrc);
+                       } else {
+                               src[i] = temp(fpc);
+                               arith(fpc, 0, MOV, src[i], MASK_ALL,
+                                     tgsi_src(fpc, fsrc), none, none);
+                       }
+                       break;
                case TGSI_FILE_TEMPORARY:
                        /* handled above */
                        break;