77027be8002b7eb444fe3fe147bafc00075a1392
[mesa.git] / src / mesa / main / varray.h
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (C) 2009 VMware, Inc. All Rights Reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26
27 #ifndef VARRAY_H
28 #define VARRAY_H
29
30
31 #include "mtypes.h"
32 #include "bufferobj.h"
33
34
35 /**
36 * Returns a pointer to the vertex attribute data in a client array,
37 * or the offset into the vertex buffer for an array that resides in
38 * a vertex buffer.
39 */
40 static inline const GLubyte *
41 _mesa_vertex_attrib_address(const struct gl_array_attributes *array,
42 const struct gl_vertex_buffer_binding *binding)
43 {
44 if (_mesa_is_bufferobj(binding->BufferObj))
45 return (const GLubyte *) (binding->Offset + array->RelativeOffset);
46 else
47 return array->Ptr;
48 }
49
50
51 static inline bool
52 _mesa_attr_zero_aliases_vertex(const struct gl_context *ctx)
53 {
54 return ctx->_AttribZeroAliasesVertex;
55 }
56
57
58 /**
59 * This specifies the set of vertex arrays used by the driver for drawing.
60 */
61 static inline void
62 _mesa_set_drawing_arrays(struct gl_context *ctx,
63 const struct gl_vertex_array *arrays)
64 {
65 if (ctx->Array._DrawArrays != arrays) {
66 ctx->Array._DrawArrays = arrays;
67 ctx->NewDriverState |= ctx->DriverFlags.NewArray;
68 }
69 }
70
71
72 extern void
73 _mesa_update_array_format(struct gl_context *ctx,
74 struct gl_vertex_array_object *vao,
75 gl_vert_attrib attrib, GLint size, GLenum type,
76 GLenum format, GLboolean normalized,
77 GLboolean integer, GLboolean doubles,
78 GLuint relativeOffset);
79
80 extern void
81 _mesa_enable_vertex_array_attrib(struct gl_context *ctx,
82 struct gl_vertex_array_object *vao,
83 gl_vert_attrib attrib, bool flush_vertices);
84
85
86 extern void
87 _mesa_disable_vertex_array_attrib(struct gl_context *ctx,
88 struct gl_vertex_array_object *vao,
89 gl_vert_attrib attrib, bool flush_vertices);
90
91
92 extern void
93 _mesa_vertex_attrib_binding(struct gl_context *ctx,
94 struct gl_vertex_array_object *vao,
95 gl_vert_attrib attribIndex,
96 GLuint bindingIndex, bool flush_vertices);
97
98
99 extern void
100 _mesa_bind_vertex_buffer(struct gl_context *ctx,
101 struct gl_vertex_array_object *vao,
102 GLuint index,
103 struct gl_buffer_object *vbo,
104 GLintptr offset, GLsizei stride, bool flush_vertices);
105
106 extern void GLAPIENTRY
107 _mesa_VertexPointer_no_error(GLint size, GLenum type, GLsizei stride,
108 const GLvoid *ptr);
109 extern void GLAPIENTRY
110 _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride,
111 const GLvoid *ptr);
112
113 extern void GLAPIENTRY
114 _mesa_NormalPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr);
115 extern void GLAPIENTRY
116 _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
117
118 extern void GLAPIENTRY
119 _mesa_ColorPointer_no_error(GLint size, GLenum type, GLsizei stride,
120 const GLvoid *ptr);
121 extern void GLAPIENTRY
122 _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
123
124
125 extern void GLAPIENTRY
126 _mesa_IndexPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr);
127 extern void GLAPIENTRY
128 _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
129
130
131 extern void GLAPIENTRY
132 _mesa_TexCoordPointer_no_error(GLint size, GLenum type, GLsizei stride,
133 const GLvoid *ptr);
134 extern void GLAPIENTRY
135 _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
136 const GLvoid *ptr);
137
138
139 extern void GLAPIENTRY
140 _mesa_EdgeFlagPointer_no_error(GLsizei stride, const GLvoid *ptr);
141 extern void GLAPIENTRY
142 _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr);
143
144
145 extern void GLAPIENTRY
146 _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
147 GLsizei count, const GLvoid *ptr);
148
149
150 extern void GLAPIENTRY
151 _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
152 const GLvoid *ptr);
153
154
155 extern void GLAPIENTRY
156 _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
157 const GLvoid *ptr);
158
159
160 extern void GLAPIENTRY
161 _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
162 const GLvoid *ptr);
163
164
165 extern void GLAPIENTRY
166 _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
167 GLsizei count, const GLvoid *ptr);
168
169
170 extern void GLAPIENTRY
171 _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr);
172
173 extern void GLAPIENTRY
174 _mesa_FogCoordPointer_no_error(GLenum type, GLsizei stride,
175 const GLvoid *ptr);
176 extern void GLAPIENTRY
177 _mesa_FogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
178
179
180 extern void GLAPIENTRY
181 _mesa_SecondaryColorPointer_no_error(GLint size, GLenum type,
182 GLsizei stride, const GLvoid *ptr);
183 extern void GLAPIENTRY
184 _mesa_SecondaryColorPointer(GLint size, GLenum type,
185 GLsizei stride, const GLvoid *ptr);
186
187
188 extern void GLAPIENTRY
189 _mesa_PointSizePointerOES_no_error(GLenum type, GLsizei stride,
190 const GLvoid *ptr);
191 extern void GLAPIENTRY
192 _mesa_PointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *ptr);
193
194
195 extern void GLAPIENTRY
196 _mesa_VertexAttribPointer_no_error(GLuint index, GLint size, GLenum type,
197 GLboolean normalized, GLsizei stride,
198 const GLvoid *pointer);
199 extern void GLAPIENTRY
200 _mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type,
201 GLboolean normalized, GLsizei stride,
202 const GLvoid *pointer);
203
204 void GLAPIENTRY
205 _mesa_VertexAttribIPointer_no_error(GLuint index, GLint size, GLenum type,
206 GLsizei stride, const GLvoid *ptr);
207 void GLAPIENTRY
208 _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
209 GLsizei stride, const GLvoid *ptr);
210
211 extern void GLAPIENTRY
212 _mesa_VertexAttribLPointer_no_error(GLuint index, GLint size, GLenum type,
213 GLsizei stride, const GLvoid *pointer);
214 extern void GLAPIENTRY
215 _mesa_VertexAttribLPointer(GLuint index, GLint size, GLenum type,
216 GLsizei stride, const GLvoid *pointer);
217
218 extern void GLAPIENTRY
219 _mesa_EnableVertexAttribArray(GLuint index);
220
221 extern void GLAPIENTRY
222 _mesa_EnableVertexAttribArray_no_error(GLuint index);
223
224
225 extern void GLAPIENTRY
226 _mesa_EnableVertexArrayAttrib(GLuint vaobj, GLuint index);
227
228 extern void GLAPIENTRY
229 _mesa_EnableVertexArrayAttrib_no_error(GLuint vaobj, GLuint index);
230
231
232
233 extern void GLAPIENTRY
234 _mesa_DisableVertexAttribArray(GLuint index);
235
236 extern void GLAPIENTRY
237 _mesa_DisableVertexAttribArray_no_error(GLuint index);
238
239
240 extern void GLAPIENTRY
241 _mesa_DisableVertexArrayAttrib(GLuint vaobj, GLuint index);
242
243 extern void GLAPIENTRY
244 _mesa_DisableVertexArrayAttrib_no_error(GLuint vaobj, GLuint index);
245
246
247 extern void GLAPIENTRY
248 _mesa_GetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
249
250 extern void GLAPIENTRY
251 _mesa_GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
252
253 extern void GLAPIENTRY
254 _mesa_GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params);
255
256 extern void GLAPIENTRY
257 _mesa_GetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
258
259 extern void GLAPIENTRY
260 _mesa_GetVertexAttribLui64vARB(GLuint index, GLenum pname, GLuint64EXT *params);
261
262
263 extern void GLAPIENTRY
264 _mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
265
266
267 extern void GLAPIENTRY
268 _mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
269
270
271 extern void GLAPIENTRY
272 _mesa_GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid **pointer);
273
274
275 void GLAPIENTRY
276 _mesa_GetVertexArrayIndexediv(GLuint vaobj, GLuint index,
277 GLenum pname, GLint *param);
278
279
280 void GLAPIENTRY
281 _mesa_GetVertexArrayIndexed64iv(GLuint vaobj, GLuint index,
282 GLenum pname, GLint64 *param);
283
284
285 extern void GLAPIENTRY
286 _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
287
288
289 extern void GLAPIENTRY
290 _mesa_MultiDrawArrays(GLenum mode, const GLint *first,
291 const GLsizei *count, GLsizei primcount);
292
293 extern void GLAPIENTRY
294 _mesa_MultiDrawElementsEXT(GLenum mode, const GLsizei *count, GLenum type,
295 const GLvoid **indices, GLsizei primcount);
296
297 extern void GLAPIENTRY
298 _mesa_MultiDrawElementsBaseVertex(GLenum mode,
299 const GLsizei *count, GLenum type,
300 const GLvoid **indices, GLsizei primcount,
301 const GLint *basevertex);
302
303 extern void GLAPIENTRY
304 _mesa_MultiModeDrawArraysIBM(const GLenum * mode, const GLint * first,
305 const GLsizei * count,
306 GLsizei primcount, GLint modestride );
307
308
309 extern void GLAPIENTRY
310 _mesa_MultiModeDrawElementsIBM(const GLenum * mode, const GLsizei * count,
311 GLenum type, const GLvoid * const * indices,
312 GLsizei primcount, GLint modestride );
313
314 extern void GLAPIENTRY
315 _mesa_LockArraysEXT(GLint first, GLsizei count);
316
317 extern void GLAPIENTRY
318 _mesa_UnlockArraysEXT(void);
319
320
321 extern void GLAPIENTRY
322 _mesa_DrawArrays(GLenum mode, GLint first, GLsizei count);
323
324 extern void GLAPIENTRY
325 _mesa_DrawArraysInstanced(GLenum mode, GLint first, GLsizei count,
326 GLsizei primcount);
327
328 extern void GLAPIENTRY
329 _mesa_DrawElements(GLenum mode, GLsizei count, GLenum type,
330 const GLvoid *indices);
331
332 extern void GLAPIENTRY
333 _mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
334 GLenum type, const GLvoid *indices);
335
336 extern void GLAPIENTRY
337 _mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
338 const GLvoid *indices, GLint basevertex);
339
340 extern void GLAPIENTRY
341 _mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end,
342 GLsizei count, GLenum type,
343 const GLvoid *indices,
344 GLint basevertex);
345
346 extern void GLAPIENTRY
347 _mesa_DrawTransformFeedback(GLenum mode, GLuint name);
348
349 void GLAPIENTRY
350 _mesa_PrimitiveRestartIndex_no_error(GLuint index);
351
352 extern void GLAPIENTRY
353 _mesa_PrimitiveRestartIndex(GLuint index);
354
355 extern void GLAPIENTRY
356 _mesa_VertexAttribDivisor_no_error(GLuint index, GLuint divisor);
357 extern void GLAPIENTRY
358 _mesa_VertexAttribDivisor(GLuint index, GLuint divisor);
359
360 static inline unsigned
361 _mesa_primitive_restart_index(const struct gl_context *ctx,
362 unsigned index_size)
363 {
364 /* From the OpenGL 4.3 core specification, page 302:
365 * "If both PRIMITIVE_RESTART and PRIMITIVE_RESTART_FIXED_INDEX are
366 * enabled, the index value determined by PRIMITIVE_RESTART_FIXED_INDEX
367 * is used."
368 */
369 if (ctx->Array.PrimitiveRestartFixedIndex) {
370 /* 1 -> 0xff, 2 -> 0xffff, 4 -> 0xffffffff */
371 return 0xffffffffu >> 8 * (4 - index_size);
372 }
373
374 return ctx->Array.RestartIndex;
375 }
376
377 extern void GLAPIENTRY
378 _mesa_BindVertexBuffer_no_error(GLuint bindingIndex, GLuint buffer,
379 GLintptr offset, GLsizei stride);
380 extern void GLAPIENTRY
381 _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
382 GLsizei stride);
383
384 void GLAPIENTRY
385 _mesa_VertexArrayVertexBuffer_no_error(GLuint vaobj, GLuint bindingIndex,
386 GLuint buffer, GLintptr offset,
387 GLsizei stride);
388 extern void GLAPIENTRY
389 _mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer,
390 GLintptr offset, GLsizei stride);
391
392 void GLAPIENTRY
393 _mesa_BindVertexBuffers_no_error(GLuint first, GLsizei count,
394 const GLuint *buffers, const GLintptr *offsets,
395 const GLsizei *strides);
396
397 extern void GLAPIENTRY
398 _mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers,
399 const GLintptr *offsets, const GLsizei *strides);
400
401 void GLAPIENTRY
402 _mesa_VertexArrayVertexBuffers_no_error(GLuint vaobj, GLuint first,
403 GLsizei count, const GLuint *buffers,
404 const GLintptr *offsets,
405 const GLsizei *strides);
406
407 extern void GLAPIENTRY
408 _mesa_VertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count,
409 const GLuint *buffers,
410 const GLintptr *offsets, const GLsizei *strides);
411
412 extern void GLAPIENTRY
413 _mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type,
414 GLboolean normalized, GLuint relativeOffset);
415
416 extern void GLAPIENTRY
417 _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size,
418 GLenum type, GLboolean normalized,
419 GLuint relativeOffset);
420
421 extern void GLAPIENTRY
422 _mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type,
423 GLuint relativeOffset);
424
425 extern void GLAPIENTRY
426 _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex,
427 GLint size, GLenum type,
428 GLuint relativeOffset);
429
430 extern void GLAPIENTRY
431 _mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type,
432 GLuint relativeOffset);
433
434 extern void GLAPIENTRY
435 _mesa_VertexArrayAttribLFormat(GLuint vaobj, GLuint attribIndex,
436 GLint size, GLenum type,
437 GLuint relativeOffset);
438
439 void GLAPIENTRY
440 _mesa_VertexAttribBinding_no_error(GLuint attribIndex, GLuint bindingIndex);
441
442 extern void GLAPIENTRY
443 _mesa_VertexAttribBinding(GLuint attribIndex, GLuint bindingIndex);
444
445 void GLAPIENTRY
446 _mesa_VertexArrayAttribBinding_no_error(GLuint vaobj, GLuint attribIndex,
447 GLuint bindingIndex);
448
449 extern void GLAPIENTRY
450 _mesa_VertexArrayAttribBinding(GLuint vaobj, GLuint attribIndex,
451 GLuint bindingIndex);
452
453 void GLAPIENTRY
454 _mesa_VertexBindingDivisor_no_error(GLuint bindingIndex, GLuint divisor);
455
456 extern void GLAPIENTRY
457 _mesa_VertexBindingDivisor(GLuint bindingIndex, GLuint divisor);
458
459 void GLAPIENTRY
460 _mesa_VertexArrayBindingDivisor_no_error(GLuint vaobj, GLuint bindingIndex,
461 GLuint divisor);
462
463 extern void GLAPIENTRY
464 _mesa_VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingIndex,
465 GLuint divisor);
466
467
468 /**
469 * Shallow copy one vertex array to another.
470 */
471 static inline void
472 _mesa_copy_vertex_array(struct gl_vertex_array *dst,
473 const struct gl_vertex_array *src)
474 {
475 dst->VertexAttrib = src->VertexAttrib;
476 dst->BufferBinding = src->BufferBinding;
477 }
478
479
480 extern void
481 _mesa_copy_vertex_attrib_array(struct gl_context *ctx,
482 struct gl_array_attributes *dst,
483 const struct gl_array_attributes *src);
484
485 extern void
486 _mesa_copy_vertex_buffer_binding(struct gl_context *ctx,
487 struct gl_vertex_buffer_binding *dst,
488 const struct gl_vertex_buffer_binding *src);
489
490 extern void
491 _mesa_print_arrays(struct gl_context *ctx);
492
493 extern void
494 _mesa_init_varray(struct gl_context *ctx);
495
496 extern void
497 _mesa_free_varray_data(struct gl_context *ctx);
498
499 #endif