nv50: fix IB index buffer path
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 2 Mar 2011 21:36:22 +0000 (22:36 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 2 Mar 2011 21:37:56 +0000 (22:37 +0100)
Add missing VERTEX_END and treat unaligned offsets correctly.

src/gallium/drivers/nv50/nv50_vbo.c

index 85cf9bd8a611e8d071e020114ae5712bc2dbc449..4f0a5018459e982db85ca6e6ee63b8abd79326a1 100644 (file)
@@ -538,7 +538,8 @@ nv50_draw_elements(struct nv50_context *nv50, boolean shorten,
 
    if (nouveau_resource_mapped_by_gpu(nv50->idxbuf.buffer)) {
       struct nv04_resource *res = nv04_resource(nv50->idxbuf.buffer);
-      unsigned offset = res->offset + nv50->idxbuf.offset;
+
+      start += nv50->idxbuf.offset >> (index_size >> 1);
 
       nouveau_buffer_adjust_score(&nv50->base, res, 1);
 
@@ -552,9 +553,8 @@ nv50_draw_elements(struct nv50_context *nv50, boolean shorten,
             WAIT_RING (chan, 2);
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U32) | 0x30000, 0);
             OUT_RING  (chan, count);
-            nouveau_pushbuf_submit(chan, res->bo,
-                                   (start << 2) + offset,
-                                   (count << 2));
+            nouveau_pushbuf_submit(chan, res->bo, res->offset + start * 4,
+                                   count * 4);
          }
             break;
          case 2:
@@ -564,10 +564,11 @@ nv50_draw_elements(struct nv50_context *nv50, boolean shorten,
 
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U16_SETUP), 1);
             OUT_RING  (chan, (start << 31) | count);
+            WAIT_RING (chan, 2);
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U16) | 0x30000, 0);
             OUT_RING  (chan, pb_words);
-            nouveau_pushbuf_submit(chan, res->bo,
-                                   (pb_start << 1) + offset, pb_words << 2);
+            nouveau_pushbuf_submit(chan, res->bo, res->offset + pb_start * 2,
+                                   pb_words * 4);
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U16_SETUP), 1);
             OUT_RING  (chan, 0);
             break;
@@ -579,10 +580,11 @@ nv50_draw_elements(struct nv50_context *nv50, boolean shorten,
 
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U8_SETUP), 1);
             OUT_RING  (chan, (start << 30) | count);
+            WAIT_RING (chan, 2);
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U8) | 0x30000, 0);
             OUT_RING  (chan, pb_words);
-            nouveau_pushbuf_submit(chan, res->bo,
-                                   pb_start + offset, pb_words << 2);
+            nouveau_pushbuf_submit(chan, res->bo, res->offset + pb_start,
+                                   pb_words * 4);
             BEGIN_RING(chan, RING_3D(VB_ELEMENT_U8_SETUP), 1);
             OUT_RING  (chan, 0);
             break;
@@ -591,6 +593,8 @@ nv50_draw_elements(struct nv50_context *nv50, boolean shorten,
             assert(0);
             return;
          }
+         BEGIN_RING(chan, RING_3D(VERTEX_END_GL), 1);
+         OUT_RING  (chan, 0);
 
          nv50_resource_fence(res, NOUVEAU_BO_RD);