nv50: add support for light-twoside
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Mon, 14 Sep 2009 18:52:52 +0000 (20:52 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 15 Sep 2009 10:13:23 +0000 (12:13 +0200)
src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_state.c

index 7bc8e13d2adf16d0f639c8dbcc61a4f2425f0628..8b17ccf1e2159881c237b5bd4e0c909a1ec3e13c 100644 (file)
@@ -2051,6 +2051,11 @@ nv50_program_tx_prep(struct nv50_pc *pc)
 
                                si = d->Semantic.SemanticIndex;
                                switch (d->Semantic.SemanticName) {
+                               case TGSI_SEMANTIC_BCOLOR:
+                                       p->cfg.two_side[si].hw = first;
+                                       if (p->cfg.io_nr > first)
+                                               p->cfg.io_nr = first;
+                                       break;
                                        /*
                                case TGSI_SEMANTIC_CLIP_DISTANCE:
                                        p->cfg.clpd = MIN2(p->cfg.clpd, first);
@@ -2128,6 +2133,11 @@ nv50_program_tx_prep(struct nv50_pc *pc)
                                p->cfg.io[i].mask |= 1 << c;
                        }
                }
+
+               for (c = 0; c < 2; ++c)
+                       if (p->cfg.two_side[c].hw < 0x40)
+                               p->cfg.two_side[c] = p->cfg.io[
+                                       p->cfg.two_side[c].hw];
        } else
        if (p->type == PIPE_SHADER_FRAGMENT) {
                int rid, aid;
@@ -2741,6 +2751,15 @@ nv50_linkage_validate(struct nv50_context *nv50)
        }
 
        reg[0] |= m << 8; /* adjust BFC0 id */
+
+       /* if light_twoside is active, it seems FFC0_ID == BFC0_ID is bad */
+       if (nv50->rasterizer->pipe.light_twoside) {
+               vpo = &vp->cfg.two_side[0];
+
+               m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[0], &vpo[0]);
+               m = nv50_sreg4_map(map, m, lin, &fp->cfg.two_side[1], &vpo[1]);
+       }
+
        reg[0] += m - 4; /* adjust FFC0 id */
        reg[4] |= m << 8; /* set mid where 'normal' FP inputs start */
 
index 4283808ed93e8476581ff353bd1dea1a17464eee..1de60fed6ecede2c821359c384878bd2e3ead701 100644 (file)
@@ -276,6 +276,9 @@ nv50_rasterizer_state_create(struct pipe_context *pipe,
        so_method(so, tesla, 0x1684, 1);
        so_data  (so, cso->flatshade_first ? 0 : 1);
 
+       so_method(so, tesla, NV50TCL_VERTEX_TWO_SIDE_ENABLE, 1);
+       so_data  (so, cso->light_twoside);
+
        so_method(so, tesla, NV50TCL_LINE_WIDTH, 1);
        so_data  (so, fui(cso->line_width));
        so_method(so, tesla, NV50TCL_LINE_SMOOTH_ENABLE, 1);