11a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**************************************************************************
21a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
31a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
41a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * All Rights Reserved.
51a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
61a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
71a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * copy of this software and associated documentation files (the
81a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * "Software"), to deal in the Software without restriction, including
91a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
101a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
111a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * permit persons to whom the Software is furnished to do so, subject to
121a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * the following conditions:
131a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
141a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * The above copyright notice and this permission notice (including the
151a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * next paragraph) shall be included in all copies or substantial portions
161a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * of the Software.
171a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
201a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
231a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
241a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
251a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
261a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca **************************************************************************/
271a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
281a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
291a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * \file
301a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Vertex buffer drawing stage.
311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
321a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * \author Keith Whitwell <keith@tungstengraphics.com>
33395edbc5151b2ce9dd77a22d104ce886e9326354José Fonseca * \author Jose Fonseca <jrfonsec@tungstengraphics.com>
341a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca#ifndef DRAW_VBUF_H_
371a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca#define DRAW_VBUF_H_
381a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
391a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
407844b4e730604e613a88f536c4aeee5c02d300fdJosé Fonseca#include "pipe/p_compiler.h"
417844b4e730604e613a88f536c4aeee5c02d300fdJosé Fonseca
421a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
43395edbc5151b2ce9dd77a22d104ce886e9326354José Fonsecastruct pipe_rasterizer_state;
441a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct draw_context;
451a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct vertex_info;
461a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
471a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
481a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
491a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Interface for hardware vertex buffer rendering.
501a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
511a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct vbuf_render {
521a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /**
541a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * Driver limits.  May be tuned lower to improve cache hits on
551a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * index list.
561a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    */
571a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned max_indices;
581a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned max_vertex_buffer_bytes;
591a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
601a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /**
61f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell    * Query if the hardware driver needs assistance for a particular
62f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell    * combination of rasterizer state and primitive.
63f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell    *
64f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell    * Currently optional.
65f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell    */
66f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell   boolean (*need_pipeline)(const struct vbuf_render *render,
67f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell                            const struct pipe_rasterizer_state *rasterizer,
68f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell                            unsigned int prim );
69f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell
70f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell
71f5d4274b4a8effc70c238060c3728aea629663dfKeith Whitwell   /**
721a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * Get the hardware vertex format.
731a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    *
741a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * XXX: have this in draw_context instead?
751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    */
761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   const struct vertex_info *(*get_vertex_info)( struct vbuf_render * );
771a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
781a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /**
791a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * Request a destination for vertices.
801a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * Hardware renderers will use ttm memory, others will just malloc
811a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * something.
821a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    */
83befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   boolean (*allocate_vertices)( struct vbuf_render *,
84befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                                 ushort vertex_size,
85befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                                 ushort nr_vertices );
86befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
87befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   void *(*map_vertices)( struct vbuf_render * );
88befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   void (*unmap_vertices)( struct vbuf_render *,
89befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                           ushort min_index,
90befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                           ushort max_index );
911a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
921a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /**
931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * Notify the renderer of the current primitive when it changes.
949425a702bef7d3f601e9ddc2b801f00a3d52dbb8Keith Whitwell    * Must succeed for TRIANGLES, LINES and POINTS.  Other prims at
959425a702bef7d3f601e9ddc2b801f00a3d52dbb8Keith Whitwell    * the discretion of the driver, for the benefit of the passthrough
969425a702bef7d3f601e9ddc2b801f00a3d52dbb8Keith Whitwell    * path.
971a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    */
98488dd2c1912132fe7ee5e81b05fb64ba62a46098Brian Paul   void (*set_primitive)( struct vbuf_render *, unsigned prim );
991a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1001a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /**
101740e50c60f03d194aafab93d5251699964800979Brian Paul    * Draw indexed primitives.  Note that indices are ushort.  The driver
102740e50c60f03d194aafab93d5251699964800979Brian Paul    * must complete this call, if necessary splitting the index list itself.
1031a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    */
104740e50c60f03d194aafab93d5251699964800979Brian Paul   void (*draw_elements)( struct vbuf_render *,
105740e50c60f03d194aafab93d5251699964800979Brian Paul                          const ushort *indices,
106740e50c60f03d194aafab93d5251699964800979Brian Paul                          uint nr_indices );
1071a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
108740e50c60f03d194aafab93d5251699964800979Brian Paul   /* Draw non-indexed primitives.
109297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell    */
110297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell   void (*draw_arrays)( struct vbuf_render *,
111297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell			unsigned start,
112297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell			uint nr );
113297b3be25a7f097fb9b1a79e332acddc12dcc3feKeith Whitwell
1141a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /**
1151a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    * Called when vbuf is done with this set of vertices:
1161a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca    */
117befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   void (*release_vertices)( struct vbuf_render * );
1181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   void (*destroy)( struct vbuf_render * );
1202c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin
1212c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin
1222c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin   /**
1232c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin    * Called after writing data to the stream out buffers
1242c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin    */
1252c22b8e61dc4adab658c6198feea30c006aa6c58Zack Rusin   void (*set_stream_output_info)( struct vbuf_render *vbufr,
126287531772ccea82c8a6c4dab5656d751a8943524Zack Rusin                                   unsigned primitive_count,
127ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie                                   unsigned vertices_count,
128ec8cbd79ac4065111365a6720c9564de56855cc8Dave Airlie                                   unsigned primitive_generated );
1291a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca};
1301a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1321a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1331a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct draw_stage *
1341a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecadraw_vbuf_stage( struct draw_context *draw,
1351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                 struct vbuf_render *render );
1361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1371a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1381a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca#endif /*DRAW_VBUF_H_*/
139