nv50: make MRTs work
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 31 Oct 2009 10:25:48 +0000 (11:25 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 31 Oct 2009 12:40:33 +0000 (13:40 +0100)
We have to indicate to the hw whether the FP exports
multiple colour results.
Method 0x121c is used to specify the number of RTs.
Also deactivate zeta explicitly if there's no zsbuf.

src/gallium/drivers/nv50/nv50_program.c
src/gallium/drivers/nv50/nv50_state_validate.c

index 9ccc4f5a161701b956af0fc943940913d05aae1f..c3edc02cb512868b7b6ad5ae4659485311a0d8ca 100644 (file)
@@ -2644,6 +2644,10 @@ nv50_program_tx_prep(struct nv50_pc *pc)
                        pc->result[2].rhw = rid;
 
                p->cfg.high_result = rid;
+
+               /* separate/different colour results for MRTs ? */
+               if (pc->result_nr - (p->info.writes_z ? 1 : 0) > 1)
+                       p->cfg.regs[2] |= 1;
        }
 
        if (pc->immd_nr) {
index 956a70061541429f19b3ed4c3af155c210987a2c..a13d64b7fa76e4e304ea2149208f09ded154aa65 100644 (file)
@@ -37,6 +37,14 @@ nv50_state_validate_fb(struct nv50_context *nv50)
        struct pipe_framebuffer_state *fb = &nv50->framebuffer;
        unsigned i, w, h, gw = 0;
 
+       /* Set nr of active RTs. Don't know what 0xfac6880 does, but
+        * at least 0x880 was required to draw to more than 1 RT.
+        * In some special cases, 0xfac6880 is not used, we probably
+        * don't hit any of these though.
+        */
+       so_method(so, tesla, 0x121c, 1);
+       so_data  (so, 0x0fac6880 | fb->nr_cbufs);
+
        for (i = 0; i < fb->nr_cbufs; i++) {
                struct pipe_texture *pt = fb->cbufs[i]->texture;
                struct nouveau_bo *bo = nv50_miptree(pt)->base.bo;
@@ -121,6 +129,9 @@ nv50_state_validate_fb(struct nv50_context *nv50)
                so_data  (so, fb->zsbuf->width);
                so_data  (so, fb->zsbuf->height);
                so_data  (so, 0x00010001);
+       } else {
+               so_method(so, tesla, 0x1538, 1);
+               so_data  (so, 0);
        }
 
        so_method(so, tesla, NV50TCL_VIEWPORT_HORIZ, 2);