nv50: primitive restart trick for vertex data through FIFO mode
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 2 Mar 2011 19:48:20 +0000 (20:48 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 2 Mar 2011 19:59:54 +0000 (20:59 +0100)
Also, on nv50 the VERTEX_BEGIN method doesn't follow VERTEX_END,
which was erroneously taken over from nvc0 and is fixed now.

src/gallium/drivers/nv50/nv50_push.c

index 71b5995a4f873a4bd4e0f2b747fb6af31b2da301..e8ad1ddd38a42bb9e14b99b49c6137dbdd5d0c58 100644 (file)
@@ -86,10 +86,8 @@ emit_vertices_i08(struct push_context *ctx, unsigned start, unsigned count)
       if (nr != push) {
          count--;
          elts++;
-         BEGIN_RING(ctx->chan, RING_3D(VERTEX_END_GL), 2);
-         OUT_RING  (ctx->chan, 0);
-         OUT_RING  (ctx->chan, NVA0_3D_VERTEX_BEGIN_GL_INSTANCE_CONT |
-                    (ctx->prim & ~NV50_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT));
+         BEGIN_RING(ctx->chan, RING_3D(VB_ELEMENT_U32), 1);
+         OUT_RING  (ctx->chan, ctx->restart_index);
       }
    }
 }
@@ -121,10 +119,8 @@ emit_vertices_i16(struct push_context *ctx, unsigned start, unsigned count)
       if (nr != push) {
          count--;
          elts++;
-         BEGIN_RING(ctx->chan, RING_3D(VERTEX_END_GL), 2);
-         OUT_RING  (ctx->chan, 0);
-         OUT_RING  (ctx->chan, NVA0_3D_VERTEX_BEGIN_GL_INSTANCE_CONT |
-                    (ctx->prim & ~NV50_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT));
+         BEGIN_RING(ctx->chan, RING_3D(VB_ELEMENT_U32), 1);
+         OUT_RING  (ctx->chan, ctx->restart_index);
       }
    }
 }
@@ -156,10 +152,8 @@ emit_vertices_i32(struct push_context *ctx, unsigned start, unsigned count)
       if (nr != push) {
          count--;
          elts++;
-         BEGIN_RING(ctx->chan, RING_3D(VERTEX_END_GL), 2);
-         OUT_RING  (ctx->chan, 0);
-         OUT_RING  (ctx->chan, NVA0_3D_VERTEX_BEGIN_GL_INSTANCE_CONT |
-                    (ctx->prim & ~NV50_3D_VERTEX_BEGIN_GL_INSTANCE_NEXT));
+         BEGIN_RING(ctx->chan, RING_3D(VB_ELEMENT_U32), 1);
+         OUT_RING  (ctx->chan, ctx->restart_index);
       }
    }
 }
@@ -257,6 +251,17 @@ nv50_push_vbo(struct nv50_context *nv50, const struct pipe_draw_info *info)
    ctx.instance_id = info->start_instance;
    ctx.prim = nv50_prim_gl(info->mode);
 
+   if (info->primitive_restart) {
+      BEGIN_RING(ctx.chan, RING_3D(PRIM_RESTART_ENABLE), 2);
+      OUT_RING  (ctx.chan, 1);
+      OUT_RING  (ctx.chan, info->restart_index);
+   } else
+   if (nv50->state.prim_restart) {
+      BEGIN_RING(ctx.chan, RING_3D(PRIM_RESTART_ENABLE), 1);
+      OUT_RING  (ctx.chan, 0);
+   }
+   nv50->state.prim_restart = info->primitive_restart;
+
    while (inst--) {
       BEGIN_RING(ctx.chan, RING_3D(VERTEX_BEGIN_GL), 1);
       OUT_RING  (ctx.chan, ctx.prim);