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 136792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says: 137792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * 138792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * "Client vertex arrays - all vertex array attribute pointers must 139792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * refer to buffer objects (section 2.9.2). The default vertex array 140792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * object (the name zero) is also deprecated. Calling 141792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * VertexAttribPointer when no buffer object or no vertex array object 142792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * is bound will generate an INVALID_OPERATION error..." 143792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * 144792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick * The check for VBOs is handled below. 145792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick */ 146792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick if (ctx->API == API_OPENGL_CORE 147792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick && (ctx->Array.ArrayObj == ctx->Array.DefaultArrayObj)) { 148792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no array object bound)", 149792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick func); 150792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick return; 151792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick } 152792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick 153bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick if (_mesa_is_gles(ctx)) { 154bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick /* Once Mesa gets support for GL_OES_vertex_half_float this mask will 155bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick * change. Adding support for this extension isn't quite as trivial as 156bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick * we'd like because ES uses a different enum value for GL_HALF_FLOAT. 157bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick */ 158bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick legalTypesMask &= ~(FIXED_GL_BIT | HALF_BIT | DOUBLE_BIT); 159bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick 160bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until 161bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick * 3.0. The 2_10_10_10 types are added in OpenGL ES 3.0 or 162bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick * GL_OES_vertex_type_10_10_10_2. 163bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick */ 164bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick if (ctx->Version < 30) { 165bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick legalTypesMask &= ~(UNSIGNED_INT_BIT 166bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick | INT_BIT 167bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick | UNSIGNED_INT_2_10_10_10_REV_BIT 168bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick | INT_2_10_10_10_REV_BIT); 169bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick } 170946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick 171946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick /* BGRA ordering is not supported in ES contexts. 172946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick */ 173946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick if (sizeMax == BGRA_OR_4) 174946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick sizeMax = 4; 175bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick } else { 1760f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák legalTypesMask &= ~FIXED_ES_BIT; 177bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick 178bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick if (!ctx->Extensions.ARB_ES2_compatibility) 179bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick legalTypesMask &= ~FIXED_GL_BIT; 180bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick 181bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) 182bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT | 183bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick INT_2_10_10_10_REV_BIT); 1846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie } 18511dd228415d9299f3afa81525d0e588135099b4bBrian Paul 186433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul typeBit = type_to_bit(ctx, type); 187433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) { 188433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)", 189433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul func, _mesa_lookup_enum_by_nr(type)); 190433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 191433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 192433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 193433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul /* Do size parameter checking. 194433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and 195433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * must be handled specially. 196433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */ 197433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (ctx->Extensions.EXT_vertex_array_bgra && 198433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul sizeMax == BGRA_OR_4 && 199433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size == GL_BGRA) { 20099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie GLboolean bgra_error = GL_FALSE; 20199c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie 20299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 20399c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (type != GL_UNSIGNED_INT_2_10_10_10_REV && 20499c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie type != GL_INT_2_10_10_10_REV && 20599c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie type != GL_UNSIGNED_BYTE) 20699c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie bgra_error = GL_TRUE; 20799c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie } else if (type != GL_UNSIGNED_BYTE) 20899c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie bgra_error = GL_TRUE; 20999c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie 21099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (bgra_error) { 211433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func); 212433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 213433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 214433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul format = GL_BGRA; 215433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size = 4; 216433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 217433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul else if (size < sizeMin || size > sizeMax || size > 4) { 218433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size); 219433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 220433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 221433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 2226cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 2236cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie (type == GL_UNSIGNED_INT_2_10_10_10_REV || 2246cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie type == GL_INT_2_10_10_10_REV) && size != 4) { 2256cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size); 226e14b3573676af291669ee6ef4a295fc61a22c8d8Brian Paul return; 2276cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie } 2286cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie 229433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul ASSERT(size <= 4); 230433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 231433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (stride < 0) { 232433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride ); 233433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 234433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 235e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 236843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick /* Page 29 (page 44 of the PDF) of the OpenGL 3.3 spec says: 237843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * 238843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * "An INVALID_OPERATION error is generated under any of the following 239843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * conditions: 240843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * 241843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * ... 242843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * 243843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * * any of the *Pointer commands specifying the location and 244843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * organization of vertex array data are called while zero is bound 245843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * to the ARRAY_BUFFER buffer object binding point (see section 246843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick * 2.9.6), and the pointer argument is not NULL." 247843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick */ 248843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick if (ptr != NULL && ctx->Array.ArrayObj->ARBsemantics && 249efcf5aa13f2000eb3620a99f82043001db07e6b2Brian Paul !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) { 250433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func); 251f549f4c4b6012178df3706b26539ca672399260fBrian Paul return; 252e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul } 253e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 254433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul elementSize = _mesa_sizeof_type(type) * size; 255433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 256762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich array = &ctx->Array.ArrayObj->VertexAttrib[attrib]; 257c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Size = size; 258c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Type = type; 25976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul array->Format = format; 260c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Stride = stride; 261c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->StrideB = stride ? stride : elementSize; 262c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Normalized = normalized; 2638f84c237b360be69f9b6ac51465c729b3ada196aPaul Berry array->Integer = integer; 264c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Ptr = (const GLubyte *) ptr; 2650077c879b57f663c038becdde37b2f6671f59150Brian Paul array->_ElementSize = elementSize; 2660077c879b57f663c038becdde37b2f6671f59150Brian Paul 26737c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul _mesa_reference_buffer_object(ctx, &array->BufferObj, 26837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul ctx->Array.ArrayBufferObj); 26937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 270c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul ctx->NewState |= _NEW_ARRAY; 271b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib); 272c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul} 273c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 274c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 275c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 279e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick GLbitfield legalTypes = (ctx->API == API_OPENGLES) 280e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 281e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick : (SHORT_BIT | INT_BIT | FLOAT_BIT | 282e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick DOUBLE_BIT | HALF_BIT | 283e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick UNSIGNED_INT_2_10_10_10_REV_BIT | 284e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick INT_2_10_10_10_REV_BIT); 285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2865e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 287762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS, 288433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 2, 4, 289433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, ptr); 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 293c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 297e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick const GLbitfield legalTypes = (ctx->API == API_OPENGLES) 298e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 299e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick : (BYTE_BIT | SHORT_BIT | INT_BIT | 300e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 301e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick UNSIGNED_INT_2_10_10_10_REV_BIT | 302e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick INT_2_10_10_10_REV_BIT); 303cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 305762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL, 306433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, 3, 307433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 3, type, stride, GL_TRUE, GL_FALSE, ptr); 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 311c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 314fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 31507ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick const GLbitfield legalTypes = (ctx->API == API_OPENGLES) 31607ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT) 31707ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick : (BYTE_BIT | UNSIGNED_BYTE_BIT | 31807ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick SHORT_BIT | UNSIGNED_SHORT_BIT | 31907ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick INT_BIT | UNSIGNED_INT_BIT | 32007ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 32107ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick UNSIGNED_INT_2_10_10_10_REV_BIT | 32207ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick INT_2_10_10_10_REV_BIT); 323fb8218508a9b5cfe9e14830f9590df889e5b8785Ian Romanick const GLint sizeMin = (ctx->API == API_OPENGLES) ? 4 : 3; 324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 326762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0, 327fb8218508a9b5cfe9e14830f9590df889e5b8785Ian Romanick legalTypes, sizeMin, BGRA_OR_4, 328433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 332c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 333fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 334fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 335433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 336fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 337cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 339762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG, 340433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 341433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 342fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 343fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 344fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 345c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 348433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | 349433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 353762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX, 354433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 355433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 359c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 3605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 361fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GLsizei stride, const GLvoid *ptr) 362fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 363433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 364433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 365433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 3666cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 3676cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 3686cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 369fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 371fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 372762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1, 373433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 374433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 375fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 376fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 377fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 378c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 3792edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 3802edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul const GLvoid *ptr) 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 382fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 383c3e9a207d0cb650045304cac559958d275a63284Ian Romanick GLbitfield legalTypes = (ctx->API == API_OPENGLES) 384c3e9a207d0cb650045304cac559958d275a63284Ian Romanick ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 385c3e9a207d0cb650045304cac559958d275a63284Ian Romanick : (SHORT_BIT | INT_BIT | 386c3e9a207d0cb650045304cac559958d275a63284Ian Romanick HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 387c3e9a207d0cb650045304cac559958d275a63284Ian Romanick UNSIGNED_INT_2_10_10_10_REV_BIT | 388c3e9a207d0cb650045304cac559958d275a63284Ian Romanick INT_2_10_10_10_REV_BIT); 389a8f475d8f6b56ddec36634437d007e06b48ff1cdIan Romanick const GLint sizeMin = (ctx->API == API_OPENGLES) ? 2 : 1; 390c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul const GLuint unit = ctx->Array.ActiveTexture; 391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 393762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit), 394a8f475d8f6b56ddec36634437d007e06b48ff1cdIan Romanick legalTypes, sizeMin, 4, 395433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, 396d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ptr); 397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 400c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 401c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 403ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; 404d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */ 405d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 406fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 407cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 409762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG, 410433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 411ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr); 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4151cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY 4161cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 4171cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{ 4180f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); 4191cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul GET_CURRENT_CONTEXT(ctx); 4201cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 4211cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 42211dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API != API_OPENGLES) { 42311dd228415d9299f3afa81525d0e588135099b4bBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 42411dd228415d9299f3afa81525d0e588135099b4bBrian Paul "glPointSizePointer(ES 1.x only)"); 42511dd228415d9299f3afa81525d0e588135099b4bBrian Paul return; 42611dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 42711dd228415d9299f3afa81525d0e588135099b4bBrian Paul 428762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE, 429433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 430433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 4311cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul} 4321cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 4331cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 434148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program 435a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 436a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array. 437a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays 438a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 439a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched. 440a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 441c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 44292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 44392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 4442edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{ 445433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | 446433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 44729fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler GLboolean normalized = GL_FALSE; 4482edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul GET_CURRENT_CONTEXT(ctx); 4492edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 4502edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 451d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 4522edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 4532edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 4542edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 4552edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 4562edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul if (type == GL_UNSIGNED_BYTE && size != 4) { 4572edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 4582edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 4592edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 4602edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 461762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index), 462433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 463433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 4642edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul} 465148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 468148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program 469a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 470a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array. 471a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 472a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 473a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 474c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 47592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 47692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLboolean normalized, 47792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 47892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{ 479433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 480433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 481433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 482433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 4836cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | FIXED_GL_BIT | 4846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 4856cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 48692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GET_CURRENT_CONTEXT(ctx); 48792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 48892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 48905051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 49092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 49192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul return; 49292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul } 49392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 494762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index), 495433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 496433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 49792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul} 498148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 49992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 50092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 501e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/** 502d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0. 503e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array. 504e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 505e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc). 506e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */ 507e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY 508e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, 509e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul GLsizei stride, const GLvoid *ptr) 510e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{ 511433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 512433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 513433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT); 514d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean normalized = GL_FALSE; 515d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 516d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul GET_CURRENT_CONTEXT(ctx); 517d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 518d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 519d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 520d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); 521d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return; 522d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 523d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 524762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index), 525433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 526433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, integer, ptr); 527e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul} 528e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 529e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 530e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 531c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 532d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index) 533d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 53445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul struct gl_array_object *arrayObj; 535d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 536d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 540d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glEnableVertexAttribArrayARB(index)"); 541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 542d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 543d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 54445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj = ctx->Array.ArrayObj; 545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 54645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib)); 54745453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul 54845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul if (!arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 54945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul /* was disabled, now being enabled */ 55045453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 55145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE; 55245453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->_Enabled |= VERT_BIT_GENERIC(index); 553b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul arrayObj->NewArrays |= VERT_BIT_GENERIC(index); 55445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul } 555d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 557d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 558d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 559d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index) 560d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 56145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul struct gl_array_object *arrayObj; 562d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 563d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 564d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 565d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 566d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 56795368f25c1793619e94d464fe94afcea0409ae26Brian Paul "glDisableVertexAttribArrayARB(index)"); 568d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 570d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 57145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj = ctx->Array.ArrayObj; 572d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 57345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib)); 57445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul 57545453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 57645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul /* was enabled, now being disabled */ 57745453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 57845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE; 57945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index); 580b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul arrayObj->NewArrays |= VERT_BIT_GENERIC(index); 58145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul } 582d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 583d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 584d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 585d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** 586d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy 587d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)). This function does 588d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query. 589d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */ 590d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint 591f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname, 592d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const char *caller) 593d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 594d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const struct gl_client_array *array; 595d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 5965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (index >= ctx->Const.VertexProgram.MaxAttribs) { 597d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index); 598d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return 0; 599d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 600d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 601762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 602d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 603762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 604d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 605d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul switch (pname) { 606d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: 607d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Enabled; 608d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: 609d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Size; 610d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: 611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Stride; 612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: 613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Type; 614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: 615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Normalized; 616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->BufferObj->Name; 618d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul case GL_VERTEX_ATTRIB_ARRAY_INTEGER: 6192c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick if ((_mesa_is_desktop_gl(ctx) 6202c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4)) 6212c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick || _mesa_is_gles3(ctx)) { 622d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return array->Integer; 623d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 6241d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul goto error; 6251d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB: 6262c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_instanced_arrays) 6272c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick || _mesa_is_gles3(ctx)) { 6281d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return array->InstanceDivisor; 6291d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 6301d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul goto error; 631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul default: 6321d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul ; /* fall-through */ 633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 6341d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 6351d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulerror: 6361d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname); 6371d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return 0; 638d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 6415c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickstatic const GLfloat * 6425c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickget_current_attrib(struct gl_context *ctx, GLuint index, const char *function) 6435c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick{ 6445c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (index == 0) { 6452c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES 6462c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick * 2.0. Note that we cannot just check for API_OPENGL_CORE here because 6472c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick * that will erroneously allow this usage in a 3.0 forward-compatible 6482c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick * context too. 6492c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick */ 6502c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick if ((ctx->API != API_OPENGL_CORE || ctx->Version < 31) 6512c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick && ctx->API != API_OPENGLES2) { 6525c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function); 6535c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick return NULL; 6545c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 6555c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 6565c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick else if (index >= ctx->Const.VertexProgram.MaxAttribs) { 6575c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick _mesa_error(ctx, GL_INVALID_VALUE, 6585c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function); 6595c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick return NULL; 6605c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 6615c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick 662762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 663762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich 6645c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick FLUSH_CURRENT(ctx, 0); 665762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)]; 6665c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick} 6675c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick 668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) 670d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 671d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 672d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6755c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv"); 6765c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul COPY_4V(params, v); 678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname, 682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribfv"); 683d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 684d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 685d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) 689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6945c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv"); 6955c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 696d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) v[0]; 697d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLdouble) v[1]; 698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLdouble) v[2]; 699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLdouble) v[3]; 700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname, 704d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribdv"); 705d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 706d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 707d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 708d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 709d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 710d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) 711d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 712d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 713d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 714d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 715d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 7165c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv"); 7175c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 718d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX should floats in[0,1] be scaled to full int range? */ 719d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 720d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 721d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 722d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 723d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 724d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 725d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 726d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 727d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribiv"); 728d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 729d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 730d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 731d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 732d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 733d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 734d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params) 735d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 736d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 737d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 738d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 739d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 740422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke const GLint *v = (const GLint *) 7415c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick get_current_attrib(ctx, index, "glGetVertexAttribIiv"); 7425c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 743422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke COPY_4V(params, v); 744d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 745d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 746d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 747d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 748d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIiv"); 749d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 750d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 751d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 752d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 753d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 754d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 755d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params) 756d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 757d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 758d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 759d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 760d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 761422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke const GLuint *v = (const GLuint *) 7625c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick get_current_attrib(ctx, index, "glGetVertexAttribIuiv"); 7635c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 764422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke COPY_4V(params, v); 765d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 766d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 767d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 768d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = get_vertex_array_attrib(ctx, index, pname, 769d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIuiv"); 770d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 771d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 772d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 773d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 774d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 775d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) 776d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 777d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 778d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 779d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 780d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 781d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)"); 782d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 783d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 784d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 785d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) { 786d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)"); 787d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 788d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 789d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 790762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 791d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 792762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; 793d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 794d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 795d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 796d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 7971f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 7981f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7991f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 8001f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 8011f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_VertexPointer(size, type, stride, ptr); 8021f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 8031f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 8041f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 805c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 8061f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 8071f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 8081f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 8091f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 8101f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_NormalPointer(type, stride, ptr); 8111f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 8121f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 8131f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 814c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 8151f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 8161f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 8171f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 8181f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 8191f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_ColorPointer(size, type, stride, ptr); 8201f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 8211f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 8221f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 823c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 8241f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 8251f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 8261f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 8271f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 8281f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_IndexPointer(type, stride, ptr); 8291f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 8301f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 8311f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 832c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 8331f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 8341f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 8351f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 8361f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 8371f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_TexCoordPointer(size, type, stride, ptr); 8381f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 8391f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 8401f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 841c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 8421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 8431f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 8441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 8451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_EdgeFlagPointer(stride, ptr); 8461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 8471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 8481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 849c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 850fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 852fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean tflag, cflag, nflag; /* enable/disable flags */ 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 855f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLenum ctype = 0; /* color type */ 856f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 8574a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul const GLint toffset = 0; /* always zero */ 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint defstride; /* default stride */ 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint c, f; 8605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 861cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 862cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg f = sizeof(GLfloat); 864c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 866c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul if (stride < 0) { 86708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (format) { 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V2F: 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 2; 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 2*f; 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V3F: 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 3*f; 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V2F: 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 2; 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 2*f; 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V3F: 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 3*f; 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C3F_V3F: 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 3; vcomps = 3; 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_N3F_V3F: 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 0; 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4F_N3F_V3F: 916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 4*f; 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 7*f; 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 10*f; 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_V3F: 925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 2*f; 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 5*f; 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_V4F: 931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 0; vcomps = 4; 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 4*f; 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4UB_V3F: 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c+2*f; 942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c+5*f; 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C3F_V3F: 945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 3; vcomps = 3; 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_N3F_V3F: 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 2*f; 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4F_N3F_V3F: 960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 6*f; 965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 9*f; 966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 12*f; 967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_C4F_N3F_V4F: 969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 4; vcomps = 4; 971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 4*f; 973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 8*f; 974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 11*f; 975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 15*f; 976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 97808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (stride==0) { 983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg stride = defstride; 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 986fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 987fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_INDEX_ARRAY ); 988095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul /* XXX also disable secondary color and generic arrays? */ 989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Texcoords */ 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (tflag) { 9924a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 9934a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 994ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul (GLubyte *) pointer + toffset ); 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 997ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Color */ 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (cflag) { 1002fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_COLOR_ARRAY ); 1003cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_ColorPointer( ccomps, ctype, stride, 10044a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul (GLubyte *) pointer + coffset ); 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1007fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_COLOR_ARRAY ); 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Normals */ 1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (nflag) { 1013fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_NORMAL_ARRAY ); 10144a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1017fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_NORMAL_ARRAY ); 1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10204a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul /* Vertices */ 1021fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_VERTEX_ARRAY ); 1022cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 1023cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell (GLubyte *) pointer + voffset ); 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1027c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 1028ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count) 1029ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 1030ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 1031cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1032ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1033ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 10344753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 1035ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 10365857e988be9317810cf713478195b4ed849eea4aEric Anholt if (first < 0) { 10375857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 10385857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 103922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 10405857e988be9317810cf713478195b4ed849eea4aEric Anholt if (count <= 0) { 10415857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 10425857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 10435857e988be9317810cf713478195b4ed849eea4aEric Anholt } 10445857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount != 0) { 10455857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 10465857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 1047ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell } 1048ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 10495857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockFirst = first; 10505857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockCount = count; 10515857e988be9317810cf713478195b4ed849eea4aEric Anholt 1052ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 1053ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 1054ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1055ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1056c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 1057ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void ) 1058ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 1059ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 1060cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1061ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1062ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 10634753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glUnlockArrays\n"); 1064ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 10655857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount == 0) { 10665857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 10675857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 10685857e988be9317810cf713478195b4ed849eea4aEric Anholt } 10695857e988be9317810cf713478195b4ed849eea4aEric Anholt 1070ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockFirst = 0; 1071ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockCount = 0; 1072ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 1073ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 10742525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10752525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10762525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */ 1077c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10787993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first, 10797993832c12bba578010005b344dcd3817be84a42Brian Paul const GLsizei *count, GLsizei primcount ) 10802525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{ 10812525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GET_CURRENT_CONTEXT(ctx); 10822525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GLint i; 10832525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10842525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10852525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10862525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul for (i = 0; i < primcount; i++) { 10872525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul if (count[i] > 0) { 10889bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 10892525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10902525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10912525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul} 10922525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10932525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10943baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1095c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10963baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 10973baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick const GLsizei * count, 10983baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10993baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 11003baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 11013baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 11023baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 11033baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 11043baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 11053baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 11063baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 110703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 11089bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 11093baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 11103baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 11113baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 11123baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 11133baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 11143baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1115c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 11163baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 11173baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLenum type, const GLvoid * const * indices, 11183baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 11193baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 11203baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 11213baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 11223baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 11233baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 11243baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1125d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul /* XXX not sure about ARB_vertex_buffer_object handling here */ 1126d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul 11273baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 11283baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 112903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 11309bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 11313baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 11323baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 11333baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 11343baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 11353baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1136095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/** 11377f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1 1138a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */ 1139a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY 1140a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index) 1141a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{ 1142a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul GET_CURRENT_CONTEXT(ctx); 1143a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 11449c1b41879aab2ff7386c547a2ccce7686c018cf5Eric Anholt if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) { 11457f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); 1146a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul return; 1147a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul } 1148a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1149d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 1150a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1151d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul if (ctx->Array.RestartIndex != index) { 1152d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 1153d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul ctx->Array.RestartIndex = index; 1154d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul } 1155a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul} 1156a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1157a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1158a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/** 11591d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * See GL_ARB_instanced_arrays. 11601d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * Note that the instance divisor only applies to generic arrays, not 11611d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * the legacy vertex arrays. 11621d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul */ 11631d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulvoid GLAPIENTRY 11641d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul_mesa_VertexAttribDivisor(GLuint index, GLuint divisor) 11651d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul{ 1166738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul struct gl_client_array *array; 11671d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul GET_CURRENT_CONTEXT(ctx); 1168738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 11691d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11701d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (!ctx->Extensions.ARB_instanced_arrays) { 11711d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); 11721d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return; 11731d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 11741d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11751d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 11761d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)", 11771d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul index); 11781d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return; 11791d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 11801d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 1181762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 1182762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich 1183738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 1184738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul if (array->InstanceDivisor != divisor) { 1185738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 1186738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul array->InstanceDivisor = divisor; 1187b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index)); 1188738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul } 11891d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul} 11901d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11911d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11921d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11931d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul/** 1194b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another. 1195b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */ 1196b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid 1197f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx, 1198b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *dst, 1199b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *src) 1200b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{ 1201b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Size = src->Size; 1202b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Type = src->Type; 1203b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Format = src->Format; 1204b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Stride = src->Stride; 1205b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->StrideB = src->StrideB; 1206b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Ptr = src->Ptr; 1207b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Enabled = src->Enabled; 1208b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Normalized = src->Normalized; 1209d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul dst->Integer = src->Integer; 12101d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul dst->InstanceDivisor = src->InstanceDivisor; 1211b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_ElementSize = src->_ElementSize; 1212b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 1213b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_MaxElement = src->_MaxElement; 1214b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul} 1215b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1216b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1217b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1218b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/** 121939d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields. 122039d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 122139d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void 122239d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array) 122339d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 122439d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (index >= 0) 1225298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s[%d]: ", name, index); 122639d7524f7b176d4375e230ac60963d197be539f2Brian Paul else 1227298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s: ", name); 12284beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n", 1229298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->Ptr, array->Type, array->Size, 1230298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_ElementSize, array->StrideB, 12314beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul array->BufferObj->Name, (unsigned long) array->BufferObj->Size, 1232298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_MaxElement); 123339d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 123439d7524f7b176d4375e230ac60963d197be539f2Brian Paul 123539d7524f7b176d4375e230ac60963d197be539f2Brian Paul 123639d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 123739d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info. For debug. 123839d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 123939d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid 1240f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx) 124139d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 12426a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 124339d7524f7b176d4375e230ac60963d197be539f2Brian Paul GLuint i; 124439d7524f7b176d4375e230ac60963d197be539f2Brian Paul 12458fe3134622eed34159ff6f72a33558a659e8d299Brian Paul _mesa_update_array_object_max_element(ctx, arrayObj); 12468fe3134622eed34159ff6f72a33558a659e8d299Brian Paul 1247298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("Array Object %u\n", arrayObj->Name); 1248762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) 1249762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]); 1250762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) 1251762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]); 1252762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) 1253762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]); 1254762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) 1255762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled) 1256762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]); 1257762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) 1258762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled) 1259762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]); 1260298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" _MaxElement = %u\n", arrayObj->_MaxElement); 126139d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 126239d7524f7b176d4375e230ac60963d197be539f2Brian Paul 126339d7524f7b176d4375e230ac60963d197be539f2Brian Paul 126439d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 1265095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context. 1266095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */ 1267c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid 1268f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx) 12696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{ 127086f53e6d6bd07e2bc3ffcadeb9a4418fbae06e0bMathias Fröhlich ctx->Array.DefaultArrayObj = ctx->Driver.NewArrayObject(ctx, 0); 12711030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj, 12721030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul ctx->Array.DefaultArrayObj); 1273095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 127412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 127512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul ctx->Array.Objects = _mesa_NewHashTable(); 127612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 127712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 127812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 127912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 128012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 128112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 128212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void 128312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData) 128412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 128512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul struct gl_array_object *arrayObj = (struct gl_array_object *) data; 1286f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = (struct gl_context *) userData; 128712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_delete_array_object(ctx, arrayObj); 128812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 128912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 129012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 129112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 129212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context. 129312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 129412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid 1295f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx) 129612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 129712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 129812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_DeleteHashTable(ctx->Array.Objects); 12996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell} 1300