Merge remote branch 'origin/master' into lp-binning
[mesa.git] / src / gallium / drivers / nv30 / nv30_vbo.c
index 0e620b67a28536bd85e6be40e61fcd6e47f51553..1c5db03ea240293c420d95740cfa3a34a8d56941 100644 (file)
@@ -168,7 +168,9 @@ nv30_draw_arrays(struct pipe_context *pipe,
                 unsigned mode, unsigned start, unsigned count)
 {
        struct nv30_context *nv30 = nv30_context(pipe);
-       struct nouveau_channel *chan = nv30->screen->base.channel;
+       struct nv30_screen *screen = nv30->screen;
+       struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *rankine = screen->rankine;
        unsigned restart = 0;
 
        nv30_vbo_set_idxbuf(nv30, NULL, 0);
@@ -186,17 +188,17 @@ nv30_draw_arrays(struct pipe_context *pipe,
                vc = nouveau_vbuf_split(chan->pushbuf->remaining, 6, 256,
                                        mode, start, count, &restart);
                if (!vc) {
-                       FIRE_RING(NULL);
+                       FIRE_RING(chan);
                        continue;
                }
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (nvgl_primitive(mode));
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, nvgl_primitive(mode));
 
                nr = (vc & 0xff);
                if (nr) {
-                       BEGIN_RING(rankine, NV34TCL_VB_VERTEX_BATCH, 1);
-                       OUT_RING  (((nr - 1) << 24) | start);
+                       BEGIN_RING(chan, rankine, NV34TCL_VB_VERTEX_BATCH, 1);
+                       OUT_RING  (chan, ((nr - 1) << 24) | start);
                        start += nr;
                }
 
@@ -206,15 +208,15 @@ nv30_draw_arrays(struct pipe_context *pipe,
 
                        nr -= push;
 
-                       BEGIN_RING_NI(rankine, NV34TCL_VB_VERTEX_BATCH, push);
+                       BEGIN_RING_NI(chan, rankine, NV34TCL_VB_VERTEX_BATCH, push);
                        while (push--) {
-                               OUT_RING(((0x100 - 1) << 24) | start);
+                               OUT_RING(chan, ((0x100 - 1) << 24) | start);
                                start += 0x100;
                        }
                }
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (0);
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, 0);
 
                count -= vc;
                start = restart;
@@ -228,7 +230,9 @@ static INLINE void
 nv30_draw_elements_u08(struct nv30_context *nv30, void *ib,
                       unsigned mode, unsigned start, unsigned count)
 {
-       struct nouveau_channel *chan = nv30->screen->base.channel;
+       struct nv30_screen *screen = nv30->screen;
+       struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *rankine = screen->rankine;
 
        while (count) {
                uint8_t *elts = (uint8_t *)ib + start;
@@ -239,17 +243,17 @@ nv30_draw_elements_u08(struct nv30_context *nv30, void *ib,
                vc = nouveau_vbuf_split(chan->pushbuf->remaining, 6, 2,
                                        mode, start, count, &restart);
                if (vc == 0) {
-                       FIRE_RING(NULL);
+                       FIRE_RING(chan);
                        continue;
                }
                count -= vc;
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (nvgl_primitive(mode));
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, nvgl_primitive(mode));
 
                if (vc & 1) {
-                       BEGIN_RING(rankine, NV34TCL_VB_ELEMENT_U32, 1);
-                       OUT_RING  (elts[0]);
+                       BEGIN_RING(chan, rankine, NV34TCL_VB_ELEMENT_U32, 1);
+                       OUT_RING  (chan, elts[0]);
                        elts++; vc--;
                }
 
@@ -258,16 +262,16 @@ nv30_draw_elements_u08(struct nv30_context *nv30, void *ib,
 
                        push = MIN2(vc, 2047 * 2);
 
-                       BEGIN_RING_NI(rankine, NV34TCL_VB_ELEMENT_U16, push >> 1);
+                       BEGIN_RING_NI(chan, rankine, NV34TCL_VB_ELEMENT_U16, push >> 1);
                        for (i = 0; i < push; i+=2)
-                               OUT_RING((elts[i+1] << 16) | elts[i]);
+                               OUT_RING(chan, (elts[i+1] << 16) | elts[i]);
 
                        vc -= push;
                        elts += push;
                }
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (0);
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, 0);
 
                start = restart;
        }
@@ -277,7 +281,9 @@ static INLINE void
 nv30_draw_elements_u16(struct nv30_context *nv30, void *ib,
                       unsigned mode, unsigned start, unsigned count)
 {
-       struct nouveau_channel *chan = nv30->screen->base.channel;
+       struct nv30_screen *screen = nv30->screen;
+       struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *rankine = screen->rankine;
 
        while (count) {
                uint16_t *elts = (uint16_t *)ib + start;
@@ -288,17 +294,17 @@ nv30_draw_elements_u16(struct nv30_context *nv30, void *ib,
                vc = nouveau_vbuf_split(chan->pushbuf->remaining, 6, 2,
                                        mode, start, count, &restart);
                if (vc == 0) {
-                       FIRE_RING(NULL);
+                       FIRE_RING(chan);
                        continue;
                }
                count -= vc;
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (nvgl_primitive(mode));
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, nvgl_primitive(mode));
 
                if (vc & 1) {
-                       BEGIN_RING(rankine, NV34TCL_VB_ELEMENT_U32, 1);
-                       OUT_RING  (elts[0]);
+                       BEGIN_RING(chan, rankine, NV34TCL_VB_ELEMENT_U32, 1);
+                       OUT_RING  (chan, elts[0]);
                        elts++; vc--;
                }
 
@@ -307,16 +313,16 @@ nv30_draw_elements_u16(struct nv30_context *nv30, void *ib,
 
                        push = MIN2(vc, 2047 * 2);
 
-                       BEGIN_RING_NI(rankine, NV34TCL_VB_ELEMENT_U16, push >> 1);
+                       BEGIN_RING_NI(chan, rankine, NV34TCL_VB_ELEMENT_U16, push >> 1);
                        for (i = 0; i < push; i+=2)
-                               OUT_RING((elts[i+1] << 16) | elts[i]);
+                               OUT_RING(chan, (elts[i+1] << 16) | elts[i]);
 
                        vc -= push;
                        elts += push;
                }
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (0);
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, 0);
 
                start = restart;
        }
@@ -326,7 +332,9 @@ static INLINE void
 nv30_draw_elements_u32(struct nv30_context *nv30, void *ib,
                       unsigned mode, unsigned start, unsigned count)
 {
-       struct nouveau_channel *chan = nv30->screen->base.channel;
+       struct nv30_screen *screen = nv30->screen;
+       struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *rankine = screen->rankine;
 
        while (count) {
                uint32_t *elts = (uint32_t *)ib + start;
@@ -337,26 +345,26 @@ nv30_draw_elements_u32(struct nv30_context *nv30, void *ib,
                vc = nouveau_vbuf_split(chan->pushbuf->remaining, 5, 1,
                                        mode, start, count, &restart);
                if (vc == 0) {
-                       FIRE_RING(NULL);
+                       FIRE_RING(chan);
                        continue;
                }
                count -= vc;
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (nvgl_primitive(mode));
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, nvgl_primitive(mode));
 
                while (vc) {
                        push = MIN2(vc, 2047);
 
-                       BEGIN_RING_NI(rankine, NV34TCL_VB_ELEMENT_U32, push);
-                       OUT_RINGp    (elts, push);
+                       BEGIN_RING_NI(chan, rankine, NV34TCL_VB_ELEMENT_U32, push);
+                       OUT_RINGp    (chan, elts, push);
 
                        vc -= push;
                        elts += push;
                }
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (0);
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, 0);
 
                start = restart;
        }
@@ -400,7 +408,9 @@ nv30_draw_elements_vbo(struct pipe_context *pipe,
                       unsigned mode, unsigned start, unsigned count)
 {
        struct nv30_context *nv30 = nv30_context(pipe);
-       struct nouveau_channel *chan = nv30->screen->base.channel;
+       struct nv30_screen *screen = nv30->screen;
+       struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *rankine = screen->rankine;
        unsigned restart = 0;
 
        while (count) {
@@ -411,17 +421,17 @@ nv30_draw_elements_vbo(struct pipe_context *pipe,
                vc = nouveau_vbuf_split(chan->pushbuf->remaining, 6, 256,
                                        mode, start, count, &restart);
                if (!vc) {
-                       FIRE_RING(NULL);
+                       FIRE_RING(chan);
                        continue;
                }
                
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (nvgl_primitive(mode));
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, nvgl_primitive(mode));
 
                nr = (vc & 0xff);
                if (nr) {
-                       BEGIN_RING(rankine, NV34TCL_VB_INDEX_BATCH, 1);
-                       OUT_RING  (((nr - 1) << 24) | start);
+                       BEGIN_RING(chan, rankine, NV34TCL_VB_INDEX_BATCH, 1);
+                       OUT_RING  (chan, ((nr - 1) << 24) | start);
                        start += nr;
                }
 
@@ -431,15 +441,15 @@ nv30_draw_elements_vbo(struct pipe_context *pipe,
 
                        nr -= push;
 
-                       BEGIN_RING_NI(rankine, NV34TCL_VB_INDEX_BATCH, push);
+                       BEGIN_RING_NI(chan, rankine, NV34TCL_VB_INDEX_BATCH, push);
                        while (push--) {
-                               OUT_RING(((0x100 - 1) << 24) | start);
+                               OUT_RING(chan, ((0x100 - 1) << 24) | start);
                                start += 0x100;
                        }
                }
 
-               BEGIN_RING(rankine, NV34TCL_VERTEX_BEGIN_END, 1);
-               OUT_RING  (0);
+               BEGIN_RING(chan, rankine, NV34TCL_VERTEX_BEGIN_END, 1);
+               OUT_RING  (chan, 0);
 
                count -= vc;
                start = restart;
@@ -481,9 +491,9 @@ nv30_vbo_validate(struct nv30_context *nv30)
        unsigned vb_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART | NOUVEAU_BO_RD;
        int hw;
 
-       vtxbuf = so_new(20, 18);
+       vtxbuf = so_new(3, 17, 18);
        so_method(vtxbuf, rankine, NV34TCL_VTXBUF_ADDRESS(0), nv30->vtxelt_nr);
-       vtxfmt = so_new(17, 0);
+       vtxfmt = so_new(1, 16, 0);
        so_method(vtxfmt, rankine, NV34TCL_VTXFMT(0), nv30->vtxelt_nr);
 
        for (hw = 0; hw < nv30->vtxelt_nr; hw++) {
@@ -496,7 +506,7 @@ nv30_vbo_validate(struct nv30_context *nv30)
 
                if (!vb->stride) {
                        if (!sattr)
-                               sattr = so_new(16 * 5, 0);
+                               sattr = so_new(16, 16 * 4, 0);
 
                        if (nv30_vbo_static_attrib(nv30, sattr, hw, ve, vb)) {
                                so_data(vtxbuf, 0);