nv50: fix segfault when there's gaps in enabled texture units
authorBen Skeggs <bskeggs@redhat.com>
Tue, 6 Oct 2009 03:55:48 +0000 (13:55 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Tue, 6 Oct 2009 03:57:51 +0000 (13:57 +1000)
Tested with progs/demos/multiarb.

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

index 867b1ea..fd27620 100644 (file)
@@ -356,13 +356,16 @@ viewport_uptodate:
        if (nv50->dirty & NV50_NEW_SAMPLER) {
                int i;
 
-               so = so_new(nv50->sampler_nr * 8 + 3, 0);
+               so = so_new(nv50->sampler_nr * 9 + 2, 0);
                so_method(so, tesla, NV50TCL_CB_ADDR, 1);
                so_data  (so, NV50_CB_TSC);
-               so_method(so, tesla, NV50TCL_CB_DATA(0) | 0x40000000,
-                       nv50->sampler_nr * 8);
-               for (i = 0; i < nv50->sampler_nr; i++)
+               for (i = 0; i < nv50->sampler_nr; i++) {
+                       if (!nv50->sampler[i])
+                               continue;
+
+                       so_method(so, tesla, NV50TCL_CB_DATA(0) | (2<<29), 8);
                        so_datap (so, nv50->sampler[i]->tsc, 8);
+               }
                so_ref(so, &nv50->state.tsc_upload);
                so_ref(NULL, &so);
        }
index 21825a0..72d3315 100644 (file)
@@ -157,6 +157,9 @@ nv50_tex_validate(struct nv50_context *nv50)
        for (unit = 0; unit < nv50->miptree_nr; unit++) {
                struct nv50_miptree *mt = nv50->miptree[unit];
 
+               if (!mt)
+                       continue;
+
                so_method(so, tesla, NV50TCL_CB_DATA(0) | 0x40000000, 8);
                if (nv50_tex_construct(nv50, so, mt, unit)) {
                        NOUVEAU_ERR("failed tex validate\n");