nv50: fix handling of FragCoord input
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 24 Jan 2010 13:22:41 +0000 (14:22 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 24 Jan 2010 14:17:57 +0000 (15:17 +0100)
src/gallium/drivers/nv50/nv50_program.c

index 20db51070ffa8802ea8c8d55a3d1efed1a1cbc91..cd2fd0a076e42d5efc369a3671b242279da6785c 100644 (file)
@@ -3728,13 +3728,21 @@ nv50_program_tx_prep(struct nv50_pc *pc)
                copy_semantic_info(p);
        } else
        if (p->type == PIPE_SHADER_FRAGMENT) {
-               int rid, aid, base;
+               int rid, aid;
                unsigned n = 0, m = pc->attr_nr - flat_nr;
 
                pc->allow32 = TRUE;
 
-               base = (TGSI_SEMANTIC_POSITION ==
-                       p->info.input_semantic_name[0]) ? 0 : 1;
+               /* do we read FragCoord ? */
+               if (pc->attr_nr &&
+                   p->info.input_semantic_name[0] == TGSI_SEMANTIC_POSITION) {
+                       /* select FCRD components we want accessible */
+                       for (c = 0; c < 4; ++c)
+                               if (pc->attr[c].acc)
+                                       p->cfg.regs[1] |= 1 << (24 + c);
+                       aid = 0;
+               } else /* offset by 1 if FCRD.w is needed for pinterp */
+                       aid = popcnt4(p->cfg.regs[1] >> 24);
 
                /* non-flat interpolants have to be mapped to
                 * the lower hardware IDs, so sort them:
@@ -3750,12 +3758,6 @@ nv50_program_tx_prep(struct nv50_pc *pc)
                }
                copy_semantic_info(p);
 
-               if (!base) /* set w-coordinate mask from perspective interp */
-                       p->cfg.in[0].mask |= p->cfg.regs[1] >> 24;
-
-               aid = popcnt4( /* if fcrd isn't contained in cfg.io */
-                       base ? (p->cfg.regs[1] >> 24) : p->cfg.in[0].mask);
-
                for (n = 0; n < pc->attr_nr; ++n) {
                        p->cfg.in[n].hw = rid = aid;
                        i = p->cfg.in[n].id;
@@ -3777,9 +3779,6 @@ nv50_program_tx_prep(struct nv50_pc *pc)
                        aid += popcnt4(p->cfg.in[n].mask);
                }
 
-               if (!base)
-                       p->cfg.regs[1] |= p->cfg.in[0].mask << 24;
-
                m = popcnt4(p->cfg.regs[1] >> 24);
 
                /* set count of non-position inputs and of non-flat