draw: No need to make max_vertices even.
[mesa.git] / src / gallium / auxiliary / draw / draw_pt_emit.c
index a7917f54b048257be04dcbe1aa6cda69d6bcff2d..89d96c4235fddbd3cd99b6aae6b626f484b49678 100644 (file)
@@ -120,22 +120,21 @@ void draw_pt_emit_prepare( struct pt_emit *emit,
 
    *max_vertices = (draw->render->max_vertex_buffer_bytes / 
                     (vinfo->size * 4));
-
-   /* even number */
-   *max_vertices = *max_vertices & ~1;
 }
 
 
 void draw_pt_emit( struct pt_emit *emit,
-                  const float (*vertex_data)[4],
-                  unsigned vertex_count,
-                  unsigned stride,
-                  const ushort *elts,
-                  unsigned count )
+                         const struct draw_vertex_info *vert_info,
+                         const struct draw_prim_info *prim_info)
 {
+   const float (*vertex_data)[4] = (const float (*)[4])vert_info->verts->data;
+   unsigned vertex_count = vert_info->count;
+   unsigned stride = vert_info->stride;
+   const ushort *elts = prim_info->elts;
    struct draw_context *draw = emit->draw;
    struct translate *translate = emit->translate;
    struct vbuf_render *render = draw->render;
+   unsigned start, i;
    void *hw_verts;
 
    /* XXX: need to flush to get prim_vbuf.c to release its allocation?? 
@@ -171,13 +170,16 @@ void draw_pt_emit( struct pt_emit *emit,
    translate->set_buffer(translate, 
                         0, 
                         vertex_data,
-                        stride );
+                        stride,
+                        ~0);
 
    translate->set_buffer(translate, 
                         1, 
                         &draw->rasterizer->point_size,
-                        0);
+                        0,
+                        ~0);
 
+   /* fetch/translate vertex attribs to fill hw_verts[] */
    translate->run( translate,
                   0, 
                   vertex_count,
@@ -188,23 +190,31 @@ void draw_pt_emit( struct pt_emit *emit,
                            0, 
                            vertex_count - 1 );
 
-   render->draw(render,
-               elts,
-               count);
+   for (start = i = 0;
+        i < prim_info->primitive_count;
+        start += prim_info->primitive_lengths[i], i++)
+   {
+      render->draw_elements(render,
+                            elts + start,
+                            prim_info->primitive_lengths[i]);
+   }
 
    render->release_vertices(render);
 }
 
 
 void draw_pt_emit_linear(struct pt_emit *emit,
-                         const float (*vertex_data)[4],
-                         unsigned stride,
-                         unsigned count)
+                         const struct draw_vertex_info *vert_info,
+                         const struct draw_prim_info *prim_info)
 {
+   const float (*vertex_data)[4] = (const float (*)[4])vert_info->verts->data;
+   unsigned stride = vert_info->stride;
+   unsigned count = vert_info->count;
    struct draw_context *draw = emit->draw;
    struct translate *translate = emit->translate;
    struct vbuf_render *render = draw->render;
    void *hw_verts;
+   unsigned start, i;
 
 #if 0
    debug_printf("Linear emit\n");
@@ -232,11 +242,11 @@ void draw_pt_emit_linear(struct pt_emit *emit,
       goto fail;
 
    translate->set_buffer(translate, 0,
-                        vertex_data, stride);
+                        vertex_data, stride, count - 1);
 
    translate->set_buffer(translate, 1,
                         &draw->rasterizer->point_size,
-                        0);
+                        0, ~0);
 
    translate->run(translate,
                   0,
@@ -256,7 +266,14 @@ void draw_pt_emit_linear(struct pt_emit *emit,
 
    render->unmap_vertices( render, 0, count - 1 );
 
-   render->draw_arrays(render, 0, count);
+   for (start = i = 0;
+        i < prim_info->primitive_count;
+        start += prim_info->primitive_lengths[i], i++)
+   {
+      render->draw_arrays(render,
+                          start,
+                          prim_info->primitive_lengths[i]);
+   }
 
    render->release_vertices(render);