r600g: optimise the draw emission packets for r600/eg
[mesa.git] / src / gallium / drivers / softpipe / sp_prim_vbuf.c
index 0168b32037105cdb7e4ad5cec9275da7f41e4649..c60249dbfbcde20ef3d81e450144ce1067664794 100644 (file)
@@ -158,7 +158,7 @@ static INLINE cptrf4 get_vert( const void *vertex_buffer,
  * draw elements / indexed primitives
  */
 static void
-sp_vbuf_draw(struct vbuf_render *vbr, const ushort *indices, uint nr)
+sp_vbuf_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
 {
    struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);
    struct softpipe_context *softpipe = cvbr->softpipe;
@@ -542,6 +542,22 @@ sp_vbuf_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
    }
 }
 
+static void
+sp_vbuf_so_info(struct vbuf_render *vbr, uint primitives, uint vertices)
+{
+   struct softpipe_vbuf_render *cvbr = softpipe_vbuf_render(vbr);
+   struct softpipe_context *softpipe = cvbr->softpipe;
+   unsigned i;
+
+   for (i = 0; i < softpipe->so_target.num_buffers; ++i) {
+      softpipe->so_target.so_count[i] += vertices;
+   }
+
+   softpipe->so_stats.num_primitives_written = primitives;
+   softpipe->so_stats.primitives_storage_needed =
+      vertices * 4 /*sizeof(float|int32)*/ * 4 /*x,y,z,w*/;
+}
+
 
 static void
 sp_vbuf_destroy(struct vbuf_render *vbr)
@@ -572,9 +588,10 @@ sp_create_vbuf_backend(struct softpipe_context *sp)
    cvbr->base.map_vertices = sp_vbuf_map_vertices;
    cvbr->base.unmap_vertices = sp_vbuf_unmap_vertices;
    cvbr->base.set_primitive = sp_vbuf_set_primitive;
-   cvbr->base.draw = sp_vbuf_draw;
+   cvbr->base.draw_elements = sp_vbuf_draw_elements;
    cvbr->base.draw_arrays = sp_vbuf_draw_arrays;
    cvbr->base.release_vertices = sp_vbuf_release_vertices;
+   cvbr->base.set_stream_output_info = sp_vbuf_so_info;
    cvbr->base.destroy = sp_vbuf_destroy;
 
    cvbr->softpipe = sp;