varray.c revision 09714c09a40501d82823e42f7461d7b8d7bf11c0
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" 36db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "varray.h" 39ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick#include "arrayobj.h" 402cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h" 41485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell 42c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 43433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to do error checking for GL_EXT_vertex_array_bgra */ 44433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BGRA_OR_4 5 45433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 46433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 47433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to indicate which GL datatypes are accepted by each of the 48433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * glVertex/Color/Attrib/EtcPointer() functions. 49433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */ 50433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BOOL_BIT 0x1 51433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BYTE_BIT 0x2 52433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_BYTE_BIT 0x4 53433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define SHORT_BIT 0x8 54433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_SHORT_BIT 0x10 55433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define INT_BIT 0x20 56433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_INT_BIT 0x40 57433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define HALF_BIT 0x80 58433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FLOAT_BIT 0x100 59433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define DOUBLE_BIT 0x200 600f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák#define FIXED_ES_BIT 0x400 610f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák#define FIXED_GL_BIT 0x800 626cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie#define UNSIGNED_INT_2_10_10_10_REV_BIT 0x1000 636cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie#define INT_2_10_10_10_REV_BIT 0x2000 64433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 65433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 66433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Convert GL datatype enum into a <type>_BIT value seen above */ 67433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulstatic GLbitfield 68433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paultype_to_bit(const struct gl_context *ctx, GLenum type) 69433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul{ 70433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul switch (type) { 71433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_BOOL: 72433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return BOOL_BIT; 73433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_BYTE: 74433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return BYTE_BIT; 75433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_UNSIGNED_BYTE: 76433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return UNSIGNED_BYTE_BIT; 77433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_SHORT: 78433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return SHORT_BIT; 79433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_UNSIGNED_SHORT: 80433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return UNSIGNED_SHORT_BIT; 81433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_INT: 82433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return INT_BIT; 83433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_UNSIGNED_INT: 84433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return UNSIGNED_INT_BIT; 85433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_HALF_FLOAT: 86433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (ctx->Extensions.ARB_half_float_vertex) 87433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return HALF_BIT; 88433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul else 89433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return 0x0; 90433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_FLOAT: 91433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return FLOAT_BIT; 92433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_DOUBLE: 93433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return DOUBLE_BIT; 94433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul case GL_FIXED: 9509714c09a40501d82823e42f7461d7b8d7bf11c0Jordan Justen return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT; 966cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie case GL_UNSIGNED_INT_2_10_10_10_REV: 976cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie return UNSIGNED_INT_2_10_10_10_REV_BIT; 986cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie case GL_INT_2_10_10_10_REV: 996cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie return INT_2_10_10_10_REV_BIT; 100433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul default: 101433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return 0; 102433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 103433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul} 104433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 105433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 106c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/** 107433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * Do error checking and update state for glVertex/Color/TexCoord/...Pointer 108433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * functions. 109f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * 110433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param func name of calling function used for error reporting 111762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich * \param attrib the attribute array index to update 112433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param legalTypes bitmask of *_BIT above indicating legal datatypes 113433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMin min allowable size value 114433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMax max allowable size value (may also be BGRA_OR_4) 115f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size components per element (1, 2, 3 or 4) 116f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 117f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride stride between elements, in elements 118f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized are integer types converted to floats in [-1, 1]? 119d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer integer-valued values (will not be normalized to [-1,1]) 120f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr the address (or offset inside VBO) of the array data 121c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */ 122f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void 123433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulupdate_array(struct gl_context *ctx, 124433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const char *func, 125762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich GLuint attrib, GLbitfield legalTypesMask, 126433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLint sizeMin, GLint sizeMax, 127433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLint size, GLenum type, GLsizei stride, 128433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLboolean normalized, GLboolean integer, 129d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLvoid *ptr) 130c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{ 131762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich struct gl_client_array *array; 132433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLbitfield typeBit; 133433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLsizei elementSize; 134433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLenum format = GL_RGBA; 135433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1369946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) { 1379946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */ 1380f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák legalTypesMask &= ~FIXED_ES_BIT; 1390f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák } 1400f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák if (!ctx->Extensions.ARB_ES2_compatibility) { 1410f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák legalTypesMask &= ~FIXED_GL_BIT; 14211dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 1436cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 1446cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT | 1456cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 1466cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie } 14711dd228415d9299f3afa81525d0e588135099b4bBrian Paul 148433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul typeBit = type_to_bit(ctx, type); 149433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) { 150433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)", 151433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul func, _mesa_lookup_enum_by_nr(type)); 152433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 153433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 154433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 155433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul /* Do size parameter checking. 156433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and 157433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * must be handled specially. 158433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */ 159433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (ctx->Extensions.EXT_vertex_array_bgra && 160433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul sizeMax == BGRA_OR_4 && 161433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size == GL_BGRA) { 16299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie GLboolean bgra_error = GL_FALSE; 16399c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie 16499c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 16599c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (type != GL_UNSIGNED_INT_2_10_10_10_REV && 16699c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie type != GL_INT_2_10_10_10_REV && 16799c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie type != GL_UNSIGNED_BYTE) 16899c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie bgra_error = GL_TRUE; 16999c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie } else if (type != GL_UNSIGNED_BYTE) 17099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie bgra_error = GL_TRUE; 17199c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie 17299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (bgra_error) { 173433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func); 174433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 175433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 176433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul format = GL_BGRA; 177433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size = 4; 178433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 179433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul else if (size < sizeMin || size > sizeMax || size > 4) { 180433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size); 181433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 182433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 183433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 1856cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie (type == GL_UNSIGNED_INT_2_10_10_10_REV || 1866cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie type == GL_INT_2_10_10_10_REV) && size != 4) { 1876cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size); 188e14b3573676af291669ee6ef4a295fc61a22c8d8Brian Paul return; 1896cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie } 1906cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie 191433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul ASSERT(size <= 4); 192433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 193433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (stride < 0) { 194433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride ); 195433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 196433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 197e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 19809639901530da7df7347428512c2bee86af1ef8eIan Romanick if (ctx->Array.ArrayObj->ARBsemantics && 199efcf5aa13f2000eb3620a99f82043001db07e6b2Brian Paul !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) { 200e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs. 201e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul * Generate GL_INVALID_OPERATION if that's not true. 202e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul */ 203433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func); 204f549f4c4b6012178df3706b26539ca672399260fBrian Paul return; 205e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul } 206e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 207433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul elementSize = _mesa_sizeof_type(type) * size; 208433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 209762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich array = &ctx->Array.ArrayObj->VertexAttrib[attrib]; 210c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Size = size; 211c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Type = type; 21276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul array->Format = format; 213c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Stride = stride; 214c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->StrideB = stride ? stride : elementSize; 215c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Normalized = normalized; 2168f84c237b360be69f9b6ac51465c729b3ada196aPaul Berry array->Integer = integer; 217c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Ptr = (const GLubyte *) ptr; 2180077c879b57f663c038becdde37b2f6671f59150Brian Paul array->_ElementSize = elementSize; 2190077c879b57f663c038becdde37b2f6671f59150Brian Paul 22037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul _mesa_reference_buffer_object(ctx, &array->BufferObj, 22137c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul ctx->Array.ArrayBufferObj); 22237c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 223c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul ctx->NewState |= _NEW_ARRAY; 224b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib); 225c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul} 226c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 227c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 228c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 229fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 23111dd228415d9299f3afa81525d0e588135099b4bBrian Paul GLbitfield legalTypes = (SHORT_BIT | INT_BIT | FLOAT_BIT | 2326cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie DOUBLE_BIT | HALF_BIT | FIXED_ES_BIT | 2336cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 2346cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 235fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 23811dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API == API_OPENGLES) 23911dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypes |= BYTE_BIT; 24011dd228415d9299f3afa81525d0e588135099b4bBrian Paul 241762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS, 242433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 2, 4, 243433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, ptr); 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 247c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 248fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 250433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | SHORT_BIT | INT_BIT | 251433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 2526cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | 2536cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 2546cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 255fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 256cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 258762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL, 259433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, 3, 260433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 3, type, stride, GL_TRUE, GL_FALSE, ptr); 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 264c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 267433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 268433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 269433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 270433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 2716cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | 2726cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 2736cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 274fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 275cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 277762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0, 278433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 279433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 283c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 284fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 285fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 286433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 287fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 290762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG, 291433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 292433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 295fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 296c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 297fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 299433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | 300433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 301fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 304762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX, 305433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 306433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 310c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 3115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 312fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GLsizei stride, const GLvoid *ptr) 313fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 314433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 315433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 316433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 3176cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 3186cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 3196cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 320fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 322fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 323762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1, 324433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 325433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 326fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 327fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 328fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 329c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 3302edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 3312edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul const GLvoid *ptr) 332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 33311dd228415d9299f3afa81525d0e588135099b4bBrian Paul GLbitfield legalTypes = (SHORT_BIT | INT_BIT | 3340c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 3356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | 3366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 3376cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 339c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul const GLuint unit = ctx->Array.ActiveTexture; 340cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 34211dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API == API_OPENGLES) 34311dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypes |= BYTE_BIT; 34411dd228415d9299f3afa81525d0e588135099b4bBrian Paul 345762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit), 346433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 347433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, 348d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ptr); 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 352c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 353c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 355ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; 356d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */ 357d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 358fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 359cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 361762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG, 362433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 363ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr); 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3671cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY 3681cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 3691cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{ 3700f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); 3711cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul GET_CURRENT_CONTEXT(ctx); 3721cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3731cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 37411dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API != API_OPENGLES) { 37511dd228415d9299f3afa81525d0e588135099b4bBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 37611dd228415d9299f3afa81525d0e588135099b4bBrian Paul "glPointSizePointer(ES 1.x only)"); 37711dd228415d9299f3afa81525d0e588135099b4bBrian Paul return; 37811dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 37911dd228415d9299f3afa81525d0e588135099b4bBrian Paul 380762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE, 381433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 382433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 3831cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul} 3841cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 3851cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 386148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program 387a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 388a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array. 389a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays 390a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 391a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched. 392a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 393c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 39492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 39592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 3962edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{ 397433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | 398433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 39929fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler GLboolean normalized = GL_FALSE; 4002edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul GET_CURRENT_CONTEXT(ctx); 4012edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 4022edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 403d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 4042edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 4052edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 4062edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 4072edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 4082edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul if (type == GL_UNSIGNED_BYTE && size != 4) { 4092edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 4102edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 4112edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 4122edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 413762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index), 414433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 415433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 4162edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul} 417148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4191f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 420148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program 421a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 422a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array. 423a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 424a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 425a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 426c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 42792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 42892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLboolean normalized, 42992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 43092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{ 431433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 432433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 433433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 434433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 4356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | FIXED_GL_BIT | 4366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 4376cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 43892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GET_CURRENT_CONTEXT(ctx); 43992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 44092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 44105051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 44292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 44392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul return; 44492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul } 44592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 446762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index), 447433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 448433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 44992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul} 450148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 45192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 45292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 453e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/** 454d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0. 455e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array. 456e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 457e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc). 458e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */ 459e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY 460e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, 461e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul GLsizei stride, const GLvoid *ptr) 462e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{ 463433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 464433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 465433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT); 466d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean normalized = GL_FALSE; 467d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 468d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul GET_CURRENT_CONTEXT(ctx); 469d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 470d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 471d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 472d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); 473d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return; 474d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 475d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 476762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index), 477433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 478433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, integer, ptr); 479e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul} 480e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 481e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 482e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 483c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 484d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index) 485d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 48645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul struct gl_array_object *arrayObj; 487d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 488d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 489d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 490d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 491d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 492d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glEnableVertexAttribArrayARB(index)"); 493d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 494d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 495d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 49645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj = ctx->Array.ArrayObj; 497d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 49845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib)); 49945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul 50045453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul if (!arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 50145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul /* was disabled, now being enabled */ 50245453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 50345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE; 50445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->_Enabled |= VERT_BIT_GENERIC(index); 505b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul arrayObj->NewArrays |= VERT_BIT_GENERIC(index); 50645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul } 507d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 508d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 509d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 510d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 511d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index) 512d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 51345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul struct gl_array_object *arrayObj; 514d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 515d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 516d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 517d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 518d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 51995368f25c1793619e94d464fe94afcea0409ae26Brian Paul "glDisableVertexAttribArrayARB(index)"); 520d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 521d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 522d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 52345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj = ctx->Array.ArrayObj; 524d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 52545453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib)); 52645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul 52745453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 52845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul /* was enabled, now being disabled */ 52945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 53045453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE; 53145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index); 532b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul arrayObj->NewArrays |= VERT_BIT_GENERIC(index); 53345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul } 534d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 535d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 536d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** 538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy 539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)). This function does 540d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query. 541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */ 542d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint 543f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname, 544d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const char *caller) 545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 546d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const struct gl_client_array *array; 547d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 5485c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (index >= ctx->Const.VertexProgram.MaxAttribs) { 549d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index); 550d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return 0; 551d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 552d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 553762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 554d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 555762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 557d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul switch (pname) { 558d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: 559d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Enabled; 560d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: 561d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Size; 562d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: 563d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Stride; 564d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: 565d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Type; 566d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: 567d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Normalized; 568d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->BufferObj->Name; 570d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul case GL_VERTEX_ATTRIB_ARRAY_INTEGER: 571d56ad273c0ff37d790c614b2d3f04c1249b47307Kenneth Graunke if (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_gpu_shader4) { 572d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return array->Integer; 573d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 5741d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul goto error; 5751d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB: 5761d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (ctx->Extensions.ARB_instanced_arrays) { 5771d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return array->InstanceDivisor; 5781d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 5791d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul goto error; 580d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul default: 5811d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul ; /* fall-through */ 582d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 5831d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 5841d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulerror: 5851d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname); 5861d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return 0; 587d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 588d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 589d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 5905c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickstatic const GLfloat * 5915c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickget_current_attrib(struct gl_context *ctx, GLuint index, const char *function) 5925c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick{ 5935c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (index == 0) { 5945c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (ctx->API != API_OPENGLES2) { 5955c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function); 5965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick return NULL; 5975c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 5985c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 5995c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick else if (index >= ctx->Const.VertexProgram.MaxAttribs) { 6005c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick _mesa_error(ctx, GL_INVALID_VALUE, 6015c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function); 6025c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick return NULL; 6035c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 6045c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick 605762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 606762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich 6075c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick FLUSH_CURRENT(ctx, 0); 608762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)]; 6095c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick} 6105c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick 611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) 613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6185c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv"); 6195c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 620d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul COPY_4V(params, v); 621d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 622d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 623d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 624d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname, 625d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribfv"); 626d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 627d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 628d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 629d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 630d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) 632d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 634d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 635d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 636d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6375c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv"); 6385c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) v[0]; 640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLdouble) v[1]; 641d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLdouble) v[2]; 642d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLdouble) v[3]; 643d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 644d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 645d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 646d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname, 647d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribdv"); 648d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 649d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 650d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 651d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 652d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 653d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) 654d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 655d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 656d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 657d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 658d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6595c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv"); 6605c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 661d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX should floats in[0,1] be scaled to full int range? */ 662d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 663d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 664d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 665d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 666d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 667d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 670d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribiv"); 671d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 672d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 675d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 676d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params) 678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6835c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = 6845c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick get_current_attrib(ctx, index, "glGetVertexAttribIiv"); 6855c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX we don't have true integer-valued vertex attribs yet */ 687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 694d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 695d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIiv"); 696d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 697d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params) 703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 704d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 705d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 706d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 707d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 7085c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = 7095c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick get_current_attrib(ctx, index, "glGetVertexAttribIuiv"); 7105c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 711d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX we don't have true integer-valued vertex attribs yet */ 712d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLuint) v[0]; 713d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLuint) v[1]; 714d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLuint) v[2]; 715d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLuint) v[3]; 716d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 717d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 718d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 719d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = get_vertex_array_attrib(ctx, index, pname, 720d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIuiv"); 721d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 722d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 723d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 724d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 725d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 726d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) 727d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 728d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 729d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 730d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 731d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 732d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)"); 733d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 734d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 735d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 736d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) { 737d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)"); 738d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 739d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 740d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 741762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 742d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 743762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; 744d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 745d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 746d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 747d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 7481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 7491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7501f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7521f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_VertexPointer(size, type, stride, ptr); 7531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 756c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7571f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7581f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7591f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7601f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7611f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_NormalPointer(type, stride, ptr); 7621f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7631f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7641f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 765c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7661f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 7671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7681f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7691f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7701f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_ColorPointer(size, type, stride, ptr); 7711f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7721f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7731f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 774c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7751f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7761f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7771f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7781f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7791f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_IndexPointer(type, stride, ptr); 7801f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7811f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7821f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 783c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7841f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 7851f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7861f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7871f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7881f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_TexCoordPointer(size, type, stride, ptr); 7891f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7901f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7911f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 792c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7931f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 7941f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7951f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7961f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_EdgeFlagPointer(stride, ptr); 7971f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7981f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7991f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 800c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean tflag, cflag, nflag; /* enable/disable flags */ 805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 806f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLenum ctype = 0; /* color type */ 807f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 8084a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul const GLint toffset = 0; /* always zero */ 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint defstride; /* default stride */ 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint c, f; 8115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 812cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 813cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg f = sizeof(GLfloat); 815c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 817c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul if (stride < 0) { 81808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (format) { 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V2F: 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 2; 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 2*f; 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V3F: 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 3*f; 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V2F: 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 2; 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 2*f; 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V3F: 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 3*f; 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C3F_V3F: 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 3; vcomps = 3; 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_N3F_V3F: 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 0; 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4F_N3F_V3F: 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 4*f; 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 7*f; 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 10*f; 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_V3F: 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 2*f; 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 5*f; 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_V4F: 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 0; vcomps = 4; 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 4*f; 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4UB_V3F: 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c+2*f; 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c+5*f; 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C3F_V3F: 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 3; vcomps = 3; 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_N3F_V3F: 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 2*f; 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4F_N3F_V3F: 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 6*f; 916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 9*f; 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 12*f; 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_C4F_N3F_V4F: 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 4; vcomps = 4; 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 4*f; 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 8*f; 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 11*f; 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 15*f; 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 92908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (stride==0) { 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg stride = defstride; 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 937fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 938fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_INDEX_ARRAY ); 939095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul /* XXX also disable secondary color and generic arrays? */ 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Texcoords */ 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (tflag) { 9434a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 9444a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 945ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul (GLubyte *) pointer + toffset ); 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 948ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Color */ 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (cflag) { 953fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_COLOR_ARRAY ); 954cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_ColorPointer( ccomps, ctype, stride, 9554a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul (GLubyte *) pointer + coffset ); 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 958fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_COLOR_ARRAY ); 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Normals */ 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (nflag) { 964fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_NORMAL_ARRAY ); 9654a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 968fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_NORMAL_ARRAY ); 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9714a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul /* Vertices */ 972fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_VERTEX_ARRAY ); 973cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 974cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell (GLubyte *) pointer + voffset ); 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 978c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 979ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count) 980ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 981ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 982cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 983ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 984ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 9854753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 986ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 9875857e988be9317810cf713478195b4ed849eea4aEric Anholt if (first < 0) { 9885857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 9895857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 99022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 9915857e988be9317810cf713478195b4ed849eea4aEric Anholt if (count <= 0) { 9925857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 9935857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 9945857e988be9317810cf713478195b4ed849eea4aEric Anholt } 9955857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount != 0) { 9965857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 9975857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 998ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell } 999ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 10005857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockFirst = first; 10015857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockCount = count; 10025857e988be9317810cf713478195b4ed849eea4aEric Anholt 1003ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 1004ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 1005ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1006ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1007c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 1008ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void ) 1009ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 1010ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 1011cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1012ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1013ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 10144753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glUnlockArrays\n"); 1015ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 10165857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount == 0) { 10175857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 10185857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 10195857e988be9317810cf713478195b4ed849eea4aEric Anholt } 10205857e988be9317810cf713478195b4ed849eea4aEric Anholt 1021ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockFirst = 0; 1022ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockCount = 0; 1023ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 1024ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 10252525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10262525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10272525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */ 1028c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10297993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first, 10307993832c12bba578010005b344dcd3817be84a42Brian Paul const GLsizei *count, GLsizei primcount ) 10312525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{ 10322525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GET_CURRENT_CONTEXT(ctx); 10332525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GLint i; 10342525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10352525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10362525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10372525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul for (i = 0; i < primcount; i++) { 10382525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul if (count[i] > 0) { 10399bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 10402525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10412525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10422525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul} 10432525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10442525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10453baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1046c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10473baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 10483baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick const GLsizei * count, 10493baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10503baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 10513baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 10523baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 10533baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10543baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10553baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10563baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 10573baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 105803e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10599bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 10603baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10613baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10623baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 10633baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10643baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10653baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1066c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10673baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 10683baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLenum type, const GLvoid * const * indices, 10693baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10703baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 10713baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 10723baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 10733baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10743baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10753baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1076d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul /* XXX not sure about ARB_vertex_buffer_object handling here */ 1077d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul 10783baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 10793baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 108003e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10819bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 10823baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10833baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10843baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 10853baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10863baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1087095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/** 10887f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1 1089a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */ 1090a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY 1091a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index) 1092a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{ 1093a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul GET_CURRENT_CONTEXT(ctx); 1094a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 10957f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul if (!ctx->Extensions.NV_primitive_restart && 10967f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul ctx->VersionMajor * 10 + ctx->VersionMinor < 31) { 10977f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); 1098a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul return; 1099a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul } 1100a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1101d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 1102a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1103d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul if (ctx->Array.RestartIndex != index) { 1104d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 1105d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul ctx->Array.RestartIndex = index; 1106d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul } 1107a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul} 1108a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1109a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1110a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/** 11111d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * See GL_ARB_instanced_arrays. 11121d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * Note that the instance divisor only applies to generic arrays, not 11131d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * the legacy vertex arrays. 11141d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul */ 11151d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulvoid GLAPIENTRY 11161d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul_mesa_VertexAttribDivisor(GLuint index, GLuint divisor) 11171d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul{ 1118738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul struct gl_client_array *array; 11191d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul GET_CURRENT_CONTEXT(ctx); 1120738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 11211d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11221d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (!ctx->Extensions.ARB_instanced_arrays) { 11231d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); 11241d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return; 11251d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 11261d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11271d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 11281d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)", 11291d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul index); 11301d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return; 11311d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 11321d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 1133762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 1134762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich 1135738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 1136738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul if (array->InstanceDivisor != divisor) { 1137738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 1138738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul array->InstanceDivisor = divisor; 1139b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index)); 1140738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul } 11411d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul} 11421d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11431d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11441d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11451d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul/** 1146b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another. 1147b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */ 1148b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid 1149f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx, 1150b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *dst, 1151b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *src) 1152b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{ 1153b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Size = src->Size; 1154b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Type = src->Type; 1155b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Format = src->Format; 1156b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Stride = src->Stride; 1157b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->StrideB = src->StrideB; 1158b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Ptr = src->Ptr; 1159b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Enabled = src->Enabled; 1160b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Normalized = src->Normalized; 1161d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul dst->Integer = src->Integer; 11621d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul dst->InstanceDivisor = src->InstanceDivisor; 1163b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_ElementSize = src->_ElementSize; 1164b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 1165b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_MaxElement = src->_MaxElement; 1166b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul} 1167b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1168b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1169b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1170b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/** 117139d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields. 117239d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 117339d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void 117439d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array) 117539d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 117639d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (index >= 0) 1177298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s[%d]: ", name, index); 117839d7524f7b176d4375e230ac60963d197be539f2Brian Paul else 1179298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s: ", name); 11804beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n", 1181298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->Ptr, array->Type, array->Size, 1182298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_ElementSize, array->StrideB, 11834beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul array->BufferObj->Name, (unsigned long) array->BufferObj->Size, 1184298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_MaxElement); 118539d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 118639d7524f7b176d4375e230ac60963d197be539f2Brian Paul 118739d7524f7b176d4375e230ac60963d197be539f2Brian Paul 118839d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 118939d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info. For debug. 119039d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 119139d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid 1192f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx) 119339d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 11946a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 119539d7524f7b176d4375e230ac60963d197be539f2Brian Paul GLuint i; 119639d7524f7b176d4375e230ac60963d197be539f2Brian Paul 11978fe3134622eed34159ff6f72a33558a659e8d299Brian Paul _mesa_update_array_object_max_element(ctx, arrayObj); 11988fe3134622eed34159ff6f72a33558a659e8d299Brian Paul 1199298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("Array Object %u\n", arrayObj->Name); 1200762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) 1201762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]); 1202762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) 1203762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]); 1204762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) 1205762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]); 1206762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) 1207762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled) 1208762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]); 1209762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) 1210762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled) 1211762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]); 1212298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" _MaxElement = %u\n", arrayObj->_MaxElement); 121339d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 121439d7524f7b176d4375e230ac60963d197be539f2Brian Paul 121539d7524f7b176d4375e230ac60963d197be539f2Brian Paul 121639d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 1217095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context. 1218095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */ 1219c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid 1220f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx) 12216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{ 122286f53e6d6bd07e2bc3ffcadeb9a4418fbae06e0bMathias Fröhlich ctx->Array.DefaultArrayObj = ctx->Driver.NewArrayObject(ctx, 0); 12231030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj, 12241030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul ctx->Array.DefaultArrayObj); 1225095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 122612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 122712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul ctx->Array.Objects = _mesa_NewHashTable(); 122812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 122912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 123012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 123112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 123212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 123312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 123412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void 123512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData) 123612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 123712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul struct gl_array_object *arrayObj = (struct gl_array_object *) data; 1238f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = (struct gl_context *) userData; 123912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_delete_array_object(ctx, arrayObj); 124012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 124112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 124212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 124312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 124412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context. 124512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 124612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid 1247f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx) 124812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 124912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 125012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_DeleteHashTable(ctx->Array.Objects); 12516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell} 1252