draw_vbuf.h revision af69d88d
1/**************************************************************************
2 *
3 * Copyright 2007 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28/**
29 * \file
30 * Vertex buffer drawing stage.
31 *
32 * \author Keith Whitwell <keithw@vmware.com>
33 * \author Jose Fonseca <jfonseca@vmware.com>
34 */
35
36#ifndef DRAW_VBUF_H_
37#define DRAW_VBUF_H_
38
39
40#include "pipe/p_compiler.h"
41
42
43struct pipe_rasterizer_state;
44struct draw_context;
45struct vertex_info;
46struct pipe_query_data_pipeline_statistics;
47
48
49/**
50 * Interface for hardware vertex buffer rendering.
51 */
52struct vbuf_render {
53
54   /**
55    * Driver limits.  May be tuned lower to improve cache hits on
56    * index list.
57    */
58   unsigned max_indices;
59   unsigned max_vertex_buffer_bytes;
60
61   /**
62    * Query if the hardware driver needs assistance for a particular
63    * combination of rasterizer state and primitive.
64    *
65    * Currently optional.
66    */
67   boolean (*need_pipeline)(const struct vbuf_render *render,
68                            const struct pipe_rasterizer_state *rasterizer,
69                            unsigned int prim );
70
71
72   /**
73    * Get the hardware vertex format.
74    *
75    * XXX: have this in draw_context instead?
76    */
77   const struct vertex_info *(*get_vertex_info)( struct vbuf_render * );
78
79   /**
80    * Request a destination for vertices.
81    * Hardware renderers will use ttm memory, others will just malloc
82    * something.
83    */
84   boolean (*allocate_vertices)( struct vbuf_render *,
85                                 ushort vertex_size,
86                                 ushort nr_vertices );
87
88   void *(*map_vertices)( struct vbuf_render * );
89   void (*unmap_vertices)( struct vbuf_render *,
90                           ushort min_index,
91                           ushort max_index );
92
93   /**
94    * Notify the renderer of the current primitive when it changes.
95    * Must succeed for TRIANGLES, LINES and POINTS.  Other prims at
96    * the discretion of the driver, for the benefit of the passthrough
97    * path.
98    */
99   void (*set_primitive)( struct vbuf_render *, unsigned prim );
100
101   /**
102    * Draw indexed primitives.  Note that indices are ushort.  The driver
103    * must complete this call, if necessary splitting the index list itself.
104    */
105   void (*draw_elements)( struct vbuf_render *,
106                          const ushort *indices,
107                          uint nr_indices );
108
109   /* Draw non-indexed primitives.
110    */
111   void (*draw_arrays)( struct vbuf_render *,
112			unsigned start,
113			uint nr );
114
115   /**
116    * Called when vbuf is done with this set of vertices:
117    */
118   void (*release_vertices)( struct vbuf_render * );
119
120   void (*destroy)( struct vbuf_render * );
121
122
123   /**
124    * Called after writing data to the stream out buffers
125    */
126   void (*set_stream_output_info)( struct vbuf_render *vbufr,
127                                   unsigned primitive_count,
128                                   unsigned primitive_generated );
129
130   /**
131    * Called after all relevant statistics have been accumulated.
132    */
133   void (*pipeline_statistics)(
134      struct vbuf_render *vbufr,
135      const struct pipe_query_data_pipeline_statistics *stats );
136};
137
138
139
140struct draw_stage *
141draw_vbuf_stage( struct draw_context *draw,
142                 struct vbuf_render *render );
143
144
145#endif /*DRAW_VBUF_H_*/
146