[g3dvl] use instanced drawing to reduce the vertex buffer payload
[mesa.git] / src / gallium / auxiliary / vl / vl_vertex_buffers.h
index cf71f029a79f2483a4cc09b88b1217589509c0f7..ca06abe202721730dc59c5b3f122f24986593bc3 100644 (file)
 struct vl_vertex_buffer
 {
    unsigned num_verts;
-   unsigned num_elements;
-   float *buffer;
+   unsigned stride;
+   struct pipe_resource *resource;
+   struct pipe_transfer *transfer;
+   void *vectors;
 };
 
-struct pipe_vertex_buffer vl_vb_upload_quads(struct pipe_context *pipe, unsigned max_blocks,
-                                             struct pipe_vertex_element* element);
+struct pipe_vertex_buffer vl_vb_upload_quads(struct pipe_context *pipe, unsigned max_blocks);
 
-struct pipe_vertex_buffer vl_vb_create_buffer(struct pipe_context *pipe, unsigned max_blocks,
-                                              struct pipe_vertex_element* elements, unsigned num_elements,
-                                              unsigned vertex_buffer_index);
+struct pipe_vertex_element vl_vb_get_quad_vertex_element(void);
 
-bool vl_vb_init(struct vl_vertex_buffer *buffer, unsigned max_blocks, unsigned num_elements);
+unsigned vl_vb_element_helper(struct pipe_vertex_element* elements, unsigned num_elements,
+                              unsigned vertex_buffer_index);
+
+struct pipe_vertex_buffer vl_vb_init(struct vl_vertex_buffer *buffer,
+                                     struct pipe_context *pipe,
+                                     unsigned max_blocks, unsigned stride);
+
+void vl_vb_map(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
 
 static inline void
-vl_vb_add_block(struct vl_vertex_buffer *buffer, float *elements)
+vl_vb_add_block(struct vl_vertex_buffer *buffer, void *elements)
 {
-   float *pos;
-   unsigned i;
+   void *pos;
 
    assert(buffer);
 
-   for(i = 0; i < 4; ++i) {
-      pos = buffer->buffer + buffer->num_verts * buffer->num_elements;
-      memcpy(pos, elements, sizeof(float) * buffer->num_elements);
-      buffer->num_verts++;
-   }
+   pos = buffer->vectors + buffer->num_verts * buffer->stride;
+   memcpy(pos, elements, buffer->stride);
+   buffer->num_verts++;
 }
 
-unsigned vl_vb_upload(struct vl_vertex_buffer *buffer, void *dst);
+void vl_vb_unmap(struct vl_vertex_buffer *buffer, struct pipe_context *pipe);
+
+unsigned vl_vb_restart(struct vl_vertex_buffer *buffer);
 
 void vl_vb_cleanup(struct vl_vertex_buffer *buffer);