varray.c revision cdc920a0
17117f1b4Smrg/* 27117f1b4Smrg * Mesa 3-D graphics library 34a49301eSmrg * Version: 7.6 47117f1b4Smrg * 5c1f859d4Smrg * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 64a49301eSmrg * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 77117f1b4Smrg * 87117f1b4Smrg * Permission is hereby granted, free of charge, to any person obtaining a 97117f1b4Smrg * copy of this software and associated documentation files (the "Software"), 107117f1b4Smrg * to deal in the Software without restriction, including without limitation 117117f1b4Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 127117f1b4Smrg * and/or sell copies of the Software, and to permit persons to whom the 137117f1b4Smrg * Software is furnished to do so, subject to the following conditions: 147117f1b4Smrg * 157117f1b4Smrg * The above copyright notice and this permission notice shall be included 167117f1b4Smrg * in all copies or substantial portions of the Software. 177117f1b4Smrg * 187117f1b4Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 197117f1b4Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 207117f1b4Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 217117f1b4Smrg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 227117f1b4Smrg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 237117f1b4Smrg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 247117f1b4Smrg */ 257117f1b4Smrg 267117f1b4Smrg 277117f1b4Smrg#include "glheader.h" 287117f1b4Smrg#include "imports.h" 297117f1b4Smrg#include "bufferobj.h" 307117f1b4Smrg#include "context.h" 317117f1b4Smrg#include "enable.h" 327117f1b4Smrg#include "enums.h" 334a49301eSmrg#include "hash.h" 347117f1b4Smrg#include "mtypes.h" 357117f1b4Smrg#include "varray.h" 367117f1b4Smrg#include "arrayobj.h" 37cdc920a0Smrg#include "main/dispatch.h" 387117f1b4Smrg 397117f1b4Smrg 407117f1b4Smrg/** 414a49301eSmrg * Set the fields of a vertex array. 424a49301eSmrg * Also do an error check for GL_ARB_vertex_array_object: check that 434a49301eSmrg * all arrays reside in VBOs when using a vertex array object. 447117f1b4Smrg * 457117f1b4Smrg * \param array the array to update 467117f1b4Smrg * \param dirtyBit which bit to set in ctx->Array.NewState for this array 477117f1b4Smrg * \param elementSize size of each array element, in bytes 487117f1b4Smrg * \param size components per element (1, 2, 3 or 4) 497117f1b4Smrg * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 504a49301eSmrg * \param format either GL_RGBA or GL_BGRA 517117f1b4Smrg * \param stride stride between elements, in elements 527117f1b4Smrg * \param normalized are integer types converted to floats in [-1, 1]? 537117f1b4Smrg * \param ptr the address (or offset inside VBO) of the array data 547117f1b4Smrg */ 557117f1b4Smrgstatic void 567117f1b4Smrgupdate_array(GLcontext *ctx, struct gl_client_array *array, 577117f1b4Smrg GLbitfield dirtyBit, GLsizei elementSize, 584a49301eSmrg GLint size, GLenum type, GLenum format, 597117f1b4Smrg GLsizei stride, GLboolean normalized, const GLvoid *ptr) 607117f1b4Smrg{ 614a49301eSmrg ASSERT(format == GL_RGBA || format == GL_BGRA); 624a49301eSmrg 634a49301eSmrg if (ctx->Array.ArrayObj->VBOonly && 644a49301eSmrg ctx->Array.ArrayBufferObj->Name == 0) { 654a49301eSmrg /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs. 664a49301eSmrg * Generate GL_INVALID_OPERATION if that's not true. 674a49301eSmrg */ 684a49301eSmrg _mesa_error(ctx, GL_INVALID_OPERATION, 694a49301eSmrg "glVertex/Normal/EtcPointer(non-VBO array)"); 704a49301eSmrg return; 714a49301eSmrg } 724a49301eSmrg 737117f1b4Smrg array->Size = size; 747117f1b4Smrg array->Type = type; 754a49301eSmrg array->Format = format; 767117f1b4Smrg array->Stride = stride; 777117f1b4Smrg array->StrideB = stride ? stride : elementSize; 787117f1b4Smrg array->Normalized = normalized; 797117f1b4Smrg array->Ptr = (const GLubyte *) ptr; 804a49301eSmrg array->_ElementSize = elementSize; 814a49301eSmrg 82c1f859d4Smrg _mesa_reference_buffer_object(ctx, &array->BufferObj, 83c1f859d4Smrg ctx->Array.ArrayBufferObj); 84c1f859d4Smrg 857117f1b4Smrg ctx->NewState |= _NEW_ARRAY; 867117f1b4Smrg ctx->Array.NewState |= dirtyBit; 877117f1b4Smrg} 887117f1b4Smrg 897117f1b4Smrg 907117f1b4Smrgvoid GLAPIENTRY 917117f1b4Smrg_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 927117f1b4Smrg{ 937117f1b4Smrg GLsizei elementSize; 947117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 957117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 967117f1b4Smrg 977117f1b4Smrg if (size < 2 || size > 4) { 987117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(size)" ); 997117f1b4Smrg return; 1007117f1b4Smrg } 1017117f1b4Smrg if (stride < 0) { 1027117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(stride)" ); 1037117f1b4Smrg return; 1047117f1b4Smrg } 1057117f1b4Smrg 1067117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 1077117f1b4Smrg _mesa_debug(ctx, "glVertexPointer( sz %d type %s stride %d )\n", size, 1087117f1b4Smrg _mesa_lookup_enum_by_nr( type ), stride); 1097117f1b4Smrg 1107117f1b4Smrg /* always need to check that <type> is legal */ 1117117f1b4Smrg switch (type) { 1127117f1b4Smrg case GL_SHORT: 1137117f1b4Smrg elementSize = size * sizeof(GLshort); 1147117f1b4Smrg break; 1157117f1b4Smrg case GL_INT: 1167117f1b4Smrg elementSize = size * sizeof(GLint); 1177117f1b4Smrg break; 1187117f1b4Smrg case GL_FLOAT: 1197117f1b4Smrg elementSize = size * sizeof(GLfloat); 1207117f1b4Smrg break; 1217117f1b4Smrg case GL_DOUBLE: 1227117f1b4Smrg elementSize = size * sizeof(GLdouble); 1237117f1b4Smrg break; 124cdc920a0Smrg case GL_HALF_FLOAT: 125cdc920a0Smrg elementSize = size * sizeof(GLhalfARB); 126cdc920a0Smrg break; 127c1f859d4Smrg#if FEATURE_fixedpt 128c1f859d4Smrg case GL_FIXED: 129c1f859d4Smrg elementSize = size * sizeof(GLfixed); 130c1f859d4Smrg break; 131c1f859d4Smrg#endif 132c1f859d4Smrg#if FEATURE_vertex_array_byte 133c1f859d4Smrg case GL_BYTE: 134c1f859d4Smrg elementSize = size * sizeof(GLbyte); 135c1f859d4Smrg break; 136c1f859d4Smrg#endif 1377117f1b4Smrg default: 1384a49301eSmrg _mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type=%s)", 1394a49301eSmrg _mesa_lookup_enum_by_nr(type)); 1407117f1b4Smrg return; 1417117f1b4Smrg } 1427117f1b4Smrg 1437117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Vertex, _NEW_ARRAY_VERTEX, 1444a49301eSmrg elementSize, size, type, GL_RGBA, stride, GL_FALSE, ptr); 1457117f1b4Smrg} 1467117f1b4Smrg 1477117f1b4Smrg 1487117f1b4Smrgvoid GLAPIENTRY 1497117f1b4Smrg_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 1507117f1b4Smrg{ 1517117f1b4Smrg GLsizei elementSize; 1527117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 1537117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1547117f1b4Smrg 1557117f1b4Smrg if (stride < 0) { 1567117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glNormalPointer(stride)" ); 1577117f1b4Smrg return; 1587117f1b4Smrg } 1597117f1b4Smrg 1607117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 1617117f1b4Smrg _mesa_debug(ctx, "glNormalPointer( type %s stride %d )\n", 1627117f1b4Smrg _mesa_lookup_enum_by_nr( type ), stride); 1637117f1b4Smrg 1647117f1b4Smrg switch (type) { 1657117f1b4Smrg case GL_BYTE: 1667117f1b4Smrg elementSize = 3 * sizeof(GLbyte); 1677117f1b4Smrg break; 1687117f1b4Smrg case GL_SHORT: 1697117f1b4Smrg elementSize = 3 * sizeof(GLshort); 1707117f1b4Smrg break; 1717117f1b4Smrg case GL_INT: 1727117f1b4Smrg elementSize = 3 * sizeof(GLint); 1737117f1b4Smrg break; 1747117f1b4Smrg case GL_FLOAT: 1757117f1b4Smrg elementSize = 3 * sizeof(GLfloat); 1767117f1b4Smrg break; 1777117f1b4Smrg case GL_DOUBLE: 1787117f1b4Smrg elementSize = 3 * sizeof(GLdouble); 1797117f1b4Smrg break; 180cdc920a0Smrg case GL_HALF_FLOAT: 181cdc920a0Smrg elementSize = 3 * sizeof(GLhalfARB); 182cdc920a0Smrg break; 183c1f859d4Smrg#if FEATURE_fixedpt 184c1f859d4Smrg case GL_FIXED: 185c1f859d4Smrg elementSize = 3 * sizeof(GLfixed); 186c1f859d4Smrg break; 187c1f859d4Smrg#endif 1887117f1b4Smrg default: 1894a49301eSmrg _mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type=%s)", 1904a49301eSmrg _mesa_lookup_enum_by_nr(type)); 1917117f1b4Smrg return; 1927117f1b4Smrg } 1937117f1b4Smrg 1947117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Normal, _NEW_ARRAY_NORMAL, 1954a49301eSmrg elementSize, 3, type, GL_RGBA, stride, GL_TRUE, ptr); 1967117f1b4Smrg} 1977117f1b4Smrg 1987117f1b4Smrg 1997117f1b4Smrgvoid GLAPIENTRY 2007117f1b4Smrg_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 2017117f1b4Smrg{ 2027117f1b4Smrg GLsizei elementSize; 2034a49301eSmrg GLenum format; 2047117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 2057117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2067117f1b4Smrg 2077117f1b4Smrg if (size < 3 || size > 4) { 2084a49301eSmrg if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) { 2094a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, "glColorPointer(size)"); 2104a49301eSmrg return; 2114a49301eSmrg } 2127117f1b4Smrg } 2137117f1b4Smrg if (stride < 0) { 2147117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" ); 2157117f1b4Smrg return; 2167117f1b4Smrg } 2177117f1b4Smrg 2187117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 2197117f1b4Smrg _mesa_debug(ctx, "glColorPointer( sz %d type %s stride %d )\n", size, 2207117f1b4Smrg _mesa_lookup_enum_by_nr( type ), stride); 2217117f1b4Smrg 2224a49301eSmrg if (size == GL_BGRA) { 2234a49301eSmrg if (type != GL_UNSIGNED_BYTE) { 2244a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, "glColorPointer(GL_BGRA/GLubyte)"); 2254a49301eSmrg return; 2264a49301eSmrg } 2274a49301eSmrg format = GL_BGRA; 2284a49301eSmrg size = 4; 2294a49301eSmrg } 2304a49301eSmrg else { 2314a49301eSmrg format = GL_RGBA; 2324a49301eSmrg } 2334a49301eSmrg 2347117f1b4Smrg switch (type) { 2357117f1b4Smrg case GL_BYTE: 2367117f1b4Smrg elementSize = size * sizeof(GLbyte); 2377117f1b4Smrg break; 2387117f1b4Smrg case GL_UNSIGNED_BYTE: 2397117f1b4Smrg elementSize = size * sizeof(GLubyte); 2407117f1b4Smrg break; 2417117f1b4Smrg case GL_SHORT: 2427117f1b4Smrg elementSize = size * sizeof(GLshort); 2437117f1b4Smrg break; 2447117f1b4Smrg case GL_UNSIGNED_SHORT: 2457117f1b4Smrg elementSize = size * sizeof(GLushort); 2467117f1b4Smrg break; 2477117f1b4Smrg case GL_INT: 2487117f1b4Smrg elementSize = size * sizeof(GLint); 2497117f1b4Smrg break; 2507117f1b4Smrg case GL_UNSIGNED_INT: 2517117f1b4Smrg elementSize = size * sizeof(GLuint); 2527117f1b4Smrg break; 2537117f1b4Smrg case GL_FLOAT: 2547117f1b4Smrg elementSize = size * sizeof(GLfloat); 2557117f1b4Smrg break; 2567117f1b4Smrg case GL_DOUBLE: 2577117f1b4Smrg elementSize = size * sizeof(GLdouble); 2587117f1b4Smrg break; 259cdc920a0Smrg case GL_HALF_FLOAT: 260cdc920a0Smrg elementSize = size * sizeof(GLhalfARB); 261cdc920a0Smrg break; 262c1f859d4Smrg#if FEATURE_fixedpt 263c1f859d4Smrg case GL_FIXED: 264c1f859d4Smrg elementSize = size * sizeof(GLfixed); 265c1f859d4Smrg break; 266c1f859d4Smrg#endif 2677117f1b4Smrg default: 2684a49301eSmrg _mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type=%s)", 2694a49301eSmrg _mesa_lookup_enum_by_nr(type)); 2707117f1b4Smrg return; 2717117f1b4Smrg } 2727117f1b4Smrg 2737117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Color, _NEW_ARRAY_COLOR0, 2744a49301eSmrg elementSize, size, type, format, stride, GL_TRUE, ptr); 2757117f1b4Smrg} 2767117f1b4Smrg 2777117f1b4Smrg 2787117f1b4Smrgvoid GLAPIENTRY 2797117f1b4Smrg_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 2807117f1b4Smrg{ 2817117f1b4Smrg GLint elementSize; 2827117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 2837117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2847117f1b4Smrg 2857117f1b4Smrg if (stride < 0) { 2867117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glFogCoordPointer(stride)" ); 2877117f1b4Smrg return; 2887117f1b4Smrg } 2897117f1b4Smrg 2907117f1b4Smrg switch (type) { 2917117f1b4Smrg case GL_FLOAT: 2927117f1b4Smrg elementSize = sizeof(GLfloat); 2937117f1b4Smrg break; 2947117f1b4Smrg case GL_DOUBLE: 2957117f1b4Smrg elementSize = sizeof(GLdouble); 2967117f1b4Smrg break; 297cdc920a0Smrg case GL_HALF_FLOAT: 298cdc920a0Smrg elementSize = sizeof(GLhalfARB); 299cdc920a0Smrg break; 3007117f1b4Smrg default: 3017117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glFogCoordPointer(type)" ); 3027117f1b4Smrg return; 3037117f1b4Smrg } 3047117f1b4Smrg 3057117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->FogCoord, _NEW_ARRAY_FOGCOORD, 3064a49301eSmrg elementSize, 1, type, GL_RGBA, stride, GL_FALSE, ptr); 3077117f1b4Smrg} 3087117f1b4Smrg 3097117f1b4Smrg 3107117f1b4Smrgvoid GLAPIENTRY 3117117f1b4Smrg_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 3127117f1b4Smrg{ 3137117f1b4Smrg GLsizei elementSize; 3147117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 3157117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3167117f1b4Smrg 3177117f1b4Smrg if (stride < 0) { 3187117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glIndexPointer(stride)" ); 3197117f1b4Smrg return; 3207117f1b4Smrg } 3217117f1b4Smrg 3227117f1b4Smrg switch (type) { 3237117f1b4Smrg case GL_UNSIGNED_BYTE: 3247117f1b4Smrg elementSize = sizeof(GLubyte); 3257117f1b4Smrg break; 3267117f1b4Smrg case GL_SHORT: 3277117f1b4Smrg elementSize = sizeof(GLshort); 3287117f1b4Smrg break; 3297117f1b4Smrg case GL_INT: 3307117f1b4Smrg elementSize = sizeof(GLint); 3317117f1b4Smrg break; 3327117f1b4Smrg case GL_FLOAT: 3337117f1b4Smrg elementSize = sizeof(GLfloat); 3347117f1b4Smrg break; 3357117f1b4Smrg case GL_DOUBLE: 3367117f1b4Smrg elementSize = sizeof(GLdouble); 3377117f1b4Smrg break; 3387117f1b4Smrg default: 3397117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" ); 3407117f1b4Smrg return; 3417117f1b4Smrg } 3427117f1b4Smrg 3437117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->Index, _NEW_ARRAY_INDEX, 3444a49301eSmrg elementSize, 1, type, GL_RGBA, stride, GL_FALSE, ptr); 3457117f1b4Smrg} 3467117f1b4Smrg 3477117f1b4Smrg 3487117f1b4Smrgvoid GLAPIENTRY 3497117f1b4Smrg_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 3507117f1b4Smrg GLsizei stride, const GLvoid *ptr) 3517117f1b4Smrg{ 3527117f1b4Smrg GLsizei elementSize; 3534a49301eSmrg GLenum format; 3547117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 3557117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3567117f1b4Smrg 3577117f1b4Smrg if (size != 3 && size != 4) { 3584a49301eSmrg if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) { 3594a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(size)"); 3604a49301eSmrg return; 3614a49301eSmrg } 3627117f1b4Smrg } 3637117f1b4Smrg if (stride < 0) { 3647117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(stride)" ); 3657117f1b4Smrg return; 3667117f1b4Smrg } 3677117f1b4Smrg 3687117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 3697117f1b4Smrg _mesa_debug(ctx, "glSecondaryColorPointer( sz %d type %s stride %d )\n", 3707117f1b4Smrg size, _mesa_lookup_enum_by_nr( type ), stride); 3717117f1b4Smrg 3724a49301eSmrg if (size == GL_BGRA) { 3734a49301eSmrg if (type != GL_UNSIGNED_BYTE) { 3744a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, "glColorPointer(GL_BGRA/GLubyte)"); 3754a49301eSmrg return; 3764a49301eSmrg } 3774a49301eSmrg format = GL_BGRA; 3784a49301eSmrg size = 4; 3794a49301eSmrg } 3804a49301eSmrg else { 3814a49301eSmrg format = GL_RGBA; 3824a49301eSmrg } 3834a49301eSmrg 3847117f1b4Smrg switch (type) { 3857117f1b4Smrg case GL_BYTE: 3867117f1b4Smrg elementSize = size * sizeof(GLbyte); 3877117f1b4Smrg break; 3887117f1b4Smrg case GL_UNSIGNED_BYTE: 3897117f1b4Smrg elementSize = size * sizeof(GLubyte); 3907117f1b4Smrg break; 3917117f1b4Smrg case GL_SHORT: 3927117f1b4Smrg elementSize = size * sizeof(GLshort); 3937117f1b4Smrg break; 3947117f1b4Smrg case GL_UNSIGNED_SHORT: 3957117f1b4Smrg elementSize = size * sizeof(GLushort); 3967117f1b4Smrg break; 3977117f1b4Smrg case GL_INT: 3987117f1b4Smrg elementSize = size * sizeof(GLint); 3997117f1b4Smrg break; 4007117f1b4Smrg case GL_UNSIGNED_INT: 4017117f1b4Smrg elementSize = size * sizeof(GLuint); 4027117f1b4Smrg break; 4037117f1b4Smrg case GL_FLOAT: 4047117f1b4Smrg elementSize = size * sizeof(GLfloat); 4057117f1b4Smrg break; 4067117f1b4Smrg case GL_DOUBLE: 4077117f1b4Smrg elementSize = size * sizeof(GLdouble); 4087117f1b4Smrg break; 409cdc920a0Smrg case GL_HALF_FLOAT: 410cdc920a0Smrg elementSize = size * sizeof(GLhalfARB); 411cdc920a0Smrg break; 4127117f1b4Smrg default: 4134a49301eSmrg _mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type=%s)", 4144a49301eSmrg _mesa_lookup_enum_by_nr(type)); 4157117f1b4Smrg return; 4167117f1b4Smrg } 4177117f1b4Smrg 4187117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->SecondaryColor, _NEW_ARRAY_COLOR1, 4194a49301eSmrg elementSize, size, type, format, stride, GL_TRUE, ptr); 4207117f1b4Smrg} 4217117f1b4Smrg 4227117f1b4Smrg 4237117f1b4Smrgvoid GLAPIENTRY 4247117f1b4Smrg_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 4257117f1b4Smrg const GLvoid *ptr) 4267117f1b4Smrg{ 4277117f1b4Smrg GLint elementSize; 4287117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 4297117f1b4Smrg const GLuint unit = ctx->Array.ActiveTexture; 4307117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 4317117f1b4Smrg 4327117f1b4Smrg if (size < 1 || size > 4) { 4337117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(size)" ); 4347117f1b4Smrg return; 4357117f1b4Smrg } 4367117f1b4Smrg if (stride < 0) { 4377117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(stride)" ); 4387117f1b4Smrg return; 4397117f1b4Smrg } 4407117f1b4Smrg 4417117f1b4Smrg if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API)) 4427117f1b4Smrg _mesa_debug(ctx, "glTexCoordPointer(unit %u sz %d type %s stride %d)\n", 4437117f1b4Smrg unit, size, _mesa_lookup_enum_by_nr( type ), stride); 4447117f1b4Smrg 4457117f1b4Smrg /* always need to check that <type> is legal */ 4467117f1b4Smrg switch (type) { 4477117f1b4Smrg case GL_SHORT: 4487117f1b4Smrg elementSize = size * sizeof(GLshort); 4497117f1b4Smrg break; 4507117f1b4Smrg case GL_INT: 4517117f1b4Smrg elementSize = size * sizeof(GLint); 4527117f1b4Smrg break; 4537117f1b4Smrg case GL_FLOAT: 4547117f1b4Smrg elementSize = size * sizeof(GLfloat); 4557117f1b4Smrg break; 4567117f1b4Smrg case GL_DOUBLE: 4577117f1b4Smrg elementSize = size * sizeof(GLdouble); 4587117f1b4Smrg break; 459cdc920a0Smrg case GL_HALF_FLOAT: 460cdc920a0Smrg elementSize = size * sizeof(GLhalfARB); 461cdc920a0Smrg break; 462c1f859d4Smrg#if FEATURE_fixedpt 463c1f859d4Smrg case GL_FIXED: 464c1f859d4Smrg elementSize = size * sizeof(GLfixed); 465c1f859d4Smrg break; 466c1f859d4Smrg#endif 467c1f859d4Smrg#if FEATURE_vertex_array_byte 468c1f859d4Smrg case GL_BYTE: 469c1f859d4Smrg elementSize = size * sizeof(GLbyte); 470c1f859d4Smrg break; 471c1f859d4Smrg#endif 4727117f1b4Smrg default: 4734a49301eSmrg _mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type=%s)", 4744a49301eSmrg _mesa_lookup_enum_by_nr(type)); 4757117f1b4Smrg return; 4767117f1b4Smrg } 4777117f1b4Smrg 478cdc920a0Smrg ASSERT(unit < Elements(ctx->Array.ArrayObj->TexCoord)); 479cdc920a0Smrg 4807117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->TexCoord[unit], 4817117f1b4Smrg _NEW_ARRAY_TEXCOORD(unit), 4824a49301eSmrg elementSize, size, type, GL_RGBA, stride, GL_FALSE, ptr); 4837117f1b4Smrg} 4847117f1b4Smrg 4857117f1b4Smrg 4867117f1b4Smrgvoid GLAPIENTRY 4877117f1b4Smrg_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 4887117f1b4Smrg{ 4897117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 4907117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 4917117f1b4Smrg 4927117f1b4Smrg if (stride < 0) { 4937117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" ); 4947117f1b4Smrg return; 4957117f1b4Smrg } 4967117f1b4Smrg 4977117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->EdgeFlag, _NEW_ARRAY_EDGEFLAG, 4984a49301eSmrg sizeof(GLboolean), 1, GL_UNSIGNED_BYTE, GL_RGBA, 4994a49301eSmrg stride, GL_FALSE, ptr); 5007117f1b4Smrg} 5017117f1b4Smrg 5027117f1b4Smrg 503c1f859d4Smrgvoid GLAPIENTRY 504c1f859d4Smrg_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 505c1f859d4Smrg{ 506c1f859d4Smrg GLsizei elementSize; 507c1f859d4Smrg GET_CURRENT_CONTEXT(ctx); 508c1f859d4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 509c1f859d4Smrg 510c1f859d4Smrg if (stride < 0) { 511c1f859d4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glPointSizePointer(stride)" ); 512c1f859d4Smrg return; 513c1f859d4Smrg } 514c1f859d4Smrg 515c1f859d4Smrg switch (type) { 516c1f859d4Smrg case GL_FLOAT: 517c1f859d4Smrg elementSize = sizeof(GLfloat); 518c1f859d4Smrg break; 519c1f859d4Smrg#if FEATURE_fixedpt 520c1f859d4Smrg case GL_FIXED: 521c1f859d4Smrg elementSize = sizeof(GLfixed); 522c1f859d4Smrg break; 523c1f859d4Smrg#endif 524c1f859d4Smrg default: 525c1f859d4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glPointSizePointer(type)" ); 526c1f859d4Smrg return; 527c1f859d4Smrg } 528c1f859d4Smrg 529c1f859d4Smrg update_array(ctx, &ctx->Array.ArrayObj->PointSize, _NEW_ARRAY_POINT_SIZE, 5304a49301eSmrg elementSize, 1, type, GL_RGBA, stride, GL_FALSE, ptr); 531c1f859d4Smrg} 532c1f859d4Smrg 533c1f859d4Smrg 5347117f1b4Smrg#if FEATURE_NV_vertex_program 5354a49301eSmrg/** 5364a49301eSmrg * Set a vertex attribute array. 5374a49301eSmrg * Note that these arrays DO alias the conventional GL vertex arrays 5384a49301eSmrg * (position, normal, color, fog, texcoord, etc). 5394a49301eSmrg * The generic attribute slots at #16 and above are not touched. 5404a49301eSmrg */ 5417117f1b4Smrgvoid GLAPIENTRY 5427117f1b4Smrg_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 5437117f1b4Smrg GLsizei stride, const GLvoid *ptr) 5447117f1b4Smrg{ 5457117f1b4Smrg GLboolean normalized = GL_FALSE; 5467117f1b4Smrg GLsizei elementSize; 5474a49301eSmrg GLenum format; 5487117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 5497117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 5507117f1b4Smrg 5514a49301eSmrg if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 5527117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 5537117f1b4Smrg return; 5547117f1b4Smrg } 5557117f1b4Smrg 5567117f1b4Smrg if (size < 1 || size > 4) { 5577117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size)"); 5587117f1b4Smrg return; 5597117f1b4Smrg } 5607117f1b4Smrg 5617117f1b4Smrg if (stride < 0) { 5627117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(stride)"); 5637117f1b4Smrg return; 5647117f1b4Smrg } 5657117f1b4Smrg 5667117f1b4Smrg if (type == GL_UNSIGNED_BYTE && size != 4) { 5677117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 5687117f1b4Smrg return; 5697117f1b4Smrg } 5707117f1b4Smrg 5714a49301eSmrg if (size == GL_BGRA) { 5724a49301eSmrg if (type != GL_UNSIGNED_BYTE) { 5734a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, 5744a49301eSmrg "glVertexAttribPointerNV(GL_BGRA/type)"); 5754a49301eSmrg return; 5764a49301eSmrg } 5774a49301eSmrg 5784a49301eSmrg format = GL_BGRA; 5794a49301eSmrg size = 4; 5804a49301eSmrg normalized = GL_TRUE; 5814a49301eSmrg } 5824a49301eSmrg else { 5834a49301eSmrg format = GL_RGBA; 5844a49301eSmrg } 5854a49301eSmrg 5867117f1b4Smrg /* check for valid 'type' and compute StrideB right away */ 5877117f1b4Smrg switch (type) { 5887117f1b4Smrg case GL_UNSIGNED_BYTE: 5897117f1b4Smrg normalized = GL_TRUE; 5907117f1b4Smrg elementSize = size * sizeof(GLubyte); 5917117f1b4Smrg break; 5927117f1b4Smrg case GL_SHORT: 5937117f1b4Smrg elementSize = size * sizeof(GLshort); 5947117f1b4Smrg break; 5957117f1b4Smrg case GL_FLOAT: 5967117f1b4Smrg elementSize = size * sizeof(GLfloat); 5977117f1b4Smrg break; 5987117f1b4Smrg case GL_DOUBLE: 5997117f1b4Smrg elementSize = size * sizeof(GLdouble); 6007117f1b4Smrg break; 6017117f1b4Smrg default: 6024a49301eSmrg _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type=%s)", 6034a49301eSmrg _mesa_lookup_enum_by_nr(type)); 6047117f1b4Smrg return; 6057117f1b4Smrg } 6067117f1b4Smrg 6077117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index], 6087117f1b4Smrg _NEW_ARRAY_ATTRIB(index), 6094a49301eSmrg elementSize, size, type, format, stride, normalized, ptr); 6107117f1b4Smrg} 6117117f1b4Smrg#endif 6127117f1b4Smrg 6137117f1b4Smrg 6147117f1b4Smrg#if FEATURE_ARB_vertex_program 6154a49301eSmrg/** 6164a49301eSmrg * Set a generic vertex attribute array. 6174a49301eSmrg * Note that these arrays DO NOT alias the conventional GL vertex arrays 6184a49301eSmrg * (position, normal, color, fog, texcoord, etc). 6194a49301eSmrg */ 6207117f1b4Smrgvoid GLAPIENTRY 6217117f1b4Smrg_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 6227117f1b4Smrg GLboolean normalized, 6237117f1b4Smrg GLsizei stride, const GLvoid *ptr) 6247117f1b4Smrg{ 6257117f1b4Smrg GLsizei elementSize; 6264a49301eSmrg GLenum format; 6277117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 6287117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END(ctx); 6297117f1b4Smrg 6307117f1b4Smrg if (index >= ctx->Const.VertexProgram.MaxAttribs) { 6317117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 6327117f1b4Smrg return; 6337117f1b4Smrg } 6347117f1b4Smrg 6357117f1b4Smrg if (size < 1 || size > 4) { 6364a49301eSmrg if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) { 6374a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(size)"); 6384a49301eSmrg return; 6394a49301eSmrg } 6407117f1b4Smrg } 6417117f1b4Smrg 6427117f1b4Smrg if (stride < 0) { 6437117f1b4Smrg _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(stride)"); 6447117f1b4Smrg return; 6457117f1b4Smrg } 6467117f1b4Smrg 6474a49301eSmrg if (size == GL_BGRA) { 6484a49301eSmrg if (type != GL_UNSIGNED_BYTE) { 6494a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, 6504a49301eSmrg "glVertexAttribPointerARB(GL_BGRA/type)"); 6514a49301eSmrg return; 6524a49301eSmrg } 6534a49301eSmrg if (normalized != GL_TRUE) { 6544a49301eSmrg _mesa_error(ctx, GL_INVALID_VALUE, 6554a49301eSmrg "glVertexAttribPointerARB(GL_BGRA/normalized)"); 6564a49301eSmrg return; 6574a49301eSmrg } 6584a49301eSmrg 6594a49301eSmrg format = GL_BGRA; 6604a49301eSmrg size = 4; 6614a49301eSmrg } 6624a49301eSmrg else { 6634a49301eSmrg format = GL_RGBA; 6644a49301eSmrg } 6654a49301eSmrg 6667117f1b4Smrg /* check for valid 'type' and compute StrideB right away */ 6677117f1b4Smrg /* NOTE: more types are supported here than in the NV extension */ 6687117f1b4Smrg switch (type) { 6697117f1b4Smrg case GL_BYTE: 6707117f1b4Smrg elementSize = size * sizeof(GLbyte); 6717117f1b4Smrg break; 6727117f1b4Smrg case GL_UNSIGNED_BYTE: 6737117f1b4Smrg elementSize = size * sizeof(GLubyte); 6747117f1b4Smrg break; 6757117f1b4Smrg case GL_SHORT: 6767117f1b4Smrg elementSize = size * sizeof(GLshort); 6777117f1b4Smrg break; 6787117f1b4Smrg case GL_UNSIGNED_SHORT: 6797117f1b4Smrg elementSize = size * sizeof(GLushort); 6807117f1b4Smrg break; 6817117f1b4Smrg case GL_INT: 6827117f1b4Smrg elementSize = size * sizeof(GLint); 6837117f1b4Smrg break; 6847117f1b4Smrg case GL_UNSIGNED_INT: 6857117f1b4Smrg elementSize = size * sizeof(GLuint); 6867117f1b4Smrg break; 6877117f1b4Smrg case GL_FLOAT: 6887117f1b4Smrg elementSize = size * sizeof(GLfloat); 6897117f1b4Smrg break; 6907117f1b4Smrg case GL_DOUBLE: 6917117f1b4Smrg elementSize = size * sizeof(GLdouble); 6927117f1b4Smrg break; 693cdc920a0Smrg case GL_HALF_FLOAT: 694cdc920a0Smrg elementSize = size * sizeof(GLhalfARB); 695cdc920a0Smrg break; 696c1f859d4Smrg#if FEATURE_fixedpt 697c1f859d4Smrg case GL_FIXED: 698c1f859d4Smrg elementSize = size * sizeof(GLfixed); 699c1f859d4Smrg break; 700c1f859d4Smrg#endif 7017117f1b4Smrg default: 7027117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerARB(type)" ); 7037117f1b4Smrg return; 7047117f1b4Smrg } 7057117f1b4Smrg 7067117f1b4Smrg update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index], 7077117f1b4Smrg _NEW_ARRAY_ATTRIB(index), 7084a49301eSmrg elementSize, size, type, format, stride, normalized, ptr); 7097117f1b4Smrg} 7107117f1b4Smrg#endif 7117117f1b4Smrg 7127117f1b4Smrg 7137117f1b4Smrgvoid GLAPIENTRY 7147117f1b4Smrg_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 7157117f1b4Smrg GLsizei count, const GLvoid *ptr) 7167117f1b4Smrg{ 7177117f1b4Smrg (void) count; 7187117f1b4Smrg _mesa_VertexPointer(size, type, stride, ptr); 7197117f1b4Smrg} 7207117f1b4Smrg 7217117f1b4Smrg 7227117f1b4Smrgvoid GLAPIENTRY 7237117f1b4Smrg_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7247117f1b4Smrg const GLvoid *ptr) 7257117f1b4Smrg{ 7267117f1b4Smrg (void) count; 7277117f1b4Smrg _mesa_NormalPointer(type, stride, ptr); 7287117f1b4Smrg} 7297117f1b4Smrg 7307117f1b4Smrg 7317117f1b4Smrgvoid GLAPIENTRY 7327117f1b4Smrg_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 7337117f1b4Smrg const GLvoid *ptr) 7347117f1b4Smrg{ 7357117f1b4Smrg (void) count; 7367117f1b4Smrg _mesa_ColorPointer(size, type, stride, ptr); 7377117f1b4Smrg} 7387117f1b4Smrg 7397117f1b4Smrg 7407117f1b4Smrgvoid GLAPIENTRY 7417117f1b4Smrg_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7427117f1b4Smrg const GLvoid *ptr) 7437117f1b4Smrg{ 7447117f1b4Smrg (void) count; 7457117f1b4Smrg _mesa_IndexPointer(type, stride, ptr); 7467117f1b4Smrg} 7477117f1b4Smrg 7487117f1b4Smrg 7497117f1b4Smrgvoid GLAPIENTRY 7507117f1b4Smrg_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 7517117f1b4Smrg GLsizei count, const GLvoid *ptr) 7527117f1b4Smrg{ 7537117f1b4Smrg (void) count; 7547117f1b4Smrg _mesa_TexCoordPointer(size, type, stride, ptr); 7557117f1b4Smrg} 7567117f1b4Smrg 7577117f1b4Smrg 7587117f1b4Smrgvoid GLAPIENTRY 7597117f1b4Smrg_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 7607117f1b4Smrg{ 7617117f1b4Smrg (void) count; 7627117f1b4Smrg _mesa_EdgeFlagPointer(stride, ptr); 7637117f1b4Smrg} 7647117f1b4Smrg 7657117f1b4Smrg 7667117f1b4Smrgvoid GLAPIENTRY 7677117f1b4Smrg_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 7687117f1b4Smrg{ 7697117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 7707117f1b4Smrg GLboolean tflag, cflag, nflag; /* enable/disable flags */ 7717117f1b4Smrg GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 7727117f1b4Smrg GLenum ctype = 0; /* color type */ 7737117f1b4Smrg GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 7747117f1b4Smrg const GLint toffset = 0; /* always zero */ 7757117f1b4Smrg GLint defstride; /* default stride */ 7767117f1b4Smrg GLint c, f; 7777117f1b4Smrg 7787117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 7797117f1b4Smrg 7807117f1b4Smrg f = sizeof(GLfloat); 7817117f1b4Smrg c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 7827117f1b4Smrg 7837117f1b4Smrg if (stride < 0) { 7847117f1b4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 7857117f1b4Smrg return; 7867117f1b4Smrg } 7877117f1b4Smrg 7887117f1b4Smrg switch (format) { 7897117f1b4Smrg case GL_V2F: 7907117f1b4Smrg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 7917117f1b4Smrg tcomps = 0; ccomps = 0; vcomps = 2; 7927117f1b4Smrg voffset = 0; 7937117f1b4Smrg defstride = 2*f; 7947117f1b4Smrg break; 7957117f1b4Smrg case GL_V3F: 7967117f1b4Smrg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 7977117f1b4Smrg tcomps = 0; ccomps = 0; vcomps = 3; 7987117f1b4Smrg voffset = 0; 7997117f1b4Smrg defstride = 3*f; 8007117f1b4Smrg break; 8017117f1b4Smrg case GL_C4UB_V2F: 8027117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 8037117f1b4Smrg tcomps = 0; ccomps = 4; vcomps = 2; 8047117f1b4Smrg ctype = GL_UNSIGNED_BYTE; 8057117f1b4Smrg coffset = 0; 8067117f1b4Smrg voffset = c; 8077117f1b4Smrg defstride = c + 2*f; 8087117f1b4Smrg break; 8097117f1b4Smrg case GL_C4UB_V3F: 8107117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 8117117f1b4Smrg tcomps = 0; ccomps = 4; vcomps = 3; 8127117f1b4Smrg ctype = GL_UNSIGNED_BYTE; 8137117f1b4Smrg coffset = 0; 8147117f1b4Smrg voffset = c; 8157117f1b4Smrg defstride = c + 3*f; 8167117f1b4Smrg break; 8177117f1b4Smrg case GL_C3F_V3F: 8187117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 8197117f1b4Smrg tcomps = 0; ccomps = 3; vcomps = 3; 8207117f1b4Smrg ctype = GL_FLOAT; 8217117f1b4Smrg coffset = 0; 8227117f1b4Smrg voffset = 3*f; 8237117f1b4Smrg defstride = 6*f; 8247117f1b4Smrg break; 8257117f1b4Smrg case GL_N3F_V3F: 8267117f1b4Smrg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 8277117f1b4Smrg tcomps = 0; ccomps = 0; vcomps = 3; 8287117f1b4Smrg noffset = 0; 8297117f1b4Smrg voffset = 3*f; 8307117f1b4Smrg defstride = 6*f; 8317117f1b4Smrg break; 8327117f1b4Smrg case GL_C4F_N3F_V3F: 8337117f1b4Smrg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 8347117f1b4Smrg tcomps = 0; ccomps = 4; vcomps = 3; 8357117f1b4Smrg ctype = GL_FLOAT; 8367117f1b4Smrg coffset = 0; 8377117f1b4Smrg noffset = 4*f; 8387117f1b4Smrg voffset = 7*f; 8397117f1b4Smrg defstride = 10*f; 8407117f1b4Smrg break; 8417117f1b4Smrg case GL_T2F_V3F: 8427117f1b4Smrg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 8437117f1b4Smrg tcomps = 2; ccomps = 0; vcomps = 3; 8447117f1b4Smrg voffset = 2*f; 8457117f1b4Smrg defstride = 5*f; 8467117f1b4Smrg break; 8477117f1b4Smrg case GL_T4F_V4F: 8487117f1b4Smrg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 8497117f1b4Smrg tcomps = 4; ccomps = 0; vcomps = 4; 8507117f1b4Smrg voffset = 4*f; 8517117f1b4Smrg defstride = 8*f; 8527117f1b4Smrg break; 8537117f1b4Smrg case GL_T2F_C4UB_V3F: 8547117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 8557117f1b4Smrg tcomps = 2; ccomps = 4; vcomps = 3; 8567117f1b4Smrg ctype = GL_UNSIGNED_BYTE; 8577117f1b4Smrg coffset = 2*f; 8587117f1b4Smrg voffset = c+2*f; 8597117f1b4Smrg defstride = c+5*f; 8607117f1b4Smrg break; 8617117f1b4Smrg case GL_T2F_C3F_V3F: 8627117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 8637117f1b4Smrg tcomps = 2; ccomps = 3; vcomps = 3; 8647117f1b4Smrg ctype = GL_FLOAT; 8657117f1b4Smrg coffset = 2*f; 8667117f1b4Smrg voffset = 5*f; 8677117f1b4Smrg defstride = 8*f; 8687117f1b4Smrg break; 8697117f1b4Smrg case GL_T2F_N3F_V3F: 8707117f1b4Smrg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 8717117f1b4Smrg tcomps = 2; ccomps = 0; vcomps = 3; 8727117f1b4Smrg noffset = 2*f; 8737117f1b4Smrg voffset = 5*f; 8747117f1b4Smrg defstride = 8*f; 8757117f1b4Smrg break; 8767117f1b4Smrg case GL_T2F_C4F_N3F_V3F: 8777117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 8787117f1b4Smrg tcomps = 2; ccomps = 4; vcomps = 3; 8797117f1b4Smrg ctype = GL_FLOAT; 8807117f1b4Smrg coffset = 2*f; 8817117f1b4Smrg noffset = 6*f; 8827117f1b4Smrg voffset = 9*f; 8837117f1b4Smrg defstride = 12*f; 8847117f1b4Smrg break; 8857117f1b4Smrg case GL_T4F_C4F_N3F_V4F: 8867117f1b4Smrg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 8877117f1b4Smrg tcomps = 4; ccomps = 4; vcomps = 4; 8887117f1b4Smrg ctype = GL_FLOAT; 8897117f1b4Smrg coffset = 4*f; 8907117f1b4Smrg noffset = 8*f; 8917117f1b4Smrg voffset = 11*f; 8927117f1b4Smrg defstride = 15*f; 8937117f1b4Smrg break; 8947117f1b4Smrg default: 8957117f1b4Smrg _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 8967117f1b4Smrg return; 8977117f1b4Smrg } 8987117f1b4Smrg 8997117f1b4Smrg if (stride==0) { 9007117f1b4Smrg stride = defstride; 9017117f1b4Smrg } 9027117f1b4Smrg 9037117f1b4Smrg _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 9047117f1b4Smrg _mesa_DisableClientState( GL_INDEX_ARRAY ); 9057117f1b4Smrg /* XXX also disable secondary color and generic arrays? */ 9067117f1b4Smrg 9077117f1b4Smrg /* Texcoords */ 9087117f1b4Smrg if (tflag) { 9097117f1b4Smrg _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 9107117f1b4Smrg _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 9117117f1b4Smrg (GLubyte *) pointer + toffset ); 9127117f1b4Smrg } 9137117f1b4Smrg else { 9147117f1b4Smrg _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 9157117f1b4Smrg } 9167117f1b4Smrg 9177117f1b4Smrg /* Color */ 9187117f1b4Smrg if (cflag) { 9197117f1b4Smrg _mesa_EnableClientState( GL_COLOR_ARRAY ); 9207117f1b4Smrg _mesa_ColorPointer( ccomps, ctype, stride, 9217117f1b4Smrg (GLubyte *) pointer + coffset ); 9227117f1b4Smrg } 9237117f1b4Smrg else { 9247117f1b4Smrg _mesa_DisableClientState( GL_COLOR_ARRAY ); 9257117f1b4Smrg } 9267117f1b4Smrg 9277117f1b4Smrg 9287117f1b4Smrg /* Normals */ 9297117f1b4Smrg if (nflag) { 9307117f1b4Smrg _mesa_EnableClientState( GL_NORMAL_ARRAY ); 9317117f1b4Smrg _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 9327117f1b4Smrg } 9337117f1b4Smrg else { 9347117f1b4Smrg _mesa_DisableClientState( GL_NORMAL_ARRAY ); 9357117f1b4Smrg } 9367117f1b4Smrg 9377117f1b4Smrg /* Vertices */ 9387117f1b4Smrg _mesa_EnableClientState( GL_VERTEX_ARRAY ); 9397117f1b4Smrg _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 9407117f1b4Smrg (GLubyte *) pointer + voffset ); 9417117f1b4Smrg} 9427117f1b4Smrg 9437117f1b4Smrg 9447117f1b4Smrgvoid GLAPIENTRY 9457117f1b4Smrg_mesa_LockArraysEXT(GLint first, GLsizei count) 9467117f1b4Smrg{ 9477117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9487117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9497117f1b4Smrg 9507117f1b4Smrg if (MESA_VERBOSE & VERBOSE_API) 9517117f1b4Smrg _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 9527117f1b4Smrg 953c1f859d4Smrg if (first < 0) { 954c1f859d4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 955c1f859d4Smrg return; 9567117f1b4Smrg } 957c1f859d4Smrg if (count <= 0) { 958c1f859d4Smrg _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 959c1f859d4Smrg return; 960c1f859d4Smrg } 961c1f859d4Smrg if (ctx->Array.LockCount != 0) { 962c1f859d4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 963c1f859d4Smrg return; 9647117f1b4Smrg } 9657117f1b4Smrg 966c1f859d4Smrg ctx->Array.LockFirst = first; 967c1f859d4Smrg ctx->Array.LockCount = count; 968c1f859d4Smrg 9697117f1b4Smrg ctx->NewState |= _NEW_ARRAY; 9707117f1b4Smrg ctx->Array.NewState |= _NEW_ARRAY_ALL; 9717117f1b4Smrg} 9727117f1b4Smrg 9737117f1b4Smrg 9747117f1b4Smrgvoid GLAPIENTRY 9757117f1b4Smrg_mesa_UnlockArraysEXT( void ) 9767117f1b4Smrg{ 9777117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 9787117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9797117f1b4Smrg 9807117f1b4Smrg if (MESA_VERBOSE & VERBOSE_API) 9817117f1b4Smrg _mesa_debug(ctx, "glUnlockArrays\n"); 9827117f1b4Smrg 983c1f859d4Smrg if (ctx->Array.LockCount == 0) { 984c1f859d4Smrg _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 985c1f859d4Smrg return; 986c1f859d4Smrg } 987c1f859d4Smrg 9887117f1b4Smrg ctx->Array.LockFirst = 0; 9897117f1b4Smrg ctx->Array.LockCount = 0; 9907117f1b4Smrg ctx->NewState |= _NEW_ARRAY; 9917117f1b4Smrg ctx->Array.NewState |= _NEW_ARRAY_ALL; 9927117f1b4Smrg} 9937117f1b4Smrg 9947117f1b4Smrg 9957117f1b4Smrg/* GL_EXT_multi_draw_arrays */ 9967117f1b4Smrg/* Somebody forgot to spec the first and count parameters as const! <sigh> */ 9977117f1b4Smrgvoid GLAPIENTRY 9987117f1b4Smrg_mesa_MultiDrawArraysEXT( GLenum mode, GLint *first, 9997117f1b4Smrg GLsizei *count, GLsizei primcount ) 10007117f1b4Smrg{ 10017117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10027117f1b4Smrg GLint i; 10037117f1b4Smrg 10047117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10057117f1b4Smrg 10067117f1b4Smrg for (i = 0; i < primcount; i++) { 10077117f1b4Smrg if (count[i] > 0) { 10087117f1b4Smrg CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 10097117f1b4Smrg } 10107117f1b4Smrg } 10117117f1b4Smrg} 10127117f1b4Smrg 10137117f1b4Smrg 10147117f1b4Smrg/* GL_IBM_multimode_draw_arrays */ 10157117f1b4Smrgvoid GLAPIENTRY 10167117f1b4Smrg_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 10177117f1b4Smrg const GLsizei * count, 10187117f1b4Smrg GLsizei primcount, GLint modestride ) 10197117f1b4Smrg{ 10207117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10217117f1b4Smrg GLint i; 10227117f1b4Smrg 10237117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10247117f1b4Smrg 10257117f1b4Smrg for ( i = 0 ; i < primcount ; i++ ) { 10267117f1b4Smrg if ( count[i] > 0 ) { 10277117f1b4Smrg GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10287117f1b4Smrg CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 10297117f1b4Smrg } 10307117f1b4Smrg } 10317117f1b4Smrg} 10327117f1b4Smrg 10337117f1b4Smrg 10347117f1b4Smrg/* GL_IBM_multimode_draw_arrays */ 10357117f1b4Smrgvoid GLAPIENTRY 10367117f1b4Smrg_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 10377117f1b4Smrg GLenum type, const GLvoid * const * indices, 10387117f1b4Smrg GLsizei primcount, GLint modestride ) 10397117f1b4Smrg{ 10407117f1b4Smrg GET_CURRENT_CONTEXT(ctx); 10417117f1b4Smrg GLint i; 10427117f1b4Smrg 10437117f1b4Smrg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10447117f1b4Smrg 10457117f1b4Smrg /* XXX not sure about ARB_vertex_buffer_object handling here */ 10467117f1b4Smrg 10477117f1b4Smrg for ( i = 0 ; i < primcount ; i++ ) { 10487117f1b4Smrg if ( count[i] > 0 ) { 10497117f1b4Smrg GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10507117f1b4Smrg CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 10517117f1b4Smrg } 10527117f1b4Smrg } 10537117f1b4Smrg} 10547117f1b4Smrg 10557117f1b4Smrg 10564a49301eSmrg/** 10574a49301eSmrg * Copy one client vertex array to another. 10584a49301eSmrg */ 10594a49301eSmrgvoid 10604a49301eSmrg_mesa_copy_client_array(GLcontext *ctx, 10614a49301eSmrg struct gl_client_array *dst, 10624a49301eSmrg struct gl_client_array *src) 10634a49301eSmrg{ 10644a49301eSmrg dst->Size = src->Size; 10654a49301eSmrg dst->Type = src->Type; 10664a49301eSmrg dst->Format = src->Format; 10674a49301eSmrg dst->Stride = src->Stride; 10684a49301eSmrg dst->StrideB = src->StrideB; 10694a49301eSmrg dst->Ptr = src->Ptr; 10704a49301eSmrg dst->Enabled = src->Enabled; 10714a49301eSmrg dst->Normalized = src->Normalized; 10724a49301eSmrg dst->_ElementSize = src->_ElementSize; 10734a49301eSmrg _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 10744a49301eSmrg dst->_MaxElement = src->_MaxElement; 10754a49301eSmrg} 10764a49301eSmrg 10774a49301eSmrg 10784a49301eSmrg 10794a49301eSmrg/** 10804a49301eSmrg * Print vertex array's fields. 10814a49301eSmrg */ 10824a49301eSmrgstatic void 10834a49301eSmrgprint_array(const char *name, GLint index, const struct gl_client_array *array) 10844a49301eSmrg{ 10854a49301eSmrg if (index >= 0) 1086cdc920a0Smrg printf(" %s[%d]: ", name, index); 10874a49301eSmrg else 1088cdc920a0Smrg printf(" %s: ", name); 1089cdc920a0Smrg printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %u), MaxElem=%u\n", 1090cdc920a0Smrg array->Ptr, array->Type, array->Size, 1091cdc920a0Smrg array->_ElementSize, array->StrideB, 1092cdc920a0Smrg array->BufferObj->Name, array->BufferObj->Size, 1093cdc920a0Smrg array->_MaxElement); 10944a49301eSmrg} 10954a49301eSmrg 10964a49301eSmrg 10974a49301eSmrg/** 10984a49301eSmrg * Print current vertex object/array info. For debug. 10994a49301eSmrg */ 11004a49301eSmrgvoid 11014a49301eSmrg_mesa_print_arrays(GLcontext *ctx) 11024a49301eSmrg{ 11034a49301eSmrg struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 11044a49301eSmrg GLuint i; 11054a49301eSmrg 11064a49301eSmrg _mesa_update_array_object_max_element(ctx, arrayObj); 11074a49301eSmrg 1108cdc920a0Smrg printf("Array Object %u\n", arrayObj->Name); 11094a49301eSmrg if (arrayObj->Vertex.Enabled) 11104a49301eSmrg print_array("Vertex", -1, &arrayObj->Vertex); 11114a49301eSmrg if (arrayObj->Normal.Enabled) 11124a49301eSmrg print_array("Normal", -1, &arrayObj->Normal); 11134a49301eSmrg if (arrayObj->Color.Enabled) 11144a49301eSmrg print_array("Color", -1, &arrayObj->Color); 11154a49301eSmrg for (i = 0; i < Elements(arrayObj->TexCoord); i++) 11164a49301eSmrg if (arrayObj->TexCoord[i].Enabled) 11174a49301eSmrg print_array("TexCoord", i, &arrayObj->TexCoord[i]); 11184a49301eSmrg for (i = 0; i < Elements(arrayObj->VertexAttrib); i++) 11194a49301eSmrg if (arrayObj->VertexAttrib[i].Enabled) 11204a49301eSmrg print_array("Attrib", i, &arrayObj->VertexAttrib[i]); 1121cdc920a0Smrg printf(" _MaxElement = %u\n", arrayObj->_MaxElement); 11224a49301eSmrg} 11234a49301eSmrg 11244a49301eSmrg 11257117f1b4Smrg/** 11267117f1b4Smrg * Initialize vertex array state for given context. 11277117f1b4Smrg */ 11287117f1b4Smrgvoid 11297117f1b4Smrg_mesa_init_varray(GLcontext *ctx) 11307117f1b4Smrg{ 11317117f1b4Smrg ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0); 11324a49301eSmrg _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj, 11334a49301eSmrg ctx->Array.DefaultArrayObj); 11347117f1b4Smrg ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 11354a49301eSmrg 11364a49301eSmrg ctx->Array.Objects = _mesa_NewHashTable(); 11374a49301eSmrg} 11384a49301eSmrg 11394a49301eSmrg 11404a49301eSmrg/** 11414a49301eSmrg * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 11424a49301eSmrg */ 11434a49301eSmrgstatic void 11444a49301eSmrgdelete_arrayobj_cb(GLuint id, void *data, void *userData) 11454a49301eSmrg{ 11464a49301eSmrg struct gl_array_object *arrayObj = (struct gl_array_object *) data; 11474a49301eSmrg GLcontext *ctx = (GLcontext *) userData; 11484a49301eSmrg _mesa_delete_array_object(ctx, arrayObj); 11494a49301eSmrg} 11504a49301eSmrg 11514a49301eSmrg 11524a49301eSmrg/** 11534a49301eSmrg * Free vertex array state for given context. 11544a49301eSmrg */ 11554a49301eSmrgvoid 11564a49301eSmrg_mesa_free_varray_data(GLcontext *ctx) 11574a49301eSmrg{ 11584a49301eSmrg _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 11594a49301eSmrg _mesa_DeleteHashTable(ctx->Array.Objects); 11607117f1b4Smrg} 1161