1 /*
2  * Mesa 3-D graphics library
3  *
4  * Copyright (C) 1999-2007  Brian Paul   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 "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included
14  * in all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Keith Whitwell <keithw@vmware.com>
26  */
27 
28 #ifndef _TNL_H
29 #define _TNL_H
30 
31 #include "main/glheader.h"
32 
33 struct gl_context;
34 struct gl_program;
35 struct gl_buffer_object;
36 struct gl_transform_feedback_object;
37 struct dd_function_table;
38 
39 
40 /* These are the public-access functions exported from tnl.  (A few
41  * more are currently hooked into dispatch directly by the module
42  * itself.)
43  */
44 extern GLboolean
45 _tnl_CreateContext( struct gl_context *ctx );
46 
47 extern void
48 _tnl_DestroyContext( struct gl_context *ctx );
49 
50 extern void
51 _tnl_InvalidateState( struct gl_context *ctx, GLuint new_state );
52 
53 extern void
54 _tnl_init_driver_draw_function(struct dd_function_table *functions);
55 
56 /* Functions to revive the tnl module after being unhooked from
57  * dispatch and/or driver callbacks.
58  */
59 
60 extern void
61 _tnl_wakeup( struct gl_context *ctx );
62 
63 /* Driver configuration options:
64  */
65 extern void
66 _tnl_need_projected_coords( struct gl_context *ctx, GLboolean flag );
67 
68 
69 /**
70  * Vertex array information which is derived from gl_array_attributes
71  * and gl_vertex_buffer_binding information.  Used by the TNL module and
72  * device drivers.
73  */
74 struct tnl_vertex_array
75 {
76    /** Vertex attribute array */
77    const struct gl_array_attributes *VertexAttrib;
78    /** Vertex buffer binding */
79    const struct gl_vertex_buffer_binding *BufferBinding;
80 };
81 
82 
83 extern const struct tnl_vertex_array*
84 _tnl_bind_inputs( struct gl_context *ctx );
85 
86 
87 /* Control whether T&L does per-vertex fog
88  */
89 extern void
90 _tnl_allow_vertex_fog( struct gl_context *ctx, GLboolean value );
91 
92 extern void
93 _tnl_allow_pixel_fog( struct gl_context *ctx, GLboolean value );
94 
95 extern GLboolean
96 _tnl_program_string(struct gl_context *ctx, GLenum target, struct gl_program *program);
97 
98 struct _mesa_prim;
99 struct _mesa_index_buffer;
100 
101 void
102 _tnl_draw_prims(struct gl_context *ctx,
103                 const struct tnl_vertex_array *arrays,
104 		     const struct _mesa_prim *prim,
105 		     GLuint nr_prims,
106 		     const struct _mesa_index_buffer *ib,
107 		     GLboolean index_bounds_valid,
108 		     GLuint min_index,
109 		     GLuint max_index,
110                      GLuint num_instances,
111                      GLuint base_instance);
112 
113 void
114 _tnl_draw(struct gl_context *ctx,
115           const struct _mesa_prim *prim, unsigned nr_prims,
116           const struct _mesa_index_buffer *ib,
117           bool index_bounds_valid, bool primitive_restart,
118           unsigned restart_index, unsigned min_index, unsigned max_index,
119           unsigned num_instances, unsigned base_instance);
120 
121 extern void
122 _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4]);
123 
124 extern void
125 _tnl_validate_shine_tables( struct gl_context *ctx );
126 
127 
128 
129 /**
130  * For indirect array drawing:
131  *
132  *    typedef struct {
133  *       GLuint count;
134  *       GLuint primCount;
135  *       GLuint first;
136  *       GLuint baseInstance; // in GL 4.2 and later, must be zero otherwise
137  *    } DrawArraysIndirectCommand;
138  *
139  * For indirect indexed drawing:
140  *
141  *    typedef struct {
142  *       GLuint count;
143  *       GLuint primCount;
144  *       GLuint firstIndex;
145  *       GLint  baseVertex;
146  *       GLuint baseInstance; // in GL 4.2 and later, must be zero otherwise
147  *    } DrawElementsIndirectCommand;
148  */
149 
150 
151 /**
152  * Draw a number of primitives.
153  * \param prims  array [nr_prims] describing what to draw (prim type,
154  *               vertex count, first index, instance count, etc).
155  * \param arrays array of vertex arrays for draw
156  * \param ib  index buffer for indexed drawing, NULL for array drawing
157  * \param index_bounds_valid  are min_index and max_index valid?
158  * \param min_index  lowest vertex index used
159  * \param max_index  highest vertex index used
160  * \param tfb_vertcount  if non-null, indicates which transform feedback
161  *                       object has the vertex count.
162  * \param tfb_stream  If called via DrawTransformFeedbackStream, specifies the
163  *                    vertex stream buffer from which to get the vertex count.
164  * \param indirect  If any prims are indirect, this specifies the buffer
165  *                  to find the "DrawArrays/ElementsIndirectCommand" data.
166  *                  This may be deprecated in the future
167  */
168 typedef void (*tnl_draw_func)(struct gl_context *ctx,
169                               const struct tnl_vertex_array* arrays,
170                               const struct _mesa_prim *prims,
171                               GLuint nr_prims,
172                               const struct _mesa_index_buffer *ib,
173                               GLboolean index_bounds_valid,
174                               GLuint min_index,
175                               GLuint max_index,
176                               GLuint num_instances,
177                               GLuint base_instance);
178 
179 
180 /* Utility function to cope with various constraints on tnl modules or
181  * hardware.  This can be used to split an incoming set of arrays and
182  * primitives against the following constraints:
183  *    - Maximum number of indices in index buffer.
184  *    - Maximum number of vertices referenced by index buffer.
185  *    - Maximum hardware vertex buffer size.
186  */
187 struct split_limits
188 {
189    GLuint max_verts;
190    GLuint max_indices;
191    GLuint max_vb_size;		/* bytes */
192 };
193 
194 void
195 _tnl_split_prims(struct gl_context *ctx,
196                  const struct tnl_vertex_array *arrays,
197                  const struct _mesa_prim *prim,
198                  GLuint nr_prims,
199                  const struct _mesa_index_buffer *ib,
200                  GLuint min_index,
201                  GLuint max_index,
202                  GLuint num_instances,
203                  GLuint base_instance,
204                  tnl_draw_func draw,
205                  const struct split_limits *limits);
206 
207 
208 #endif
209