summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nv50/nv50_tex.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2009-06-06 14:00:45 +1000
committerBen Skeggs <bskeggs@redhat.com>2009-06-06 16:24:09 +1000
commitf1edfa09ea50e8833ddbf241da4d36fd38685e9d (patch)
tree6ebb2c0fe19bb57d86f0f03dea497340424240c5 /src/gallium/drivers/nv50/nv50_tex.c
parent6c1627a51c237428a79613fcda1412c4660780de (diff)
nv50: fix multi-texturing
Diffstat (limited to 'src/gallium/drivers/nv50/nv50_tex.c')
-rw-r--r--src/gallium/drivers/nv50/nv50_tex.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gallium/drivers/nv50/nv50_tex.c b/src/gallium/drivers/nv50/nv50_tex.c
index 8f553f5346..ff40c2ad81 100644
--- a/src/gallium/drivers/nv50/nv50_tex.c
+++ b/src/gallium/drivers/nv50/nv50_tex.c
@@ -139,23 +139,35 @@ nv50_tex_validate(struct nv50_context *nv50)
{
struct nouveau_grobj *tesla = nv50->screen->tesla;
struct nouveau_stateobj *so;
- int unit;
+ int unit, push;
- so = so_new(nv50->miptree_nr * 8 + 3, nv50->miptree_nr * 2);
+ push = nv50->miptree_nr * 9 + 2;
+ push += MAX2(nv50->miptree_nr, nv50->state.miptree_nr) * 2;
+
+ so = so_new(push, nv50->miptree_nr * 2);
so_method(so, tesla, 0x0f00, 1);
so_data (so, NV50_CB_TIC);
- so_method(so, tesla, 0x40000f04, nv50->miptree_nr * 8);
for (unit = 0; unit < nv50->miptree_nr; unit++) {
struct nv50_miptree *mt = nv50->miptree[unit];
+ so_method(so, tesla, 0x40000f04, 8);
if (nv50_tex_construct(nv50, so, mt, unit)) {
NOUVEAU_ERR("failed tex validate\n");
so_ref(NULL, &so);
return;
}
+
+ so_method(so, tesla, 0x1458, 1);
+ so_data (so, (unit << 9) | (unit << 1) | 1);
+ }
+
+ for (; unit < nv50->state.miptree_nr; unit++) {
+ so_method(so, tesla, 0x1458, 1);
+ so_data (so, (unit << 1) | 0);
}
so_ref(so, &nv50->state.tic_upload);
so_ref(NULL, &so);
+ nv50->state.miptree_nr = nv50->miptree_nr;
}