nv50: make MRTs work

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.
This commit is contained in:
Christoph Bumiller 2009-10-31 11:25:48 +01:00
parent 73b45b0669
commit 525f529d13
2 changed files with 15 additions and 0 deletions

View 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) {

View 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);