1 /*
2  * Mesa 3-D graphics library
3  * Version:  7.6
4  *
5  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the "Software"),
10  * to deal in the Software without restriction, including without limitation
11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12  * and/or sell copies of the Software, and to permit persons to whom the
13  * Software is furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included
16  * in all copies or substantial portions 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 MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24  */
25 
26 
27 #ifndef VARRAY_H
28 #define VARRAY_H
29 
30 
31 #include "glheader.h"
32 #include "mfeatures.h"
33 
34 struct gl_client_array;
35 struct gl_context;
36 
37 
38 /**
39  * Compute the index of the last array element that can be safely accessed in
40  * a vertex array.  We can really only do this when the array lives in a VBO.
41  * The array->_MaxElement field will be updated.
42  * Later in glDrawArrays/Elements/etc we can do some bounds checking.
43  */
44 static inline void
_mesa_update_array_max_element(struct gl_client_array * array)45 _mesa_update_array_max_element(struct gl_client_array *array)
46 {
47    assert(array->Enabled);
48 
49    if (array->BufferObj->Name) {
50       GLsizeiptrARB offset = (GLsizeiptrARB) array->Ptr;
51       GLsizeiptrARB bufSize = (GLsizeiptrARB) array->BufferObj->Size;
52 
53       if (offset < bufSize) {
54 	 array->_MaxElement = (bufSize - offset + array->StrideB
55                                - array->_ElementSize) / array->StrideB;
56       }
57       else {
58 	 array->_MaxElement = 0;
59       }
60    }
61    else {
62       /* user-space array, no idea how big it is */
63       array->_MaxElement = 2 * 1000 * 1000 * 1000; /* just a big number */
64    }
65 }
66 
67 
68 #if _HAVE_FULL_GL
69 
70 extern void GLAPIENTRY
71 _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride,
72                     const GLvoid *ptr);
73 
74 extern void GLAPIENTRY
75 _mesa_UnlockArraysEXT( void );
76 
77 extern void GLAPIENTRY
78 _mesa_LockArraysEXT(GLint first, GLsizei count);
79 
80 
81 extern void GLAPIENTRY
82 _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
83 
84 
85 extern void GLAPIENTRY
86 _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
87 
88 
89 extern void GLAPIENTRY
90 _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
91 
92 
93 extern void GLAPIENTRY
94 _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
95                       const GLvoid *ptr);
96 
97 
98 extern void GLAPIENTRY
99 _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr);
100 
101 
102 extern void GLAPIENTRY
103 _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
104                        GLsizei count, const GLvoid *ptr);
105 
106 
107 extern void GLAPIENTRY
108 _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
109                        const GLvoid *ptr);
110 
111 
112 extern void GLAPIENTRY
113 _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
114                       const GLvoid *ptr);
115 
116 
117 extern void GLAPIENTRY
118 _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
119                       const GLvoid *ptr);
120 
121 
122 extern void GLAPIENTRY
123 _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
124                          GLsizei count, const GLvoid *ptr);
125 
126 
127 extern void GLAPIENTRY
128 _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr);
129 
130 
131 extern void GLAPIENTRY
132 _mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr);
133 
134 
135 extern void GLAPIENTRY
136 _mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
137 			       GLsizei stride, const GLvoid *ptr);
138 
139 
140 extern void GLAPIENTRY
141 _mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr);
142 
143 
144 extern void GLAPIENTRY
145 _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
146                             GLsizei stride, const GLvoid *pointer);
147 
148 
149 extern void GLAPIENTRY
150 _mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
151                              GLboolean normalized, GLsizei stride,
152                              const GLvoid *pointer);
153 
154 void GLAPIENTRY
155 _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
156                            GLsizei stride, const GLvoid *ptr);
157 
158 
159 extern void GLAPIENTRY
160 _mesa_EnableVertexAttribArrayARB(GLuint index);
161 
162 
163 extern void GLAPIENTRY
164 _mesa_DisableVertexAttribArrayARB(GLuint index);
165 
166 
167 extern void GLAPIENTRY
168 _mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params);
169 
170 
171 extern void GLAPIENTRY
172 _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params);
173 
174 
175 extern void GLAPIENTRY
176 _mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params);
177 
178 
179 extern void GLAPIENTRY
180 _mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
181 
182 
183 extern void GLAPIENTRY
184 _mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
185 
186 
187 extern void GLAPIENTRY
188 _mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer);
189 
190 
191 extern void GLAPIENTRY
192 _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
193 
194 
195 extern void GLAPIENTRY
196 _mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
197                           const GLsizei *count, GLsizei primcount );
198 
199 extern void GLAPIENTRY
200 _mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
201                             const GLvoid **indices, GLsizei primcount );
202 
203 extern void GLAPIENTRY
204 _mesa_MultiDrawElementsBaseVertex( GLenum mode,
205 				   const GLsizei *count, GLenum type,
206 				   const GLvoid **indices, GLsizei primcount,
207 				   const GLint *basevertex);
208 
209 extern void GLAPIENTRY
210 _mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
211 			      const GLsizei * count,
212 			      GLsizei primcount, GLint modestride );
213 
214 
215 extern void GLAPIENTRY
216 _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
217 				GLenum type, const GLvoid * const * indices,
218 				GLsizei primcount, GLint modestride );
219 
220 extern void GLAPIENTRY
221 _mesa_LockArraysEXT(GLint first, GLsizei count);
222 
223 extern void GLAPIENTRY
224 _mesa_UnlockArraysEXT( void );
225 
226 
227 extern void GLAPIENTRY
228 _mesa_DrawArrays(GLenum mode, GLint first, GLsizei count);
229 
230 extern void GLAPIENTRY
231 _mesa_DrawElements(GLenum mode, GLsizei count, GLenum type,
232                    const GLvoid *indices);
233 
234 extern void GLAPIENTRY
235 _mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
236                         GLenum type, const GLvoid *indices);
237 
238 extern void GLAPIENTRY
239 _mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
240 			     const GLvoid *indices, GLint basevertex);
241 
242 extern void GLAPIENTRY
243 _mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end,
244 				  GLsizei count, GLenum type,
245 				  const GLvoid *indices,
246 				  GLint basevertex);
247 
248 #if FEATURE_EXT_transform_feedback
249 
250 extern void GLAPIENTRY
251 _mesa_DrawTransformFeedback(GLenum mode, GLuint name);
252 
253 #endif
254 
255 extern void GLAPIENTRY
256 _mesa_PrimitiveRestartIndex(GLuint index);
257 
258 
259 extern void GLAPIENTRY
260 _mesa_VertexAttribDivisor(GLuint index, GLuint divisor);
261 
262 
263 extern void
264 _mesa_copy_client_array(struct gl_context *ctx,
265                         struct gl_client_array *dst,
266                         struct gl_client_array *src);
267 
268 
269 extern void
270 _mesa_print_arrays(struct gl_context *ctx);
271 
272 extern void
273 _mesa_init_varray( struct gl_context * ctx );
274 
275 extern void
276 _mesa_free_varray_data(struct gl_context *ctx);
277 
278 #else
279 
280 /** No-op */
281 #define _mesa_init_varray( c )  ((void)0)
282 #define _mesa_free_varray_data( c )  ((void)0)
283 
284 #endif
285 
286 #endif
287