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