varray.c revision 9946f15d302d48a0bc0ab0b8a3556c184e88c7d0
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 339d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Version: 7.6 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 639d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 27fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 28148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#include "imports.h" 2926895aa797060a38b42dfad21301f4b34b7de0d2Brian Paul#include "bufferobj.h" 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enable.h" 32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h" 3312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul#include "hash.h" 34433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#include "image.h" 35d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul#include "macros.h" 365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "varray.h" 38ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick#include "arrayobj.h" 392cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h" 40485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell 41c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 42433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to do error checking for GL_EXT_vertex_array_bgra */ 43433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BGRA_OR_4 5 44433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 45433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 46433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to indicate which GL datatypes are accepted by each of the 47433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * glVertex/Color/Attrib/EtcPointer() functions. 48433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */ 49433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BOOL_BIT 0x1 50433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BYTE_BIT 0x2 51433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_BYTE_BIT 0x4 52433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define SHORT_BIT 0x8 53433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_SHORT_BIT 0x10 54433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define INT_BIT 0x20 55433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_INT_BIT 0x40 56433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define HALF_BIT 0x80 57433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FLOAT_BIT 0x100 58433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define DOUBLE_BIT 0x200 59433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FIXED_BIT 0x400 60433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 61433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 62433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 63433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Convert GL datatype enum into a <type>_BIT value seen above */ 64433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulstatic GLbitfield 65433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paultype_to_bit(const struct gl_context *ctx, GLenum type) 66433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul{ 67433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul switch (type) { 68433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_BOOL: 69433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return BOOL_BIT; 70433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_BYTE: 71433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return BYTE_BIT; 72433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_UNSIGNED_BYTE: 73433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return UNSIGNED_BYTE_BIT; 74433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_SHORT: 75433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return SHORT_BIT; 76433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_UNSIGNED_SHORT: 77433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return UNSIGNED_SHORT_BIT; 78433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_INT: 79433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return INT_BIT; 80433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_UNSIGNED_INT: 81433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return UNSIGNED_INT_BIT; 82433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_HALF_FLOAT: 83433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (ctx->Extensions.ARB_half_float_vertex) 84433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return HALF_BIT; 85433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul else 86433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return 0x0; 87433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_FLOAT: 88433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return FLOAT_BIT; 89433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_DOUBLE: 90433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return DOUBLE_BIT; 91433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_FIXED: 92433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return FIXED_BIT; 93433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul default: 94433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return 0; 95433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 96433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul} 97433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 98433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 99c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/** 100433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * Do error checking and update state for glVertex/Color/TexCoord/...Pointer 101433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * functions. 102f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * 103433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param func name of calling function used for error reporting 104f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param array the array to update 105f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param dirtyBit which bit to set in ctx->Array.NewState for this array 106433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param legalTypes bitmask of *_BIT above indicating legal datatypes 107433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMin min allowable size value 108433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMax max allowable size value (may also be BGRA_OR_4) 109f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size components per element (1, 2, 3 or 4) 110f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 111f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride stride between elements, in elements 112f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized are integer types converted to floats in [-1, 1]? 113d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer integer-valued values (will not be normalized to [-1,1]) 114f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr the address (or offset inside VBO) of the array data 115c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */ 116f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void 117433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulupdate_array(struct gl_context *ctx, 118433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const char *func, 119433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul struct gl_client_array *array, 120433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLbitfield dirtyBit, GLbitfield legalTypesMask, 121433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLint sizeMin, GLint sizeMax, 122433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLint size, GLenum type, GLsizei stride, 123433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLboolean normalized, GLboolean integer, 124d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLvoid *ptr) 125c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{ 126433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLbitfield typeBit; 127433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLsizei elementSize; 128433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLenum format = GL_RGBA; 129433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1309946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) { 1319946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */ 13211dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypesMask &= ~FIXED_BIT; 13311dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 13411dd228415d9299f3afa81525d0e588135099b4bBrian Paul 135433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul typeBit = type_to_bit(ctx, type); 136433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) { 137433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)", 138433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul func, _mesa_lookup_enum_by_nr(type)); 139433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 140433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 141433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 142433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul /* Do size parameter checking. 143433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and 144433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * must be handled specially. 145433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */ 146433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (ctx->Extensions.EXT_vertex_array_bgra && 147433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul sizeMax == BGRA_OR_4 && 148433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size == GL_BGRA) { 149433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (type != GL_UNSIGNED_BYTE) { 150433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func); 151433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 152433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 153433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul format = GL_BGRA; 154433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size = 4; 155433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 156433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul else if (size < sizeMin || size > sizeMax || size > 4) { 157433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size); 158433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 159433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 160433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 161433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul ASSERT(size <= 4); 162433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 163433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (stride < 0) { 164433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride ); 165433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 166433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 167e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 168e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul if (ctx->Array.ArrayObj->VBOonly && 169e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul ctx->Array.ArrayBufferObj->Name == 0) { 170e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs. 171e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul * Generate GL_INVALID_OPERATION if that's not true. 172e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul */ 173433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func); 174f549f4c4b6012178df3706b26539ca672399260fBrian Paul return; 175e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul } 176e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 177433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul elementSize = _mesa_sizeof_type(type) * size; 178433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 179c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Size = size; 180c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Type = type; 18176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul array->Format = format; 182c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Stride = stride; 183c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->StrideB = stride ? stride : elementSize; 184c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Normalized = normalized; 185c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Ptr = (const GLubyte *) ptr; 1860077c879b57f663c038becdde37b2f6671f59150Brian Paul array->_ElementSize = elementSize; 1870077c879b57f663c038becdde37b2f6671f59150Brian Paul 18837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul _mesa_reference_buffer_object(ctx, &array->BufferObj, 18937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul ctx->Array.ArrayBufferObj); 19037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 191c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul ctx->NewState |= _NEW_ARRAY; 192f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul ctx->Array.NewState |= dirtyBit; 193c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul} 194c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 195c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 196c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 197fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 19911dd228415d9299f3afa81525d0e588135099b4bBrian Paul GLbitfield legalTypes = (SHORT_BIT | INT_BIT | FLOAT_BIT | 20011dd228415d9299f3afa81525d0e588135099b4bBrian Paul DOUBLE_BIT | HALF_BIT | FIXED_BIT); 201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 202cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 20411dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API == API_OPENGLES) 20511dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypes |= BYTE_BIT; 20611dd228415d9299f3afa81525d0e588135099b4bBrian Paul 207433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glVertexPointer", 208433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->Vertex, _NEW_ARRAY_VERTEX, 209433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 2, 4, 210433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, ptr); 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 214c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 215fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 217433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | SHORT_BIT | INT_BIT | 218433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 21911dd228415d9299f3afa81525d0e588135099b4bBrian Paul FIXED_BIT); 220fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 221cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 223433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glNormalPointer", 224433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->Normal, _NEW_ARRAY_NORMAL, 225433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, 3, 226433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 3, type, stride, GL_TRUE, GL_FALSE, ptr); 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 230c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 231fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 233433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 234433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 235433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 236433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 23711dd228415d9299f3afa81525d0e588135099b4bBrian Paul FIXED_BIT); 238fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 240fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 241433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glColorPointer", 242433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->Color, _NEW_ARRAY_COLOR0, 243433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 244433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 248c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 249fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 250fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 251433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 252fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 253cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2545e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 255433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glFogCoordPointer", 256433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->FogCoord, _NEW_ARRAY_FOGCOORD, 257433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 258433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 259fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 260fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 261fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 262c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 263fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 265433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | 266433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 267fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 268cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 270433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glIndexPointer", 271433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->Index, _NEW_ARRAY_INDEX, 272433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 273433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 277c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 279fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GLsizei stride, const GLvoid *ptr) 280fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 281433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 282433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 283433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 284433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 285fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 287fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 288433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glSecondaryColorPointer", 289433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->SecondaryColor, _NEW_ARRAY_COLOR1, 290433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 291433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 292fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 295c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2962edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 2972edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul const GLvoid *ptr) 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 29911dd228415d9299f3afa81525d0e588135099b4bBrian Paul GLbitfield legalTypes = (SHORT_BIT | INT_BIT | 3000c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 3010c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu FIXED_BIT); 302fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 303c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul const GLuint unit = ctx->Array.ActiveTexture; 304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 30611dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API == API_OPENGLES) 30711dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypes |= BYTE_BIT; 30811dd228415d9299f3afa81525d0e588135099b4bBrian Paul 30989c8ff3382763c654ef680c522c287764d943d6cBrian Paul ASSERT(unit < Elements(ctx->Array.ArrayObj->TexCoord)); 31089c8ff3382763c654ef680c522c287764d943d6cBrian Paul 311433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glTexCoordPointer", 312433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->TexCoord[unit], 313f549f4c4b6012178df3706b26539ca672399260fBrian Paul _NEW_ARRAY_TEXCOORD(unit), 314433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 315433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, 316d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ptr); 317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 320c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 321c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 323ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; 324d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */ 325d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 327cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 329433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glEdgeFlagPointer", 330433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->EdgeFlag, _NEW_ARRAY_EDGEFLAG, 331433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 332ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr); 333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3361cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY 3371cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 3381cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{ 33911dd228415d9299f3afa81525d0e588135099b4bBrian Paul const GLbitfield legalTypes = (FLOAT_BIT | FIXED_BIT); 3401cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul GET_CURRENT_CONTEXT(ctx); 3411cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3421cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 34311dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API != API_OPENGLES) { 34411dd228415d9299f3afa81525d0e588135099b4bBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 34511dd228415d9299f3afa81525d0e588135099b4bBrian Paul "glPointSizePointer(ES 1.x only)"); 34611dd228415d9299f3afa81525d0e588135099b4bBrian Paul return; 34711dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 34811dd228415d9299f3afa81525d0e588135099b4bBrian Paul 349433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glPointSizePointer", 350433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->PointSize, _NEW_ARRAY_POINT_SIZE, 351433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 352433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 3531cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul} 3541cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 3551cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 356148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program 357a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 358a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array. 359a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays 360a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 361a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched. 362a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 363c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 36492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 36592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 3662edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{ 367433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | 368433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 36929fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler GLboolean normalized = GL_FALSE; 3702edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul GET_CURRENT_CONTEXT(ctx); 3712edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 3722edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 373d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 3742edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 3752edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 3762edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 3772edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 3782edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul if (type == GL_UNSIGNED_BYTE && size != 4) { 3792edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 3802edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 3812edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 3822edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 383433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glVertexAttribPointerNV", 384433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->VertexAttrib[index], 385f549f4c4b6012178df3706b26539ca672399260fBrian Paul _NEW_ARRAY_ATTRIB(index), 386433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 387433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 3882edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul} 389148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3911f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 392148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program 393a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 394a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array. 395a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 396a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 397a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 398c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 39992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 40092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLboolean normalized, 40192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 40292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{ 403433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 404433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 405433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 406433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 40711dd228415d9299f3afa81525d0e588135099b4bBrian Paul FIXED_BIT); 40892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GET_CURRENT_CONTEXT(ctx); 40992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 41092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 41105051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 41292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 41392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul return; 41492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul } 41592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 416433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glVertexAttribPointer", 417433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->VertexAttrib[index], 418f549f4c4b6012178df3706b26539ca672399260fBrian Paul _NEW_ARRAY_ATTRIB(index), 419433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 420433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 42192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul} 422148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 42392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 42492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 425e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/** 426d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0. 427e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array. 428e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 429e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc). 430e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */ 431e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY 432e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, 433e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul GLsizei stride, const GLvoid *ptr) 434e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{ 435433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 436433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 437433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT); 438d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean normalized = GL_FALSE; 439d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 440d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul GET_CURRENT_CONTEXT(ctx); 441d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 442d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 443d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 444d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); 445d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return; 446d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 447d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 448433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul update_array(ctx, "glVertexAttribIPointer", 449433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul &ctx->Array.ArrayObj->VertexAttrib[index], 450d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul _NEW_ARRAY_ATTRIB(index), 451433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 452433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, integer, ptr); 453e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul} 454e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 455e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 456e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 457c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 458d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index) 459d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 460d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 461d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 462d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 463d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 464d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 465d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glEnableVertexAttribArrayARB(index)"); 466d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 467d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 468d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 469d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib)); 470d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 471d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 472d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_TRUE; 473d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ctx->Array.ArrayObj->_Enabled |= _NEW_ARRAY_ATTRIB(index); 474d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index); 475d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 476d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 477d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 478d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 479d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index) 480d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 481d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 482d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 483d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 484d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 485d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 486d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glEnableVertexAttribArrayARB(index)"); 487d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 488d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 489d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 490d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib)); 491d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 492d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 493d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_FALSE; 494d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ctx->Array.ArrayObj->_Enabled &= ~_NEW_ARRAY_ATTRIB(index); 495d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index); 496d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 497d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 498d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 499d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** 500d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy 501d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)). This function does 502d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query. 503d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */ 504d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint 505f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname, 506d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const char *caller) 507d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 508d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const struct gl_client_array *array; 509d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 510d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= MAX_VERTEX_GENERIC_ATTRIBS) { 511d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index); 512d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return 0; 513d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 514d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 515d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib)); 516d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 517d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul array = &ctx->Array.ArrayObj->VertexAttrib[index]; 518d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 519d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul switch (pname) { 520d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: 521d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Enabled; 522d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: 523d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Size; 524d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: 525d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Stride; 526d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: 527d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Type; 528d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: 529d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Normalized; 530d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 531d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->BufferObj->Name; 532d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul case GL_VERTEX_ATTRIB_ARRAY_INTEGER: 533d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul if (ctx->Extensions.EXT_gpu_shader4) { 534d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return array->Integer; 535d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 536d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul /* fall-through */ 537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul default: 538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname); 539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return 0; 540d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 542d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 543d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 544d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) 546d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 547d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 548d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 549d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 550d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 551d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index == 0) { 552d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 553d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribfv(index==0)"); 554d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 555d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index]; 557d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_CURRENT(ctx, 0); 558d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul COPY_4V(params, v); 559d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 560d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 561d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 562d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname, 563d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribfv"); 564d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 565d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 566d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 567d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 568d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) 570d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 571d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 572d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 573d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 574d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 575d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index == 0) { 576d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 577d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribdv(index==0)"); 578d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 579d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 580d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index]; 581d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_CURRENT(ctx, 0); 582d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) v[0]; 583d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLdouble) v[1]; 584d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLdouble) v[2]; 585d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLdouble) v[3]; 586d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 587d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 588d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 589d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname, 590d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribdv"); 591d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 592d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 593d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 594d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 595d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 596d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) 597d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 598d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 599d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 600d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 601d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 602d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index == 0) { 603d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 604d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribiv(index==0)"); 605d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 606d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 607d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index]; 608d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_CURRENT(ctx, 0); 609d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX should floats in[0,1] be scaled to full int range? */ 610d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 618d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribiv"); 619d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 620d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 621d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 622d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 623d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 624d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 625d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params) 626d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 627d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 628d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 629d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 630d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index == 0) { 632d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIiv(index==0)"); 634d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 635d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 636d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index]; 637d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_CURRENT(ctx, 0); 638d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX we don't have true integer-valued vertex attribs yet */ 639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 641d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 642d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 643d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 644d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 645d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 646d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 647d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIiv"); 648d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 649d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 650d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 651d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 652d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 653d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 654d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params) 655d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 656d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 657d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 658d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 659d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 660d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index == 0) { 661d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 662d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIuiv(index==0)"); 663d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 664d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 665d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index]; 666d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_CURRENT(ctx, 0); 667d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX we don't have true integer-valued vertex attribs yet */ 668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLuint) v[0]; 669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLuint) v[1]; 670d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLuint) v[2]; 671d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLuint) v[3]; 672d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 675d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = get_vertex_array_attrib(ctx, index, pname, 676d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIuiv"); 677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) 683d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 684d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 685d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)"); 689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) { 693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)"); 694d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 695d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 696d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 697d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib)); 698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr; 700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 7041f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 7051f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7061f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7071f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7081f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_VertexPointer(size, type, stride, ptr); 7091f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7101f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7111f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 712c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7131f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7141f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7151f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7161f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7171f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_NormalPointer(type, stride, ptr); 7181f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7191f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7201f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 721c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7221f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 7231f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7241f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7251f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7261f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_ColorPointer(size, type, stride, ptr); 7271f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7281f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7291f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 730c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7311f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7321f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7331f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7341f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7351f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_IndexPointer(type, stride, ptr); 7361f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7371f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7381f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 739c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7401f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 7411f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7431f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_TexCoordPointer(size, type, stride, ptr); 7451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 748c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 7501f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7521f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_EdgeFlagPointer(stride, ptr); 7531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 756c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 757fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 759fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean tflag, cflag, nflag; /* enable/disable flags */ 761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 762f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLenum ctype = 0; /* color type */ 763f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 7644a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul const GLint toffset = 0; /* always zero */ 765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint defstride; /* default stride */ 766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint c, f; 7675e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 768cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 769cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg f = sizeof(GLfloat); 771c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 773c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul if (stride < 0) { 77408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (format) { 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V2F: 780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 2; 782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 2*f; 784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V3F: 786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 3*f; 790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V2F: 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 2; 794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 2*f; 798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V3F: 800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 3*f; 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C3F_V3F: 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 3; vcomps = 3; 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_N3F_V3F: 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 0; 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4F_N3F_V3F: 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 4*f; 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 7*f; 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 10*f; 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_V3F: 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 2*f; 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 5*f; 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_V4F: 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 0; vcomps = 4; 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 4*f; 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4UB_V3F: 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c+2*f; 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c+5*f; 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C3F_V3F: 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 3; vcomps = 3; 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_N3F_V3F: 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 2*f; 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4F_N3F_V3F: 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 6*f; 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 9*f; 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 12*f; 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_C4F_N3F_V4F: 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 4; vcomps = 4; 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 4*f; 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 8*f; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 11*f; 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 15*f; 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 88508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (stride==0) { 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg stride = defstride; 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 893fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 894fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_INDEX_ARRAY ); 895095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul /* XXX also disable secondary color and generic arrays? */ 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Texcoords */ 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (tflag) { 8994a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 9004a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 901ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul (GLubyte *) pointer + toffset ); 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 904ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Color */ 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (cflag) { 909fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_COLOR_ARRAY ); 910cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_ColorPointer( ccomps, ctype, stride, 9114a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul (GLubyte *) pointer + coffset ); 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 914fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_COLOR_ARRAY ); 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Normals */ 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (nflag) { 920fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_NORMAL_ARRAY ); 9214a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 924fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_NORMAL_ARRAY ); 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9274a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul /* Vertices */ 928fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_VERTEX_ARRAY ); 929cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 930cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell (GLubyte *) pointer + voffset ); 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 934c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 935ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count) 936ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 937ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 938cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 939ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 940ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 9414753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 942ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 9435857e988be9317810cf713478195b4ed849eea4aEric Anholt if (first < 0) { 9445857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 9455857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 94622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 9475857e988be9317810cf713478195b4ed849eea4aEric Anholt if (count <= 0) { 9485857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 9495857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 9505857e988be9317810cf713478195b4ed849eea4aEric Anholt } 9515857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount != 0) { 9525857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 9535857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 954ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell } 955ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 9565857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockFirst = first; 9575857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockCount = count; 9585857e988be9317810cf713478195b4ed849eea4aEric Anholt 959ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 960cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ctx->Array.NewState |= _NEW_ARRAY_ALL; 961ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 962ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 963ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 964c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 965ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void ) 966ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 967ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 968cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 969ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 970ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 9714753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glUnlockArrays\n"); 972ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 9735857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount == 0) { 9745857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 9755857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 9765857e988be9317810cf713478195b4ed849eea4aEric Anholt } 9775857e988be9317810cf713478195b4ed849eea4aEric Anholt 978ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockFirst = 0; 979ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockCount = 0; 980ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 981cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ctx->Array.NewState |= _NEW_ARRAY_ALL; 982ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 9832525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 9842525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 9852525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */ 986c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 9877993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first, 9887993832c12bba578010005b344dcd3817be84a42Brian Paul const GLsizei *count, GLsizei primcount ) 9892525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{ 9902525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GET_CURRENT_CONTEXT(ctx); 9912525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GLint i; 9922525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 9932525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 9942525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 9952525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul for (i = 0; i < primcount; i++) { 9962525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul if (count[i] > 0) { 9979bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 9982525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 9992525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10002525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul} 10012525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10022525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10033baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1004c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10053baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 10063baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick const GLsizei * count, 10073baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10083baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 10093baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 10103baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 10113baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10123baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10133baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10143baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 10153baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 101603e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10179bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 10183baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10193baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10203baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 10213baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10223baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10233baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1024c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10253baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 10263baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLenum type, const GLvoid * const * indices, 10273baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10283baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 10293baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 10303baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 10313baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10323baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10333baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1034d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul /* XXX not sure about ARB_vertex_buffer_object handling here */ 1035d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul 10363baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 10373baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 103803e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10399bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 10403baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10413baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10423baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 10433baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10443baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1045095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/** 10467f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1 1047a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */ 1048a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY 1049a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index) 1050a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{ 1051a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul GET_CURRENT_CONTEXT(ctx); 1052a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 10537f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul if (!ctx->Extensions.NV_primitive_restart && 10547f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul ctx->VersionMajor * 10 + ctx->VersionMinor < 31) { 10557f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); 1056a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul return; 1057a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul } 1058a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1059a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1060a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1061a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 1062a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1063a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul ctx->Array.RestartIndex = index; 1064a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul} 1065a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1066a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1067a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/** 1068b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another. 1069b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */ 1070b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid 1071f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx, 1072b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *dst, 1073b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *src) 1074b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{ 1075b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Size = src->Size; 1076b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Type = src->Type; 1077b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Format = src->Format; 1078b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Stride = src->Stride; 1079b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->StrideB = src->StrideB; 1080b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Ptr = src->Ptr; 1081b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Enabled = src->Enabled; 1082b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Normalized = src->Normalized; 1083d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul dst->Integer = src->Integer; 1084b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_ElementSize = src->_ElementSize; 1085b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 1086b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_MaxElement = src->_MaxElement; 1087b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul} 1088b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1089b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1090b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1091b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/** 109239d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields. 109339d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 109439d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void 109539d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array) 109639d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 109739d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (index >= 0) 1098298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s[%d]: ", name, index); 109939d7524f7b176d4375e230ac60963d197be539f2Brian Paul else 1100298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s: ", name); 11014beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n", 1102298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->Ptr, array->Type, array->Size, 1103298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_ElementSize, array->StrideB, 11044beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul array->BufferObj->Name, (unsigned long) array->BufferObj->Size, 1105298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_MaxElement); 110639d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 110739d7524f7b176d4375e230ac60963d197be539f2Brian Paul 110839d7524f7b176d4375e230ac60963d197be539f2Brian Paul 110939d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 111039d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info. For debug. 111139d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 111239d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid 1113f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx) 111439d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 11156a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 111639d7524f7b176d4375e230ac60963d197be539f2Brian Paul GLuint i; 111739d7524f7b176d4375e230ac60963d197be539f2Brian Paul 11188fe3134622eed34159ff6f72a33558a659e8d299Brian Paul _mesa_update_array_object_max_element(ctx, arrayObj); 11198fe3134622eed34159ff6f72a33558a659e8d299Brian Paul 1120298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("Array Object %u\n", arrayObj->Name); 112139d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (arrayObj->Vertex.Enabled) 112239d7524f7b176d4375e230ac60963d197be539f2Brian Paul print_array("Vertex", -1, &arrayObj->Vertex); 112339d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (arrayObj->Normal.Enabled) 112439d7524f7b176d4375e230ac60963d197be539f2Brian Paul print_array("Normal", -1, &arrayObj->Normal); 112539d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (arrayObj->Color.Enabled) 112639d7524f7b176d4375e230ac60963d197be539f2Brian Paul print_array("Color", -1, &arrayObj->Color); 1127d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul for (i = 0; i < Elements(arrayObj->TexCoord); i++) 112839d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (arrayObj->TexCoord[i].Enabled) 112939d7524f7b176d4375e230ac60963d197be539f2Brian Paul print_array("TexCoord", i, &arrayObj->TexCoord[i]); 1130d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul for (i = 0; i < Elements(arrayObj->VertexAttrib); i++) 113139d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (arrayObj->VertexAttrib[i].Enabled) 113239d7524f7b176d4375e230ac60963d197be539f2Brian Paul print_array("Attrib", i, &arrayObj->VertexAttrib[i]); 1133298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" _MaxElement = %u\n", arrayObj->_MaxElement); 113439d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 113539d7524f7b176d4375e230ac60963d197be539f2Brian Paul 113639d7524f7b176d4375e230ac60963d197be539f2Brian Paul 113739d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 1138095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context. 1139095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */ 1140c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid 1141f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx) 11426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{ 1143ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0); 11441030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj, 11451030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul ctx->Array.DefaultArrayObj); 1146095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 114712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 114812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul ctx->Array.Objects = _mesa_NewHashTable(); 114912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 115012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 115112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 115212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 115312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 115412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 115512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void 115612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData) 115712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 115812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul struct gl_array_object *arrayObj = (struct gl_array_object *) data; 1159f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = (struct gl_context *) userData; 116012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_delete_array_object(ctx, arrayObj); 116112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 116212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 116312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 116412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 116512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context. 116612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 116712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid 1168f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx) 116912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 117012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 117112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_DeleteHashTable(ctx->Array.Objects); 11726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell} 1173