nv40: fp: fix multiple refs to a single const withing an instruction
authorBen Skeggs <skeggsb@gmail.com>
Sun, 23 Mar 2008 05:26:42 +0000 (16:26 +1100)
committerBen Skeggs <skeggsb@gmail.com>
Sun, 23 Mar 2008 05:26:42 +0000 (16:26 +1100)
src/gallium/drivers/nv40/nv40_fragprog.c

index 4e425366985f4d446d31bd62a17ffb45f22e6bd9..4cdbf962ab417746d6c7adf42313198a372eac9b 100644 (file)
@@ -41,6 +41,7 @@ struct nv40_fpc {
        uint colour_id;
 
        unsigned inst_offset;
+       unsigned have_const;
 
        struct {
                int pipe;
@@ -113,7 +114,11 @@ emit_src(struct nv40_fpc *fpc, int pos, struct nv40_sreg src)
                sr |= (src.index << NV40_FP_REG_SRC_SHIFT);
                break;
        case NV40SR_CONST:
-               grow_insns(fpc, 4);
+               if (!fpc->have_const) {
+                       grow_insns(fpc, 4);
+                       fpc->have_const = 1;
+               }
+
                hw = &fp->insn[fpc->inst_offset];
                if (fpc->consts[src.index].pipe >= 0) {
                        struct nv40_fragment_program_data *fpd;
@@ -190,6 +195,7 @@ nv40_fp_arith(struct nv40_fpc *fpc, int sat, int op,
        uint32_t *hw;
 
        fpc->inst_offset = fp->insn_len;
+       fpc->have_const = 0;
        grow_insns(fpc, 4);
        hw = &fp->insn[fpc->inst_offset];
        memset(hw, 0, sizeof(uint32_t) * 4);