varray.h revision 848b8605
1848b8605Smrg/*
2848b8605Smrg * Mesa 3-D graphics library
3848b8605Smrg *
4848b8605Smrg * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5848b8605Smrg * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
6848b8605Smrg *
7848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a
8848b8605Smrg * copy of this software and associated documentation files (the "Software"),
9848b8605Smrg * to deal in the Software without restriction, including without limitation
10848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the
12848b8605Smrg * Software is furnished to do so, subject to the following conditions:
13848b8605Smrg *
14848b8605Smrg * The above copyright notice and this permission notice shall be included
15848b8605Smrg * in all copies or substantial portions of the Software.
16848b8605Smrg *
17848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE.
24848b8605Smrg */
25848b8605Smrg
26848b8605Smrg
27848b8605Smrg#ifndef VARRAY_H
28848b8605Smrg#define VARRAY_H
29848b8605Smrg
30848b8605Smrg
31848b8605Smrg#include "glheader.h"
32848b8605Smrg#include "bufferobj.h"
33848b8605Smrg
34848b8605Smrgstruct gl_client_array;
35848b8605Smrgstruct gl_context;
36848b8605Smrg
37848b8605Smrg
38848b8605Smrg/**
39848b8605Smrg * Compute the index of the last array element that can be safely accessed in
40848b8605Smrg * a vertex array.  We can really only do this when the array lives in a VBO.
41848b8605Smrg * The array->_MaxElement field will be updated.
42848b8605Smrg * Later in glDrawArrays/Elements/etc we can do some bounds checking.
43848b8605Smrg */
44848b8605Smrgstatic inline void
45848b8605Smrg_mesa_update_array_max_element(struct gl_client_array *array)
46848b8605Smrg{
47848b8605Smrg   assert(array->Enabled);
48848b8605Smrg
49848b8605Smrg   if (array->BufferObj->Name) {
50848b8605Smrg      GLsizeiptrARB offset = (GLsizeiptrARB) array->Ptr;
51848b8605Smrg      GLsizeiptrARB bufSize = (GLsizeiptrARB) array->BufferObj->Size;
52848b8605Smrg
53848b8605Smrg      if (offset < bufSize) {
54848b8605Smrg         const GLuint stride = array->StrideB ?
55848b8605Smrg                                 array->StrideB : array->_ElementSize;
56848b8605Smrg         array->_MaxElement = (bufSize - offset + stride
57848b8605Smrg                                  - array->_ElementSize) / stride;
58848b8605Smrg      }
59848b8605Smrg      else {
60848b8605Smrg	 array->_MaxElement = 0;
61848b8605Smrg      }
62848b8605Smrg   }
63848b8605Smrg   else {
64848b8605Smrg      /* user-space array, no idea how big it is */
65848b8605Smrg      array->_MaxElement = 2 * 1000 * 1000 * 1000; /* just a big number */
66848b8605Smrg   }
67848b8605Smrg}
68848b8605Smrg
69848b8605Smrg
70848b8605Smrg/**
71848b8605Smrg * Returns a pointer to the vertex attribute data in a client array,
72848b8605Smrg * or the offset into the vertex buffer for an array that resides in
73848b8605Smrg * a vertex buffer.
74848b8605Smrg */
75848b8605Smrgstatic inline const GLubyte *
76848b8605Smrg_mesa_vertex_attrib_address(const struct gl_vertex_attrib_array *array,
77848b8605Smrg                            const struct gl_vertex_buffer_binding *binding)
78848b8605Smrg{
79848b8605Smrg   if (_mesa_is_bufferobj(binding->BufferObj))
80848b8605Smrg      return (const GLubyte *) (binding->Offset + array->RelativeOffset);
81848b8605Smrg   else
82848b8605Smrg      return array->Ptr;
83848b8605Smrg}
84848b8605Smrg
85848b8605Smrg/**
86848b8605Smrg * Sets the fields in a gl_client_array to values derived from a
87848b8605Smrg * gl_vertex_attrib_array and a gl_vertex_buffer_binding.
88848b8605Smrg */
89848b8605Smrgstatic inline void
90848b8605Smrg_mesa_update_client_array(struct gl_context *ctx,
91848b8605Smrg                          struct gl_client_array *dst,
92848b8605Smrg                          const struct gl_vertex_attrib_array *src,
93848b8605Smrg                          const struct gl_vertex_buffer_binding *binding)
94848b8605Smrg{
95848b8605Smrg   dst->Size = src->Size;
96848b8605Smrg   dst->Type = src->Type;
97848b8605Smrg   dst->Format = src->Format;
98848b8605Smrg   dst->Stride = src->Stride;
99848b8605Smrg   dst->StrideB = binding->Stride;
100848b8605Smrg   dst->Ptr = _mesa_vertex_attrib_address(src, binding);
101848b8605Smrg   dst->Enabled = src->Enabled;
102848b8605Smrg   dst->Normalized = src->Normalized;
103848b8605Smrg   dst->Integer = src->Integer;
104848b8605Smrg   dst->InstanceDivisor = binding->InstanceDivisor;
105848b8605Smrg   dst->_ElementSize = src->_ElementSize;
106848b8605Smrg   _mesa_reference_buffer_object(ctx, &dst->BufferObj, binding->BufferObj);
107848b8605Smrg}
108848b8605Smrg
109848b8605Smrgstatic inline bool
110848b8605Smrg_mesa_attr_zero_aliases_vertex(struct gl_context *ctx)
111848b8605Smrg{
112848b8605Smrg   const bool is_forward_compatible_context =
113848b8605Smrg      ctx->Const.ContextFlags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
114848b8605Smrg
115848b8605Smrg   /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES
116848b8605Smrg    * 2.0.  Note that we cannot just check for API_OPENGL_COMPAT here because
117848b8605Smrg    * that will erroneously allow this usage in a 3.0 forward-compatible
118848b8605Smrg    * context too.
119848b8605Smrg    */
120848b8605Smrg   return (ctx->API == API_OPENGLES
121848b8605Smrg           || (ctx->API == API_OPENGL_COMPAT
122848b8605Smrg               && !is_forward_compatible_context));
123848b8605Smrg}
124848b8605Smrg
125848b8605Smrgextern void GLAPIENTRY
126848b8605Smrg_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride,
127848b8605Smrg                    const GLvoid *ptr);
128848b8605Smrg
129848b8605Smrg
130848b8605Smrgextern void GLAPIENTRY
131848b8605Smrg_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
132848b8605Smrg
133848b8605Smrg
134848b8605Smrgextern void GLAPIENTRY
135848b8605Smrg_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr);
136848b8605Smrg
137848b8605Smrg
138848b8605Smrgextern void GLAPIENTRY
139848b8605Smrg_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
140848b8605Smrg
141848b8605Smrg
142848b8605Smrgextern void GLAPIENTRY
143848b8605Smrg_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
144848b8605Smrg                      const GLvoid *ptr);
145848b8605Smrg
146848b8605Smrg
147848b8605Smrgextern void GLAPIENTRY
148848b8605Smrg_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr);
149848b8605Smrg
150848b8605Smrg
151848b8605Smrgextern void GLAPIENTRY
152848b8605Smrg_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
153848b8605Smrg                       GLsizei count, const GLvoid *ptr);
154848b8605Smrg
155848b8605Smrg
156848b8605Smrgextern void GLAPIENTRY
157848b8605Smrg_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
158848b8605Smrg                       const GLvoid *ptr);
159848b8605Smrg
160848b8605Smrg
161848b8605Smrgextern void GLAPIENTRY
162848b8605Smrg_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
163848b8605Smrg                      const GLvoid *ptr);
164848b8605Smrg
165848b8605Smrg
166848b8605Smrgextern void GLAPIENTRY
167848b8605Smrg_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
168848b8605Smrg                      const GLvoid *ptr);
169848b8605Smrg
170848b8605Smrg
171848b8605Smrgextern void GLAPIENTRY
172848b8605Smrg_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
173848b8605Smrg                         GLsizei count, const GLvoid *ptr);
174848b8605Smrg
175848b8605Smrg
176848b8605Smrgextern void GLAPIENTRY
177848b8605Smrg_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr);
178848b8605Smrg
179848b8605Smrg
180848b8605Smrgextern void GLAPIENTRY
181848b8605Smrg_mesa_FogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr);
182848b8605Smrg
183848b8605Smrg
184848b8605Smrgextern void GLAPIENTRY
185848b8605Smrg_mesa_SecondaryColorPointer(GLint size, GLenum type,
186848b8605Smrg			       GLsizei stride, const GLvoid *ptr);
187848b8605Smrg
188848b8605Smrg
189848b8605Smrgextern void GLAPIENTRY
190848b8605Smrg_mesa_PointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *ptr);
191848b8605Smrg
192848b8605Smrg
193848b8605Smrgextern void GLAPIENTRY
194848b8605Smrg_mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type,
195848b8605Smrg                             GLboolean normalized, GLsizei stride,
196848b8605Smrg                             const GLvoid *pointer);
197848b8605Smrg
198848b8605Smrgvoid GLAPIENTRY
199848b8605Smrg_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
200848b8605Smrg                           GLsizei stride, const GLvoid *ptr);
201848b8605Smrg
202848b8605Smrg
203848b8605Smrgextern void GLAPIENTRY
204848b8605Smrg_mesa_EnableVertexAttribArray(GLuint index);
205848b8605Smrg
206848b8605Smrg
207848b8605Smrgextern void GLAPIENTRY
208848b8605Smrg_mesa_DisableVertexAttribArray(GLuint index);
209848b8605Smrg
210848b8605Smrg
211848b8605Smrgextern void GLAPIENTRY
212848b8605Smrg_mesa_GetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params);
213848b8605Smrg
214848b8605Smrg
215848b8605Smrgextern void GLAPIENTRY
216848b8605Smrg_mesa_GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params);
217848b8605Smrg
218848b8605Smrg
219848b8605Smrgextern void GLAPIENTRY
220848b8605Smrg_mesa_GetVertexAttribiv(GLuint index, GLenum pname, GLint *params);
221848b8605Smrg
222848b8605Smrg
223848b8605Smrgextern void GLAPIENTRY
224848b8605Smrg_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);
225848b8605Smrg
226848b8605Smrg
227848b8605Smrgextern void GLAPIENTRY
228848b8605Smrg_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params);
229848b8605Smrg
230848b8605Smrg
231848b8605Smrgextern void GLAPIENTRY
232848b8605Smrg_mesa_GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid **pointer);
233848b8605Smrg
234848b8605Smrg
235848b8605Smrgextern void GLAPIENTRY
236848b8605Smrg_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer);
237848b8605Smrg
238848b8605Smrg
239848b8605Smrgextern void GLAPIENTRY
240848b8605Smrg_mesa_MultiDrawArrays( GLenum mode, const GLint *first,
241848b8605Smrg                          const GLsizei *count, GLsizei primcount );
242848b8605Smrg
243848b8605Smrgextern void GLAPIENTRY
244848b8605Smrg_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type,
245848b8605Smrg                            const GLvoid **indices, GLsizei primcount );
246848b8605Smrg
247848b8605Smrgextern void GLAPIENTRY
248848b8605Smrg_mesa_MultiDrawElementsBaseVertex( GLenum mode,
249848b8605Smrg				   const GLsizei *count, GLenum type,
250848b8605Smrg				   const GLvoid **indices, GLsizei primcount,
251848b8605Smrg				   const GLint *basevertex);
252848b8605Smrg
253848b8605Smrgextern void GLAPIENTRY
254848b8605Smrg_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
255848b8605Smrg			      const GLsizei * count,
256848b8605Smrg			      GLsizei primcount, GLint modestride );
257848b8605Smrg
258848b8605Smrg
259848b8605Smrgextern void GLAPIENTRY
260848b8605Smrg_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
261848b8605Smrg				GLenum type, const GLvoid * const * indices,
262848b8605Smrg				GLsizei primcount, GLint modestride );
263848b8605Smrg
264848b8605Smrgextern void GLAPIENTRY
265848b8605Smrg_mesa_LockArraysEXT(GLint first, GLsizei count);
266848b8605Smrg
267848b8605Smrgextern void GLAPIENTRY
268848b8605Smrg_mesa_UnlockArraysEXT( void );
269848b8605Smrg
270848b8605Smrg
271848b8605Smrgextern void GLAPIENTRY
272848b8605Smrg_mesa_DrawArrays(GLenum mode, GLint first, GLsizei count);
273848b8605Smrg
274848b8605Smrgextern void GLAPIENTRY
275848b8605Smrg_mesa_DrawArraysInstanced(GLenum mode, GLint first, GLsizei count,
276848b8605Smrg                          GLsizei primcount);
277848b8605Smrg
278848b8605Smrgextern void GLAPIENTRY
279848b8605Smrg_mesa_DrawElements(GLenum mode, GLsizei count, GLenum type,
280848b8605Smrg                   const GLvoid *indices);
281848b8605Smrg
282848b8605Smrgextern void GLAPIENTRY
283848b8605Smrg_mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count,
284848b8605Smrg                        GLenum type, const GLvoid *indices);
285848b8605Smrg
286848b8605Smrgextern void GLAPIENTRY
287848b8605Smrg_mesa_DrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type,
288848b8605Smrg			     const GLvoid *indices, GLint basevertex);
289848b8605Smrg
290848b8605Smrgextern void GLAPIENTRY
291848b8605Smrg_mesa_DrawRangeElementsBaseVertex(GLenum mode, GLuint start, GLuint end,
292848b8605Smrg				  GLsizei count, GLenum type,
293848b8605Smrg				  const GLvoid *indices,
294848b8605Smrg				  GLint basevertex);
295848b8605Smrg
296848b8605Smrgextern void GLAPIENTRY
297848b8605Smrg_mesa_DrawTransformFeedback(GLenum mode, GLuint name);
298848b8605Smrg
299848b8605Smrgextern void GLAPIENTRY
300848b8605Smrg_mesa_PrimitiveRestartIndex(GLuint index);
301848b8605Smrg
302848b8605Smrg
303848b8605Smrgextern void GLAPIENTRY
304848b8605Smrg_mesa_VertexAttribDivisor(GLuint index, GLuint divisor);
305848b8605Smrg
306848b8605Smrgextern unsigned
307848b8605Smrg_mesa_primitive_restart_index(const struct gl_context *ctx, GLenum ib_type);
308848b8605Smrg
309848b8605Smrgextern void GLAPIENTRY
310848b8605Smrg_mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
311848b8605Smrg                       GLsizei stride);
312848b8605Smrg
313848b8605Smrgextern void GLAPIENTRY
314848b8605Smrg_mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers,
315848b8605Smrg                        const GLintptr *offsets, const GLsizei *strides);
316848b8605Smrg
317848b8605Smrgextern void GLAPIENTRY
318848b8605Smrg_mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type,
319848b8605Smrg                         GLboolean normalized, GLuint relativeOffset);
320848b8605Smrg
321848b8605Smrgextern void GLAPIENTRY
322848b8605Smrg_mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type,
323848b8605Smrg                          GLuint relativeOffset);
324848b8605Smrg
325848b8605Smrgextern void GLAPIENTRY
326848b8605Smrg_mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type,
327848b8605Smrg                          GLuint relativeOffset);
328848b8605Smrg
329848b8605Smrgextern void GLAPIENTRY
330848b8605Smrg_mesa_VertexAttribBinding(GLuint attribIndex, GLuint bindingIndex);
331848b8605Smrg
332848b8605Smrgextern void GLAPIENTRY
333848b8605Smrg_mesa_VertexBindingDivisor(GLuint bindingIndex, GLuint divisor);
334848b8605Smrg
335848b8605Smrg
336848b8605Smrgextern void
337848b8605Smrg_mesa_copy_client_array(struct gl_context *ctx,
338848b8605Smrg                        struct gl_client_array *dst,
339848b8605Smrg                        struct gl_client_array *src);
340848b8605Smrg
341848b8605Smrgextern void
342848b8605Smrg_mesa_copy_vertex_attrib_array(struct gl_context *ctx,
343848b8605Smrg                               struct gl_vertex_attrib_array *dst,
344848b8605Smrg                               const struct gl_vertex_attrib_array *src);
345848b8605Smrg
346848b8605Smrgextern void
347848b8605Smrg_mesa_copy_vertex_buffer_binding(struct gl_context *ctx,
348848b8605Smrg                                 struct gl_vertex_buffer_binding *dst,
349848b8605Smrg                                 const struct gl_vertex_buffer_binding *src);
350848b8605Smrg
351848b8605Smrgextern void
352848b8605Smrg_mesa_print_arrays(struct gl_context *ctx);
353848b8605Smrg
354848b8605Smrgextern void
355848b8605Smrg_mesa_init_varray( struct gl_context * ctx );
356848b8605Smrg
357848b8605Smrgextern void
358848b8605Smrg_mesa_free_varray_data(struct gl_context *ctx);
359848b8605Smrg
360848b8605Smrg#endif
361