varray.c revision c1f859d4
17117f1b4Smrg/* 27117f1b4Smrg * Mesa 3-D graphics library 3c1f859d4Smrg * Version: 7.2 47117f1b4Smrg * 5c1f859d4Smrg * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 67117f1b4Smrg * 77117f1b4Smrg * Permission is hereby granted, free of charge, to any person obtaining a 87117f1b4Smrg * copy of this software and associated documentation files (the "Software"), 97117f1b4Smrg * to deal in the Software without restriction, including without limitation 107117f1b4Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 117117f1b4Smrg * and/or sell copies of the Software, and to permit persons to whom the 127117f1b4Smrg * Software is furnished to do so, subject to the following conditions: 137117f1b4Smrg * 147117f1b4Smrg * The above copyright notice and this permission notice shall be included 157117f1b4Smrg * in all copies or substantial portions of the Software. 167117f1b4Smrg * 177117f1b4Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 187117f1b4Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 197117f1b4Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 207117f1b4Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 217117f1b4Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 227117f1b4Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 237117f1b4Smrg */ 247117f1b4Smrg 257117f1b4Smrg 267117f1b4Smrg#include "glheader.h" 277117f1b4Smrg#include "imports.h" 287117f1b4Smrg#include "bufferobj.h" 297117f1b4Smrg#include "context.h" 307117f1b4Smrg#include "enable.h" 317117f1b4Smrg#include "enums.h" 327117f1b4Smrg#include "mtypes.h" 337117f1b4Smrg#include "varray.h" 347117f1b4Smrg#include "arrayobj.h" 35c1f859d4Smrg#include "glapi/dispatch.h" 367117f1b4Smrg 377117f1b4Smrg 387117f1b4Smrg/** 397117f1b4Smrg * Update the fields of a vertex array object. 407117f1b4Smrg * We need to do a few special things for arrays that live in 417117f1b4Smrg * vertex buffer objects. 427117f1b4Smrg * 437117f1b4Smrg * \param array the array to update 447117f1b4Smrg * \param dirtyBit which bit to set in ctx->Array.NewState for this array 457117f1b4Smrg * \param elementSize size of each array element, in bytes 467117f1b4Smrg * \param size components per element (1, 2, 3 or 4) 477117f1b4Smrg * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 487117f1b4Smrg * \param stride stride between elements, in elements 497117f1b4Smrg * \param normalized are integer types converted to floats in [-1, 1]? 507117f1b4Smrg * \param ptr the address (or offset inside VBO) of the array data 517117f1b4Smrg */ 527117f1b4Smrgstatic void 537117f1b4Smrgupdate_array(GLcontext *ctx, struct gl_client_array *array, 547117f1b4Smrg GLbitfield dirtyBit, GLsizei elementSize, 557117f1b4Smrg GLint size, GLenum type, 567117f1b4Smrg GLsizei stride, GLboolean normalized, const GLvoid *ptr) 577117f1b4Smrg{ 587117f1b4Smrg array->Size = size; 597117f1b4Smrg array->Type = type; 607117f1b4Smrg array->Stride = stride; 617117f1b4Smrg array->StrideB = stride ? stride : elementSize; 627117f1b4Smrg array->Normalized = normalized; 637117f1b4Smrg array->Ptr = (const GLubyte *) ptr; 647117f1b4Smrg#if FEATURE_ARB_vertex_buffer_object 65c1f859d4Smrg _mesa_reference_buffer_object(ctx, &array->BufferObj, 66c1f859d4Smrg ctx->Array.ArrayBufferObj); 67c1f859d4Smrg 687117f1b4Smrg /* Compute the index of the last array element that's inside the buffer. 697117f1b4Smrg * Later in glDrawArrays we'll check if start + count > _MaxElement to 707117f1b4Smrg * be sure we won't go out of bounds. 717117f1b4Smrg */ 727117f1b4Smrg if (ctx->Array.ArrayBufferObj->Name) 737117f1b4Smrg array->_MaxElement = ((GLsizeiptrARB) ctx->Array.ArrayBufferObj->Size 747117f1b4Smrg - (GLsizeiptrARB) array->Ptr + array->StrideB 757117f1b4Smrg - elementSize) / array->StrideB; 767117f1b4Smrg else 777117f1b4Smrg#endif 787117f1b4Smrg array->_MaxElement = 2 * 1000 * 1000 * 1000; /* just a big number */ 797117f1b4Smrg 807117f1b4Smrg ctx->NewState |= _NEW_ARRAY; 817117f1b4Smrg ctx->Array.NewState |= dirtyBit; 827117f1b4Smrg} 837117f1b4Smrg 847117f1b4Smrg 857117f1b4Smrgvoid GLAPIENTRY 867117f1b4Smrg_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 877117f1b4Smrg{ 887117f1b4Smrg GLsizei elementSize; 897117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 907117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 917117f1b4Smrg 927117f1b4Smrg if (size < 2 || size > 4) { 937117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(size)" ); 947117f1b4Smrg return; 957117f1b4Smrg } 967117f1b4Smrg if (stride < 0) { 977117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(stride)" ); 987117f1b4Smrg return; 997117f1b4Smrg } 1007117f1b4Smrg 1017117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 1027117f1b4Smrg _mesa_debug(ctx, "glVertexPointer( sz %d type %s stride %d )\n", size, 1037117f1b4Smrg _mesa_lookup_enum_by_nr( type ), stride); 1047117f1b4Smrg 1057117f1b4Smrg /* always need to check that <type> is legal */ 1067117f1b4Smrg switch (type) { 1077117f1b4Smrg case GL_SHORT: 1087117f1b4Smrg elementSize = size * sizeof(GLshort); 1097117f1b4Smrg break; 1107117f1b4Smrg case GL_INT: 1117117f1b4Smrg elementSize = size * sizeof(GLint); 1127117f1b4Smrg break; 1137117f1b4Smrg case GL_FLOAT: 1147117f1b4Smrg elementSize = size * sizeof(GLfloat); 1157117f1b4Smrg break; 1167117f1b4Smrg case GL_DOUBLE: 1177117f1b4Smrg elementSize = size * sizeof(GLdouble); 1187117f1b4Smrg break; 119c1f859d4Smrg#if FEATURE_fixedpt 120c1f859d4Smrg case GL_FIXED: 121c1f859d4Smrg elementSize = size * sizeof(GLfixed); 122c1f859d4Smrg break; 123c1f859d4Smrg#endif 124c1f859d4Smrg#if FEATURE_vertex_array_byte 125c1f859d4Smrg case GL_BYTE: 126c1f859d4Smrg elementSize = size * sizeof(GLbyte); 127c1f859d4Smrg break; 128c1f859d4Smrg#endif 1297117f1b4Smrg default: 1307117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type)" ); 1317117f1b4Smrg return; 1327117f1b4Smrg } 1337117f1b4Smrg 1347117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Vertex, _NEW_ARRAY_VERTEX, 1357117f1b4Smrg elementSize, size, type, stride, GL_FALSE, ptr); 1367117f1b4Smrg 1377117f1b4Smrg if (ctx->Driver.VertexPointer) 1387117f1b4Smrg ctx->Driver.VertexPointer( ctx, size, type, stride, ptr ); 1397117f1b4Smrg} 1407117f1b4Smrg 1417117f1b4Smrg 1427117f1b4Smrgvoid GLAPIENTRY 1437117f1b4Smrg_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 1447117f1b4Smrg{ 1457117f1b4Smrg GLsizei elementSize; 1467117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 1477117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1487117f1b4Smrg 1497117f1b4Smrg if (stride < 0) { 1507117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glNormalPointer(stride)" ); 1517117f1b4Smrg return; 1527117f1b4Smrg } 1537117f1b4Smrg 1547117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 1557117f1b4Smrg _mesa_debug(ctx, "glNormalPointer( type %s stride %d )\n", 1567117f1b4Smrg _mesa_lookup_enum_by_nr( type ), stride); 1577117f1b4Smrg 1587117f1b4Smrg switch (type) { 1597117f1b4Smrg case GL_BYTE: 1607117f1b4Smrg elementSize = 3 * sizeof(GLbyte); 1617117f1b4Smrg break; 1627117f1b4Smrg case GL_SHORT: 1637117f1b4Smrg elementSize = 3 * sizeof(GLshort); 1647117f1b4Smrg break; 1657117f1b4Smrg case GL_INT: 1667117f1b4Smrg elementSize = 3 * sizeof(GLint); 1677117f1b4Smrg break; 1687117f1b4Smrg case GL_FLOAT: 1697117f1b4Smrg elementSize = 3 * sizeof(GLfloat); 1707117f1b4Smrg break; 1717117f1b4Smrg case GL_DOUBLE: 1727117f1b4Smrg elementSize = 3 * sizeof(GLdouble); 1737117f1b4Smrg break; 174c1f859d4Smrg#if FEATURE_fixedpt 175c1f859d4Smrg case GL_FIXED: 176c1f859d4Smrg elementSize = 3 * sizeof(GLfixed); 177c1f859d4Smrg break; 178c1f859d4Smrg#endif 1797117f1b4Smrg default: 1807117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type)" ); 1817117f1b4Smrg return; 1827117f1b4Smrg } 1837117f1b4Smrg 1847117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Normal, _NEW_ARRAY_NORMAL, 1857117f1b4Smrg elementSize, 3, type, stride, GL_TRUE, ptr); 1867117f1b4Smrg 1877117f1b4Smrg if (ctx->Driver.NormalPointer) 1887117f1b4Smrg ctx->Driver.NormalPointer( ctx, type, stride, ptr ); 1897117f1b4Smrg} 1907117f1b4Smrg 1917117f1b4Smrg 1927117f1b4Smrgvoid GLAPIENTRY 1937117f1b4Smrg_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 1947117f1b4Smrg{ 1957117f1b4Smrg GLsizei elementSize; 1967117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 1977117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1987117f1b4Smrg 1997117f1b4Smrg if (size < 3 || size > 4) { 2007117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(size)" ); 2017117f1b4Smrg return; 2027117f1b4Smrg } 2037117f1b4Smrg if (stride < 0) { 2047117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" ); 2057117f1b4Smrg return; 2067117f1b4Smrg } 2077117f1b4Smrg 2087117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 2097117f1b4Smrg _mesa_debug(ctx, "glColorPointer( sz %d type %s stride %d )\n", size, 2107117f1b4Smrg _mesa_lookup_enum_by_nr( type ), stride); 2117117f1b4Smrg 2127117f1b4Smrg switch (type) { 2137117f1b4Smrg case GL_BYTE: 2147117f1b4Smrg elementSize = size * sizeof(GLbyte); 2157117f1b4Smrg break; 2167117f1b4Smrg case GL_UNSIGNED_BYTE: 2177117f1b4Smrg elementSize = size * sizeof(GLubyte); 2187117f1b4Smrg break; 2197117f1b4Smrg case GL_SHORT: 2207117f1b4Smrg elementSize = size * sizeof(GLshort); 2217117f1b4Smrg break; 2227117f1b4Smrg case GL_UNSIGNED_SHORT: 2237117f1b4Smrg elementSize = size * sizeof(GLushort); 2247117f1b4Smrg break; 2257117f1b4Smrg case GL_INT: 2267117f1b4Smrg elementSize = size * sizeof(GLint); 2277117f1b4Smrg break; 2287117f1b4Smrg case GL_UNSIGNED_INT: 2297117f1b4Smrg elementSize = size * sizeof(GLuint); 2307117f1b4Smrg break; 2317117f1b4Smrg case GL_FLOAT: 2327117f1b4Smrg elementSize = size * sizeof(GLfloat); 2337117f1b4Smrg break; 2347117f1b4Smrg case GL_DOUBLE: 2357117f1b4Smrg elementSize = size * sizeof(GLdouble); 2367117f1b4Smrg break; 237c1f859d4Smrg#if FEATURE_fixedpt 238c1f859d4Smrg case GL_FIXED: 239c1f859d4Smrg elementSize = size * sizeof(GLfixed); 240c1f859d4Smrg break; 241c1f859d4Smrg#endif 2427117f1b4Smrg default: 2437117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type)" ); 2447117f1b4Smrg return; 2457117f1b4Smrg } 2467117f1b4Smrg 2477117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Color, _NEW_ARRAY_COLOR0, 2487117f1b4Smrg elementSize, size, type, stride, GL_TRUE, ptr); 2497117f1b4Smrg 2507117f1b4Smrg if (ctx->Driver.ColorPointer) 2517117f1b4Smrg ctx->Driver.ColorPointer( ctx, size, type, stride, ptr ); 2527117f1b4Smrg} 2537117f1b4Smrg 2547117f1b4Smrg 2557117f1b4Smrgvoid GLAPIENTRY 2567117f1b4Smrg_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 2577117f1b4Smrg{ 2587117f1b4Smrg GLint elementSize; 2597117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 2607117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2617117f1b4Smrg 2627117f1b4Smrg if (stride < 0) { 2637117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glFogCoordPointer(stride)" ); 2647117f1b4Smrg return; 2657117f1b4Smrg } 2667117f1b4Smrg 2677117f1b4Smrg switch (type) { 2687117f1b4Smrg case GL_FLOAT: 2697117f1b4Smrg elementSize = sizeof(GLfloat); 2707117f1b4Smrg break; 2717117f1b4Smrg case GL_DOUBLE: 2727117f1b4Smrg elementSize = sizeof(GLdouble); 2737117f1b4Smrg break; 2747117f1b4Smrg default: 2757117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glFogCoordPointer(type)" ); 2767117f1b4Smrg return; 2777117f1b4Smrg } 2787117f1b4Smrg 2797117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->FogCoord, _NEW_ARRAY_FOGCOORD, 2807117f1b4Smrg elementSize, 1, type, stride, GL_FALSE, ptr); 2817117f1b4Smrg 2827117f1b4Smrg if (ctx->Driver.FogCoordPointer) 2837117f1b4Smrg ctx->Driver.FogCoordPointer( ctx, type, stride, ptr ); 2847117f1b4Smrg} 2857117f1b4Smrg 2867117f1b4Smrg 2877117f1b4Smrgvoid GLAPIENTRY 2887117f1b4Smrg_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 2897117f1b4Smrg{ 2907117f1b4Smrg GLsizei elementSize; 2917117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 2927117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2937117f1b4Smrg 2947117f1b4Smrg if (stride < 0) { 2957117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glIndexPointer(stride)" ); 2967117f1b4Smrg return; 2977117f1b4Smrg } 2987117f1b4Smrg 2997117f1b4Smrg switch (type) { 3007117f1b4Smrg case GL_UNSIGNED_BYTE: 3017117f1b4Smrg elementSize = sizeof(GLubyte); 3027117f1b4Smrg break; 3037117f1b4Smrg case GL_SHORT: 3047117f1b4Smrg elementSize = sizeof(GLshort); 3057117f1b4Smrg break; 3067117f1b4Smrg case GL_INT: 3077117f1b4Smrg elementSize = sizeof(GLint); 3087117f1b4Smrg break; 3097117f1b4Smrg case GL_FLOAT: 3107117f1b4Smrg elementSize = sizeof(GLfloat); 3117117f1b4Smrg break; 3127117f1b4Smrg case GL_DOUBLE: 3137117f1b4Smrg elementSize = sizeof(GLdouble); 3147117f1b4Smrg break; 3157117f1b4Smrg default: 3167117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" ); 3177117f1b4Smrg return; 3187117f1b4Smrg } 3197117f1b4Smrg 3207117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Index, _NEW_ARRAY_INDEX, 3217117f1b4Smrg elementSize, 1, type, stride, GL_FALSE, ptr); 3227117f1b4Smrg 3237117f1b4Smrg if (ctx->Driver.IndexPointer) 3247117f1b4Smrg ctx->Driver.IndexPointer( ctx, type, stride, ptr ); 3257117f1b4Smrg} 3267117f1b4Smrg 3277117f1b4Smrg 3287117f1b4Smrgvoid GLAPIENTRY 3297117f1b4Smrg_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 3307117f1b4Smrg GLsizei stride, const GLvoid *ptr) 3317117f1b4Smrg{ 3327117f1b4Smrg GLsizei elementSize; 3337117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 3347117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3357117f1b4Smrg 3367117f1b4Smrg if (size != 3 && size != 4) { 3377117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(size)" ); 3387117f1b4Smrg return; 3397117f1b4Smrg } 3407117f1b4Smrg if (stride < 0) { 3417117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(stride)" ); 3427117f1b4Smrg return; 3437117f1b4Smrg } 3447117f1b4Smrg 3457117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 3467117f1b4Smrg _mesa_debug(ctx, "glSecondaryColorPointer( sz %d type %s stride %d )\n", 3477117f1b4Smrg size, _mesa_lookup_enum_by_nr( type ), stride); 3487117f1b4Smrg 3497117f1b4Smrg switch (type) { 3507117f1b4Smrg case GL_BYTE: 3517117f1b4Smrg elementSize = size * sizeof(GLbyte); 3527117f1b4Smrg break; 3537117f1b4Smrg case GL_UNSIGNED_BYTE: 3547117f1b4Smrg elementSize = size * sizeof(GLubyte); 3557117f1b4Smrg break; 3567117f1b4Smrg case GL_SHORT: 3577117f1b4Smrg elementSize = size * sizeof(GLshort); 3587117f1b4Smrg break; 3597117f1b4Smrg case GL_UNSIGNED_SHORT: 3607117f1b4Smrg elementSize = size * sizeof(GLushort); 3617117f1b4Smrg break; 3627117f1b4Smrg case GL_INT: 3637117f1b4Smrg elementSize = size * sizeof(GLint); 3647117f1b4Smrg break; 3657117f1b4Smrg case GL_UNSIGNED_INT: 3667117f1b4Smrg elementSize = size * sizeof(GLuint); 3677117f1b4Smrg break; 3687117f1b4Smrg case GL_FLOAT: 3697117f1b4Smrg elementSize = size * sizeof(GLfloat); 3707117f1b4Smrg break; 3717117f1b4Smrg case GL_DOUBLE: 3727117f1b4Smrg elementSize = size * sizeof(GLdouble); 3737117f1b4Smrg break; 3747117f1b4Smrg default: 3757117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type)" ); 3767117f1b4Smrg return; 3777117f1b4Smrg } 3787117f1b4Smrg 3797117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->SecondaryColor, _NEW_ARRAY_COLOR1, 3807117f1b4Smrg elementSize, size, type, stride, GL_TRUE, ptr); 3817117f1b4Smrg 3827117f1b4Smrg if (ctx->Driver.SecondaryColorPointer) 3837117f1b4Smrg ctx->Driver.SecondaryColorPointer( ctx, size, type, stride, ptr ); 3847117f1b4Smrg} 3857117f1b4Smrg 3867117f1b4Smrg 3877117f1b4Smrgvoid GLAPIENTRY 3887117f1b4Smrg_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 3897117f1b4Smrg const GLvoid *ptr) 3907117f1b4Smrg{ 3917117f1b4Smrg GLint elementSize; 3927117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 3937117f1b4Smrg const GLuint unit = ctx->Array.ActiveTexture; 3947117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3957117f1b4Smrg 3967117f1b4Smrg if (size < 1 || size > 4) { 3977117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(size)" ); 3987117f1b4Smrg return; 3997117f1b4Smrg } 4007117f1b4Smrg if (stride < 0) { 4017117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(stride)" ); 4027117f1b4Smrg return; 4037117f1b4Smrg } 4047117f1b4Smrg 4057117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 4067117f1b4Smrg _mesa_debug(ctx, "glTexCoordPointer(unit %u sz %d type %s stride %d)\n", 4077117f1b4Smrg unit, size, _mesa_lookup_enum_by_nr( type ), stride); 4087117f1b4Smrg 4097117f1b4Smrg /* always need to check that <type> is legal */ 4107117f1b4Smrg switch (type) { 4117117f1b4Smrg case GL_SHORT: 4127117f1b4Smrg elementSize = size * sizeof(GLshort); 4137117f1b4Smrg break; 4147117f1b4Smrg case GL_INT: 4157117f1b4Smrg elementSize = size * sizeof(GLint); 4167117f1b4Smrg break; 4177117f1b4Smrg case GL_FLOAT: 4187117f1b4Smrg elementSize = size * sizeof(GLfloat); 4197117f1b4Smrg break; 4207117f1b4Smrg case GL_DOUBLE: 4217117f1b4Smrg elementSize = size * sizeof(GLdouble); 4227117f1b4Smrg break; 423c1f859d4Smrg#if FEATURE_fixedpt 424c1f859d4Smrg case GL_FIXED: 425c1f859d4Smrg elementSize = size * sizeof(GLfixed); 426c1f859d4Smrg break; 427c1f859d4Smrg#endif 428c1f859d4Smrg#if FEATURE_vertex_array_byte 429c1f859d4Smrg case GL_BYTE: 430c1f859d4Smrg elementSize = size * sizeof(GLbyte); 431c1f859d4Smrg break; 432c1f859d4Smrg#endif 4337117f1b4Smrg default: 4347117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type)" ); 4357117f1b4Smrg return; 4367117f1b4Smrg } 4377117f1b4Smrg 4387117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->TexCoord[unit], 4397117f1b4Smrg _NEW_ARRAY_TEXCOORD(unit), 4407117f1b4Smrg elementSize, size, type, stride, GL_FALSE, ptr); 4417117f1b4Smrg 4427117f1b4Smrg if (ctx->Driver.TexCoordPointer) 4437117f1b4Smrg ctx->Driver.TexCoordPointer( ctx, size, type, stride, ptr ); 4447117f1b4Smrg} 4457117f1b4Smrg 4467117f1b4Smrg 4477117f1b4Smrgvoid GLAPIENTRY 4487117f1b4Smrg_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 4497117f1b4Smrg{ 4507117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 4517117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 4527117f1b4Smrg 4537117f1b4Smrg if (stride < 0) { 4547117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" ); 4557117f1b4Smrg return; 4567117f1b4Smrg } 4577117f1b4Smrg 4587117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->EdgeFlag, _NEW_ARRAY_EDGEFLAG, 4597117f1b4Smrg sizeof(GLboolean), 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, ptr); 4607117f1b4Smrg 4617117f1b4Smrg if (ctx->Driver.EdgeFlagPointer) 4627117f1b4Smrg ctx->Driver.EdgeFlagPointer( ctx, stride, ptr ); 4637117f1b4Smrg} 4647117f1b4Smrg 4657117f1b4Smrg 466c1f859d4Smrgvoid GLAPIENTRY 467c1f859d4Smrg_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 468c1f859d4Smrg{ 469c1f859d4Smrg GLsizei elementSize; 470c1f859d4Smrg GET_CURRENT_CONTEXT(ctx); 471c1f859d4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 472c1f859d4Smrg 473c1f859d4Smrg if (stride < 0) { 474c1f859d4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glPointSizePointer(stride)" ); 475c1f859d4Smrg return; 476c1f859d4Smrg } 477c1f859d4Smrg 478c1f859d4Smrg switch (type) { 479c1f859d4Smrg case GL_FLOAT: 480c1f859d4Smrg elementSize = sizeof(GLfloat); 481c1f859d4Smrg break; 482c1f859d4Smrg#if FEATURE_fixedpt 483c1f859d4Smrg case GL_FIXED: 484c1f859d4Smrg elementSize = sizeof(GLfixed); 485c1f859d4Smrg break; 486c1f859d4Smrg#endif 487c1f859d4Smrg default: 488c1f859d4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glPointSizePointer(type)" ); 489c1f859d4Smrg return; 490c1f859d4Smrg } 491c1f859d4Smrg 492c1f859d4Smrg update_array(ctx, &ctx->Array.ArrayObj->PointSize, _NEW_ARRAY_POINT_SIZE, 493c1f859d4Smrg elementSize, 1, type, stride, GL_FALSE, ptr); 494c1f859d4Smrg} 495c1f859d4Smrg 496c1f859d4Smrg 4977117f1b4Smrg#if FEATURE_NV_vertex_program 4987117f1b4Smrgvoid GLAPIENTRY 4997117f1b4Smrg_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 5007117f1b4Smrg GLsizei stride, const GLvoid *ptr) 5017117f1b4Smrg{ 5027117f1b4Smrg GLboolean normalized = GL_FALSE; 5037117f1b4Smrg GLsizei elementSize; 5047117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 5057117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 5067117f1b4Smrg 5077117f1b4Smrg if (index >= MAX_VERTEX_PROGRAM_ATTRIBS) { 5087117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 5097117f1b4Smrg return; 5107117f1b4Smrg } 5117117f1b4Smrg 5127117f1b4Smrg if (size < 1 || size > 4) { 5137117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size)"); 5147117f1b4Smrg return; 5157117f1b4Smrg } 5167117f1b4Smrg 5177117f1b4Smrg if (stride < 0) { 5187117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(stride)"); 5197117f1b4Smrg return; 5207117f1b4Smrg } 5217117f1b4Smrg 5227117f1b4Smrg if (type == GL_UNSIGNED_BYTE && size != 4) { 5237117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 5247117f1b4Smrg return; 5257117f1b4Smrg } 5267117f1b4Smrg 5277117f1b4Smrg /* check for valid 'type' and compute StrideB right away */ 5287117f1b4Smrg switch (type) { 5297117f1b4Smrg case GL_UNSIGNED_BYTE: 5307117f1b4Smrg normalized = GL_TRUE; 5317117f1b4Smrg elementSize = size * sizeof(GLubyte); 5327117f1b4Smrg break; 5337117f1b4Smrg case GL_SHORT: 5347117f1b4Smrg elementSize = size * sizeof(GLshort); 5357117f1b4Smrg break; 5367117f1b4Smrg case GL_FLOAT: 5377117f1b4Smrg elementSize = size * sizeof(GLfloat); 5387117f1b4Smrg break; 5397117f1b4Smrg case GL_DOUBLE: 5407117f1b4Smrg elementSize = size * sizeof(GLdouble); 5417117f1b4Smrg break; 5427117f1b4Smrg default: 5437117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type)" ); 5447117f1b4Smrg return; 5457117f1b4Smrg } 5467117f1b4Smrg 5477117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index], 5487117f1b4Smrg _NEW_ARRAY_ATTRIB(index), 5497117f1b4Smrg elementSize, size, type, stride, normalized, ptr); 5507117f1b4Smrg 5517117f1b4Smrg if (ctx->Driver.VertexAttribPointer) 5527117f1b4Smrg ctx->Driver.VertexAttribPointer( ctx, index, size, type, stride, ptr ); 5537117f1b4Smrg} 5547117f1b4Smrg#endif 5557117f1b4Smrg 5567117f1b4Smrg 5577117f1b4Smrg#if FEATURE_ARB_vertex_program 5587117f1b4Smrgvoid GLAPIENTRY 5597117f1b4Smrg_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 5607117f1b4Smrg GLboolean normalized, 5617117f1b4Smrg GLsizei stride, const GLvoid *ptr) 5627117f1b4Smrg{ 5637117f1b4Smrg GLsizei elementSize; 5647117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 5657117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 5667117f1b4Smrg 5677117f1b4Smrg if (index >= ctx->Const.VertexProgram.MaxAttribs) { 5687117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 5697117f1b4Smrg return; 5707117f1b4Smrg } 5717117f1b4Smrg 5727117f1b4Smrg if (size < 1 || size > 4) { 5737117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(size)"); 5747117f1b4Smrg return; 5757117f1b4Smrg } 5767117f1b4Smrg 5777117f1b4Smrg if (stride < 0) { 5787117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(stride)"); 5797117f1b4Smrg return; 5807117f1b4Smrg } 5817117f1b4Smrg 5827117f1b4Smrg /* check for valid 'type' and compute StrideB right away */ 5837117f1b4Smrg /* NOTE: more types are supported here than in the NV extension */ 5847117f1b4Smrg switch (type) { 5857117f1b4Smrg case GL_BYTE: 5867117f1b4Smrg elementSize = size * sizeof(GLbyte); 5877117f1b4Smrg break; 5887117f1b4Smrg case GL_UNSIGNED_BYTE: 5897117f1b4Smrg elementSize = size * sizeof(GLubyte); 5907117f1b4Smrg break; 5917117f1b4Smrg case GL_SHORT: 5927117f1b4Smrg elementSize = size * sizeof(GLshort); 5937117f1b4Smrg break; 5947117f1b4Smrg case GL_UNSIGNED_SHORT: 5957117f1b4Smrg elementSize = size * sizeof(GLushort); 5967117f1b4Smrg break; 5977117f1b4Smrg case GL_INT: 5987117f1b4Smrg elementSize = size * sizeof(GLint); 5997117f1b4Smrg break; 6007117f1b4Smrg case GL_UNSIGNED_INT: 6017117f1b4Smrg elementSize = size * sizeof(GLuint); 6027117f1b4Smrg break; 6037117f1b4Smrg case GL_FLOAT: 6047117f1b4Smrg elementSize = size * sizeof(GLfloat); 6057117f1b4Smrg break; 6067117f1b4Smrg case GL_DOUBLE: 6077117f1b4Smrg elementSize = size * sizeof(GLdouble); 6087117f1b4Smrg break; 609c1f859d4Smrg#if FEATURE_fixedpt 610c1f859d4Smrg case GL_FIXED: 611c1f859d4Smrg elementSize = size * sizeof(GLfixed); 612c1f859d4Smrg break; 613c1f859d4Smrg#endif 6147117f1b4Smrg default: 6157117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerARB(type)" ); 6167117f1b4Smrg return; 6177117f1b4Smrg } 6187117f1b4Smrg 6197117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index], 6207117f1b4Smrg _NEW_ARRAY_ATTRIB(index), 6217117f1b4Smrg elementSize, size, type, stride, normalized, ptr); 6227117f1b4Smrg 6237117f1b4Smrg if (ctx->Driver.VertexAttribPointer) 6247117f1b4Smrg ctx->Driver.VertexAttribPointer(ctx, index, size, type, stride, ptr); 6257117f1b4Smrg} 6267117f1b4Smrg#endif 6277117f1b4Smrg 6287117f1b4Smrg 6297117f1b4Smrgvoid GLAPIENTRY 6307117f1b4Smrg_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 6317117f1b4Smrg GLsizei count, const GLvoid *ptr) 6327117f1b4Smrg{ 6337117f1b4Smrg (void) count; 6347117f1b4Smrg _mesa_VertexPointer(size, type, stride, ptr); 6357117f1b4Smrg} 6367117f1b4Smrg 6377117f1b4Smrg 6387117f1b4Smrgvoid GLAPIENTRY 6397117f1b4Smrg_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 6407117f1b4Smrg const GLvoid *ptr) 6417117f1b4Smrg{ 6427117f1b4Smrg (void) count; 6437117f1b4Smrg _mesa_NormalPointer(type, stride, ptr); 6447117f1b4Smrg} 6457117f1b4Smrg 6467117f1b4Smrg 6477117f1b4Smrgvoid GLAPIENTRY 6487117f1b4Smrg_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 6497117f1b4Smrg const GLvoid *ptr) 6507117f1b4Smrg{ 6517117f1b4Smrg (void) count; 6527117f1b4Smrg _mesa_ColorPointer(size, type, stride, ptr); 6537117f1b4Smrg} 6547117f1b4Smrg 6557117f1b4Smrg 6567117f1b4Smrgvoid GLAPIENTRY 6577117f1b4Smrg_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 6587117f1b4Smrg const GLvoid *ptr) 6597117f1b4Smrg{ 6607117f1b4Smrg (void) count; 6617117f1b4Smrg _mesa_IndexPointer(type, stride, ptr); 6627117f1b4Smrg} 6637117f1b4Smrg 6647117f1b4Smrg 6657117f1b4Smrgvoid GLAPIENTRY 6667117f1b4Smrg_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 6677117f1b4Smrg GLsizei count, const GLvoid *ptr) 6687117f1b4Smrg{ 6697117f1b4Smrg (void) count; 6707117f1b4Smrg _mesa_TexCoordPointer(size, type, stride, ptr); 6717117f1b4Smrg} 6727117f1b4Smrg 6737117f1b4Smrg 6747117f1b4Smrgvoid GLAPIENTRY 6757117f1b4Smrg_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 6767117f1b4Smrg{ 6777117f1b4Smrg (void) count; 6787117f1b4Smrg _mesa_EdgeFlagPointer(stride, ptr); 6797117f1b4Smrg} 6807117f1b4Smrg 6817117f1b4Smrg 6827117f1b4Smrgvoid GLAPIENTRY 6837117f1b4Smrg_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 6847117f1b4Smrg{ 6857117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6867117f1b4Smrg GLboolean tflag, cflag, nflag; /* enable/disable flags */ 6877117f1b4Smrg GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 6887117f1b4Smrg GLenum ctype = 0; /* color type */ 6897117f1b4Smrg GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 6907117f1b4Smrg const GLint toffset = 0; /* always zero */ 6917117f1b4Smrg GLint defstride; /* default stride */ 6927117f1b4Smrg GLint c, f; 6937117f1b4Smrg 6947117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 6957117f1b4Smrg 6967117f1b4Smrg f = sizeof(GLfloat); 6977117f1b4Smrg c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 6987117f1b4Smrg 6997117f1b4Smrg if (stride < 0) { 7007117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 7017117f1b4Smrg return; 7027117f1b4Smrg } 7037117f1b4Smrg 7047117f1b4Smrg switch (format) { 7057117f1b4Smrg case GL_V2F: 7067117f1b4Smrg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 7077117f1b4Smrg tcomps = 0; ccomps = 0; vcomps = 2; 7087117f1b4Smrg voffset = 0; 7097117f1b4Smrg defstride = 2*f; 7107117f1b4Smrg break; 7117117f1b4Smrg case GL_V3F: 7127117f1b4Smrg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 7137117f1b4Smrg tcomps = 0; ccomps = 0; vcomps = 3; 7147117f1b4Smrg voffset = 0; 7157117f1b4Smrg defstride = 3*f; 7167117f1b4Smrg break; 7177117f1b4Smrg case GL_C4UB_V2F: 7187117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 7197117f1b4Smrg tcomps = 0; ccomps = 4; vcomps = 2; 7207117f1b4Smrg ctype = GL_UNSIGNED_BYTE; 7217117f1b4Smrg coffset = 0; 7227117f1b4Smrg voffset = c; 7237117f1b4Smrg defstride = c + 2*f; 7247117f1b4Smrg break; 7257117f1b4Smrg case GL_C4UB_V3F: 7267117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 7277117f1b4Smrg tcomps = 0; ccomps = 4; vcomps = 3; 7287117f1b4Smrg ctype = GL_UNSIGNED_BYTE; 7297117f1b4Smrg coffset = 0; 7307117f1b4Smrg voffset = c; 7317117f1b4Smrg defstride = c + 3*f; 7327117f1b4Smrg break; 7337117f1b4Smrg case GL_C3F_V3F: 7347117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 7357117f1b4Smrg tcomps = 0; ccomps = 3; vcomps = 3; 7367117f1b4Smrg ctype = GL_FLOAT; 7377117f1b4Smrg coffset = 0; 7387117f1b4Smrg voffset = 3*f; 7397117f1b4Smrg defstride = 6*f; 7407117f1b4Smrg break; 7417117f1b4Smrg case GL_N3F_V3F: 7427117f1b4Smrg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 7437117f1b4Smrg tcomps = 0; ccomps = 0; vcomps = 3; 7447117f1b4Smrg noffset = 0; 7457117f1b4Smrg voffset = 3*f; 7467117f1b4Smrg defstride = 6*f; 7477117f1b4Smrg break; 7487117f1b4Smrg case GL_C4F_N3F_V3F: 7497117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 7507117f1b4Smrg tcomps = 0; ccomps = 4; vcomps = 3; 7517117f1b4Smrg ctype = GL_FLOAT; 7527117f1b4Smrg coffset = 0; 7537117f1b4Smrg noffset = 4*f; 7547117f1b4Smrg voffset = 7*f; 7557117f1b4Smrg defstride = 10*f; 7567117f1b4Smrg break; 7577117f1b4Smrg case GL_T2F_V3F: 7587117f1b4Smrg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 7597117f1b4Smrg tcomps = 2; ccomps = 0; vcomps = 3; 7607117f1b4Smrg voffset = 2*f; 7617117f1b4Smrg defstride = 5*f; 7627117f1b4Smrg break; 7637117f1b4Smrg case GL_T4F_V4F: 7647117f1b4Smrg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 7657117f1b4Smrg tcomps = 4; ccomps = 0; vcomps = 4; 7667117f1b4Smrg voffset = 4*f; 7677117f1b4Smrg defstride = 8*f; 7687117f1b4Smrg break; 7697117f1b4Smrg case GL_T2F_C4UB_V3F: 7707117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 7717117f1b4Smrg tcomps = 2; ccomps = 4; vcomps = 3; 7727117f1b4Smrg ctype = GL_UNSIGNED_BYTE; 7737117f1b4Smrg coffset = 2*f; 7747117f1b4Smrg voffset = c+2*f; 7757117f1b4Smrg defstride = c+5*f; 7767117f1b4Smrg break; 7777117f1b4Smrg case GL_T2F_C3F_V3F: 7787117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 7797117f1b4Smrg tcomps = 2; ccomps = 3; vcomps = 3; 7807117f1b4Smrg ctype = GL_FLOAT; 7817117f1b4Smrg coffset = 2*f; 7827117f1b4Smrg voffset = 5*f; 7837117f1b4Smrg defstride = 8*f; 7847117f1b4Smrg break; 7857117f1b4Smrg case GL_T2F_N3F_V3F: 7867117f1b4Smrg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 7877117f1b4Smrg tcomps = 2; ccomps = 0; vcomps = 3; 7887117f1b4Smrg noffset = 2*f; 7897117f1b4Smrg voffset = 5*f; 7907117f1b4Smrg defstride = 8*f; 7917117f1b4Smrg break; 7927117f1b4Smrg case GL_T2F_C4F_N3F_V3F: 7937117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 7947117f1b4Smrg tcomps = 2; ccomps = 4; vcomps = 3; 7957117f1b4Smrg ctype = GL_FLOAT; 7967117f1b4Smrg coffset = 2*f; 7977117f1b4Smrg noffset = 6*f; 7987117f1b4Smrg voffset = 9*f; 7997117f1b4Smrg defstride = 12*f; 8007117f1b4Smrg break; 8017117f1b4Smrg case GL_T4F_C4F_N3F_V4F: 8027117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 8037117f1b4Smrg tcomps = 4; ccomps = 4; vcomps = 4; 8047117f1b4Smrg ctype = GL_FLOAT; 8057117f1b4Smrg coffset = 4*f; 8067117f1b4Smrg noffset = 8*f; 8077117f1b4Smrg voffset = 11*f; 8087117f1b4Smrg defstride = 15*f; 8097117f1b4Smrg break; 8107117f1b4Smrg default: 8117117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 8127117f1b4Smrg return; 8137117f1b4Smrg } 8147117f1b4Smrg 8157117f1b4Smrg if (stride==0) { 8167117f1b4Smrg stride = defstride; 8177117f1b4Smrg } 8187117f1b4Smrg 8197117f1b4Smrg _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 8207117f1b4Smrg _mesa_DisableClientState( GL_INDEX_ARRAY ); 8217117f1b4Smrg /* XXX also disable secondary color and generic arrays? */ 8227117f1b4Smrg 8237117f1b4Smrg /* Texcoords */ 8247117f1b4Smrg if (tflag) { 8257117f1b4Smrg _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 8267117f1b4Smrg _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 8277117f1b4Smrg (GLubyte *) pointer + toffset ); 8287117f1b4Smrg } 8297117f1b4Smrg else { 8307117f1b4Smrg _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 8317117f1b4Smrg } 8327117f1b4Smrg 8337117f1b4Smrg /* Color */ 8347117f1b4Smrg if (cflag) { 8357117f1b4Smrg _mesa_EnableClientState( GL_COLOR_ARRAY ); 8367117f1b4Smrg _mesa_ColorPointer( ccomps, ctype, stride, 8377117f1b4Smrg (GLubyte *) pointer + coffset ); 8387117f1b4Smrg } 8397117f1b4Smrg else { 8407117f1b4Smrg _mesa_DisableClientState( GL_COLOR_ARRAY ); 8417117f1b4Smrg } 8427117f1b4Smrg 8437117f1b4Smrg 8447117f1b4Smrg /* Normals */ 8457117f1b4Smrg if (nflag) { 8467117f1b4Smrg _mesa_EnableClientState( GL_NORMAL_ARRAY ); 8477117f1b4Smrg _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 8487117f1b4Smrg } 8497117f1b4Smrg else { 8507117f1b4Smrg _mesa_DisableClientState( GL_NORMAL_ARRAY ); 8517117f1b4Smrg } 8527117f1b4Smrg 8537117f1b4Smrg /* Vertices */ 8547117f1b4Smrg _mesa_EnableClientState( GL_VERTEX_ARRAY ); 8557117f1b4Smrg _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 8567117f1b4Smrg (GLubyte *) pointer + voffset ); 8577117f1b4Smrg} 8587117f1b4Smrg 8597117f1b4Smrg 8607117f1b4Smrgvoid GLAPIENTRY 8617117f1b4Smrg_mesa_LockArraysEXT(GLint first, GLsizei count) 8627117f1b4Smrg{ 8637117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 8647117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 8657117f1b4Smrg 8667117f1b4Smrg if (MESA_VERBOSE & VERBOSE_API) 8677117f1b4Smrg _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 8687117f1b4Smrg 869c1f859d4Smrg if (first < 0) { 870c1f859d4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 871c1f859d4Smrg return; 8727117f1b4Smrg } 873c1f859d4Smrg if (count <= 0) { 874c1f859d4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 875c1f859d4Smrg return; 876c1f859d4Smrg } 877c1f859d4Smrg if (ctx->Array.LockCount != 0) { 878c1f859d4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 879c1f859d4Smrg return; 8807117f1b4Smrg } 8817117f1b4Smrg 882c1f859d4Smrg ctx->Array.LockFirst = first; 883c1f859d4Smrg ctx->Array.LockCount = count; 884c1f859d4Smrg 8857117f1b4Smrg ctx->NewState |= _NEW_ARRAY; 8867117f1b4Smrg ctx->Array.NewState |= _NEW_ARRAY_ALL; 8877117f1b4Smrg 8887117f1b4Smrg if (ctx->Driver.LockArraysEXT) 8897117f1b4Smrg ctx->Driver.LockArraysEXT( ctx, first, count ); 8907117f1b4Smrg} 8917117f1b4Smrg 8927117f1b4Smrg 8937117f1b4Smrgvoid GLAPIENTRY 8947117f1b4Smrg_mesa_UnlockArraysEXT( void ) 8957117f1b4Smrg{ 8967117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 8977117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 8987117f1b4Smrg 8997117f1b4Smrg if (MESA_VERBOSE & VERBOSE_API) 9007117f1b4Smrg _mesa_debug(ctx, "glUnlockArrays\n"); 9017117f1b4Smrg 902c1f859d4Smrg if (ctx->Array.LockCount == 0) { 903c1f859d4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 904c1f859d4Smrg return; 905c1f859d4Smrg } 906c1f859d4Smrg 9077117f1b4Smrg ctx->Array.LockFirst = 0; 9087117f1b4Smrg ctx->Array.LockCount = 0; 9097117f1b4Smrg ctx->NewState |= _NEW_ARRAY; 9107117f1b4Smrg ctx->Array.NewState |= _NEW_ARRAY_ALL; 9117117f1b4Smrg 9127117f1b4Smrg if (ctx->Driver.UnlockArraysEXT) 9137117f1b4Smrg ctx->Driver.UnlockArraysEXT( ctx ); 9147117f1b4Smrg} 9157117f1b4Smrg 9167117f1b4Smrg 9177117f1b4Smrg/* GL_EXT_multi_draw_arrays */ 9187117f1b4Smrg/* Somebody forgot to spec the first and count parameters as const! <sigh> */ 9197117f1b4Smrgvoid GLAPIENTRY 9207117f1b4Smrg_mesa_MultiDrawArraysEXT( GLenum mode, GLint *first, 9217117f1b4Smrg GLsizei *count, GLsizei primcount ) 9227117f1b4Smrg{ 9237117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9247117f1b4Smrg GLint i; 9257117f1b4Smrg 9267117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9277117f1b4Smrg 9287117f1b4Smrg for (i = 0; i < primcount; i++) { 9297117f1b4Smrg if (count[i] > 0) { 9307117f1b4Smrg CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 9317117f1b4Smrg } 9327117f1b4Smrg } 9337117f1b4Smrg} 9347117f1b4Smrg 9357117f1b4Smrg 9367117f1b4Smrg/* GL_EXT_multi_draw_arrays */ 9377117f1b4Smrgvoid GLAPIENTRY 9387117f1b4Smrg_mesa_MultiDrawElementsEXT( GLenum mode, const GLsizei *count, GLenum type, 9397117f1b4Smrg const GLvoid **indices, GLsizei primcount ) 9407117f1b4Smrg{ 9417117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9427117f1b4Smrg GLint i; 9437117f1b4Smrg 9447117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9457117f1b4Smrg 9467117f1b4Smrg for (i = 0; i < primcount; i++) { 9477117f1b4Smrg if (count[i] > 0) { 9487117f1b4Smrg CALL_DrawElements(ctx->Exec, (mode, count[i], type, indices[i])); 9497117f1b4Smrg } 9507117f1b4Smrg } 9517117f1b4Smrg} 9527117f1b4Smrg 9537117f1b4Smrg 9547117f1b4Smrg/* GL_IBM_multimode_draw_arrays */ 9557117f1b4Smrgvoid GLAPIENTRY 9567117f1b4Smrg_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 9577117f1b4Smrg const GLsizei * count, 9587117f1b4Smrg GLsizei primcount, GLint modestride ) 9597117f1b4Smrg{ 9607117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9617117f1b4Smrg GLint i; 9627117f1b4Smrg 9637117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9647117f1b4Smrg 9657117f1b4Smrg for ( i = 0 ; i < primcount ; i++ ) { 9667117f1b4Smrg if ( count[i] > 0 ) { 9677117f1b4Smrg GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 9687117f1b4Smrg CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 9697117f1b4Smrg } 9707117f1b4Smrg } 9717117f1b4Smrg} 9727117f1b4Smrg 9737117f1b4Smrg 9747117f1b4Smrg/* GL_IBM_multimode_draw_arrays */ 9757117f1b4Smrgvoid GLAPIENTRY 9767117f1b4Smrg_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 9777117f1b4Smrg GLenum type, const GLvoid * const * indices, 9787117f1b4Smrg GLsizei primcount, GLint modestride ) 9797117f1b4Smrg{ 9807117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9817117f1b4Smrg GLint i; 9827117f1b4Smrg 9837117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9847117f1b4Smrg 9857117f1b4Smrg /* XXX not sure about ARB_vertex_buffer_object handling here */ 9867117f1b4Smrg 9877117f1b4Smrg for ( i = 0 ; i < primcount ; i++ ) { 9887117f1b4Smrg if ( count[i] > 0 ) { 9897117f1b4Smrg GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 9907117f1b4Smrg CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 9917117f1b4Smrg } 9927117f1b4Smrg } 9937117f1b4Smrg} 9947117f1b4Smrg 9957117f1b4Smrg 9967117f1b4Smrg/** 9977117f1b4Smrg * Initialize vertex array state for given context. 9987117f1b4Smrg */ 9997117f1b4Smrgvoid 10007117f1b4Smrg_mesa_init_varray(GLcontext *ctx) 10017117f1b4Smrg{ 10027117f1b4Smrg ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0); 10037117f1b4Smrg ctx->Array.ArrayObj = ctx->Array.DefaultArrayObj; 10047117f1b4Smrg 10057117f1b4Smrg ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 10067117f1b4Smrg} 1007