nvc0: fix primitive restart in immediate mode
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 8 Jan 2011 13:24:14 +0000 (14:24 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 8 Jan 2011 13:25:20 +0000 (14:25 +0100)
src/gallium/drivers/nvc0/nvc0_push.c
src/gallium/drivers/nvc0/nvc0_vbo.c

index ccbb776447f993e50eb02c6c3e094a543ba8b3ec..941be6785867baa46f6ebeaa96a38088edef4207 100644 (file)
@@ -75,13 +75,15 @@ emit_vertices_i08(struct push_context *ctx, unsigned start, unsigned count)
 
       BEGIN_RING_NI(ctx->chan, RING_3D(VERTEX_DATA), size);
 
-      ctx->translate->run_elts8(ctx->translate, elts, push, 0, ctx->chan->cur);
+      ctx->translate->run_elts8(ctx->translate, elts, nr, 0, ctx->chan->cur);
 
       ctx->chan->cur += size;
-      count -= push;
-      elts += push;
+      count -= nr;
+      elts += nr;
 
       if (nr != push) {
+         count--;
+         elts++;
          BEGIN_RING(ctx->chan, RING_3D(VERTEX_END_GL), 2);
          OUT_RING  (ctx->chan, 0);
          OUT_RING  (ctx->chan, ctx->prim);
@@ -106,13 +108,15 @@ emit_vertices_i16(struct push_context *ctx, unsigned start, unsigned count)
 
       BEGIN_RING_NI(ctx->chan, RING_3D(VERTEX_DATA), size);
 
-      ctx->translate->run_elts16(ctx->translate, elts, push, 0, ctx->chan->cur);
+      ctx->translate->run_elts16(ctx->translate, elts, nr, 0, ctx->chan->cur);
 
       ctx->chan->cur += size;
-      count -= push;
-      elts += push;
+      count -= nr;
+      elts += nr;
 
       if (nr != push) {
+         count--;
+         elts++;
          BEGIN_RING(ctx->chan, RING_3D(VERTEX_END_GL), 2);
          OUT_RING  (ctx->chan, 0);
          OUT_RING  (ctx->chan, ctx->prim);
@@ -137,13 +141,15 @@ emit_vertices_i32(struct push_context *ctx, unsigned start, unsigned count)
 
       BEGIN_RING_NI(ctx->chan, RING_3D(VERTEX_DATA), size);
 
-      ctx->translate->run_elts(ctx->translate, elts, push, 0, ctx->chan->cur);
+      ctx->translate->run_elts(ctx->translate, elts, nr, 0, ctx->chan->cur);
 
       ctx->chan->cur += size;
-      count -= push;
-      elts += push;
+      count -= nr;
+      elts += nr;
 
       if (nr != push) {
+         count--;
+         elts++;
          BEGIN_RING(ctx->chan, RING_3D(VERTEX_END_GL), 2);
          OUT_RING  (ctx->chan, 0);
          OUT_RING  (ctx->chan, ctx->prim);
index 881f0655506a23d5a46bdc7f4355fc8976521bc1..fd7a7942cb83aef20512b2d7f06c79b9a5efac45 100644 (file)
@@ -584,6 +584,9 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
       if (info->primitive_restart) {
          BEGIN_RING(chan, RING_3D(PRIM_RESTART_INDEX), 1);
          OUT_RING  (chan, info->restart_index);
+
+         if (info->restart_index > 65535)
+            shorten = FALSE;
       }
 
       nvc0_draw_elements(nvc0, shorten,