varray.c revision d56ad273c0ff37d790c614b2d3f04c1249b47307
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: 950f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák return ctx->API == API_OPENGL ? FIXED_GL_BIT : FIXED_ES_BIT; 966cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie case GL_UNSIGNED_INT_2_10_10_10_REV: 976cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie return UNSIGNED_INT_2_10_10_10_REV_BIT; 986cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie case GL_INT_2_10_10_10_REV: 996cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie return INT_2_10_10_10_REV_BIT; 100433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul default: 101433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return 0; 102433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 103433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul} 104433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 105433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 106c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/** 107433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * Do error checking and update state for glVertex/Color/TexCoord/...Pointer 108433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * functions. 109f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * 110433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param func name of calling function used for error reporting 111762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich * \param attrib the attribute array index to update 112433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param legalTypes bitmask of *_BIT above indicating legal datatypes 113433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMin min allowable size value 114433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMax max allowable size value (may also be BGRA_OR_4) 115f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size components per element (1, 2, 3 or 4) 116f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 117f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride stride between elements, in elements 118f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized are integer types converted to floats in [-1, 1]? 119d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer integer-valued values (will not be normalized to [-1,1]) 120f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr the address (or offset inside VBO) of the array data 121c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */ 122f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void 123433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulupdate_array(struct gl_context *ctx, 124433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const char *func, 125762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich GLuint attrib, GLbitfield legalTypesMask, 126433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLint sizeMin, GLint sizeMax, 127433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLint size, GLenum type, GLsizei stride, 128433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLboolean normalized, GLboolean integer, 129d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLvoid *ptr) 130c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{ 131762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich struct gl_client_array *array; 132433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLbitfield typeBit; 133433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLsizei elementSize; 134433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul GLenum format = GL_RGBA; 135433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1369946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) { 1379946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */ 1380f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák legalTypesMask &= ~FIXED_ES_BIT; 1390f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák } 1400f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák if (!ctx->Extensions.ARB_ES2_compatibility) { 1410f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák legalTypesMask &= ~FIXED_GL_BIT; 14211dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 1436cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 1446cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT | 1456cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 1466cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie } 14711dd228415d9299f3afa81525d0e588135099b4bBrian Paul 148433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul typeBit = type_to_bit(ctx, type); 149433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) { 150433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)", 151433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul func, _mesa_lookup_enum_by_nr(type)); 152433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 153433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 154433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 155433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul /* Do size parameter checking. 156433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and 157433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * must be handled specially. 158433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */ 159433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (ctx->Extensions.EXT_vertex_array_bgra && 160433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul sizeMax == BGRA_OR_4 && 161433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size == GL_BGRA) { 16299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie GLboolean bgra_error = GL_FALSE; 16399c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie 16499c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 16599c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (type != GL_UNSIGNED_INT_2_10_10_10_REV && 16699c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie type != GL_INT_2_10_10_10_REV && 16799c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie type != GL_UNSIGNED_BYTE) 16899c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie bgra_error = GL_TRUE; 16999c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie } else if (type != GL_UNSIGNED_BYTE) 17099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie bgra_error = GL_TRUE; 17199c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie 17299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie if (bgra_error) { 173433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func); 174433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 175433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 176433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul format = GL_BGRA; 177433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size = 4; 178433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 179433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul else if (size < sizeMin || size > sizeMax || size > 4) { 180433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size); 181433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 182433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 183433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 1856cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie (type == GL_UNSIGNED_INT_2_10_10_10_REV || 1866cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie type == GL_INT_2_10_10_10_REV) && size != 4) { 1876cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size); 1886cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie } 1896cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie 190433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul ASSERT(size <= 4); 191433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 192433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul if (stride < 0) { 193433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride ); 194433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul return; 195433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul } 196e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 197e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul if (ctx->Array.ArrayObj->VBOonly && 198efcf5aa13f2000eb3620a99f82043001db07e6b2Brian Paul !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) { 199e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs. 200e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul * Generate GL_INVALID_OPERATION if that's not true. 201e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul */ 202433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func); 203f549f4c4b6012178df3706b26539ca672399260fBrian Paul return; 204e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul } 205e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul 206433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul elementSize = _mesa_sizeof_type(type) * size; 207433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 208762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich array = &ctx->Array.ArrayObj->VertexAttrib[attrib]; 209c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Size = size; 210c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Type = type; 21176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul array->Format = format; 212c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Stride = stride; 213c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->StrideB = stride ? stride : elementSize; 214c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Normalized = normalized; 2158f84c237b360be69f9b6ac51465c729b3ada196aPaul Berry array->Integer = integer; 216c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul array->Ptr = (const GLubyte *) ptr; 2170077c879b57f663c038becdde37b2f6671f59150Brian Paul array->_ElementSize = elementSize; 2180077c879b57f663c038becdde37b2f6671f59150Brian Paul 21937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul _mesa_reference_buffer_object(ctx, &array->BufferObj, 22037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul ctx->Array.ArrayBufferObj); 22137c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul 222c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul ctx->NewState |= _NEW_ARRAY; 223762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ctx->Array.NewState |= VERT_BIT(attrib); 224c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul} 225c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 226c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 227c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 228fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 23011dd228415d9299f3afa81525d0e588135099b4bBrian Paul GLbitfield legalTypes = (SHORT_BIT | INT_BIT | FLOAT_BIT | 2316cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie DOUBLE_BIT | HALF_BIT | FIXED_ES_BIT | 2326cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 2336cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 234fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 23711dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API == API_OPENGLES) 23811dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypes |= BYTE_BIT; 23911dd228415d9299f3afa81525d0e588135099b4bBrian Paul 240762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS, 241433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 2, 4, 242433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, ptr); 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 246c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 247fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 249433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | SHORT_BIT | INT_BIT | 250433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 2516cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | 2526cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 2536cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 254fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2565e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 257762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL, 258433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, 3, 259433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 3, type, stride, GL_TRUE, GL_FALSE, ptr); 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 263c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 264fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 266433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 267433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 268433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 269433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 2706cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | 2716cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 2726cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 273fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul 276762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0, 277433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 278433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 282c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 283fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 284fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 285433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 286fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 287cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2885e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 289762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG, 290433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 291433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 292fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 295c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 298433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | 299433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 300fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 301cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 303762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX, 304433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 305433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 309c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 3105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 311fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GLsizei stride, const GLvoid *ptr) 312fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{ 313433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 314433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 315433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 3166cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 3176cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 3186cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 319fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell GET_CURRENT_CONTEXT(ctx); 320cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 321fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 322762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1, 323433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 3, BGRA_OR_4, 324433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_TRUE, GL_FALSE, ptr); 325fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell} 326fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 327fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell 328c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 3292edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 3302edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul const GLvoid *ptr) 331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 33211dd228415d9299f3afa81525d0e588135099b4bBrian Paul GLbitfield legalTypes = (SHORT_BIT | INT_BIT | 3330c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 3346cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | 3356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 3366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 338c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul const GLuint unit = ctx->Array.ActiveTexture; 339cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 34111dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API == API_OPENGLES) 34211dd228415d9299f3afa81525d0e588135099b4bBrian Paul legalTypes |= BYTE_BIT; 34311dd228415d9299f3afa81525d0e588135099b4bBrian Paul 344762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit), 345433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 346433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, GL_FALSE, GL_FALSE, 347d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ptr); 348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 351c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 352c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 354ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; 355d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */ 356d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 360762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG, 361433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 362ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr); 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3661cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY 3671cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 3681cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{ 3690f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); 3701cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul GET_CURRENT_CONTEXT(ctx); 3711cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3721cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 37311dd228415d9299f3afa81525d0e588135099b4bBrian Paul if (ctx->API != API_OPENGLES) { 37411dd228415d9299f3afa81525d0e588135099b4bBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 37511dd228415d9299f3afa81525d0e588135099b4bBrian Paul "glPointSizePointer(ES 1.x only)"); 37611dd228415d9299f3afa81525d0e588135099b4bBrian Paul return; 37711dd228415d9299f3afa81525d0e588135099b4bBrian Paul } 37811dd228415d9299f3afa81525d0e588135099b4bBrian Paul 379762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE, 380433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 1, 381433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul 1, type, stride, GL_FALSE, GL_FALSE, ptr); 3821cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul} 3831cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 3841cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul 385148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program 386a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 387a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array. 388a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays 389a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 390a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched. 391a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 392c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 39392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 39492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 3952edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{ 396433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | 397433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul FLOAT_BIT | DOUBLE_BIT); 39829fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler GLboolean normalized = GL_FALSE; 3992edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul GET_CURRENT_CONTEXT(ctx); 4002edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 4012edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 402d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 4032edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 4042edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 4052edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 4062edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 4072edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul if (type == GL_UNSIGNED_BYTE && size != 4) { 4082edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 4092edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul return; 4102edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul } 4112edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul 412762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index), 413433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 414433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 4152edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul} 416148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 4181f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 419148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program 420a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/** 421a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array. 422a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 423a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc). 424a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */ 425c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 42692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 42792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLboolean normalized, 42892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GLsizei stride, const GLvoid *ptr) 42992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{ 430433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 431433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 432433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT | 433433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 4346cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie FIXED_ES_BIT | FIXED_GL_BIT | 4356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie UNSIGNED_INT_2_10_10_10_REV_BIT | 4366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie INT_2_10_10_10_REV_BIT); 43792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul GET_CURRENT_CONTEXT(ctx); 43892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 43992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 44005051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 44192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 44292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul return; 44392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul } 44492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 445762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index), 446433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, BGRA_OR_4, 447433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, GL_FALSE, ptr); 44892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul} 449148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif 45092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 45192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul 452e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/** 453d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0. 454e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array. 455e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays 456e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc). 457e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */ 458e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY 459e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, 460e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul GLsizei stride, const GLvoid *ptr) 461e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{ 462433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 463433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul SHORT_BIT | UNSIGNED_SHORT_BIT | 464433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul INT_BIT | UNSIGNED_INT_BIT); 465d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean normalized = GL_FALSE; 466d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul const GLboolean integer = GL_TRUE; 467d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul GET_CURRENT_CONTEXT(ctx); 468d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 469d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 470d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 471d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); 472d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return; 473d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 474d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul 475762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index), 476433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul legalTypes, 1, 4, 477433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul size, type, stride, normalized, integer, ptr); 478e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul} 479e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 480e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 481e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul 482c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 483d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index) 484d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 485d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 486d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 487d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 488d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 489d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 490d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glEnableVertexAttribArrayARB(index)"); 491d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 492d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 493d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 494762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 495d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 496d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 497762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE; 498104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich ctx->Array.ArrayObj->_Enabled |= VERT_BIT_GENERIC(index); 499104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich ctx->Array.NewState |= VERT_BIT_GENERIC(index); 500d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 501d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 502d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 503d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 504d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index) 505d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 506d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 507d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 508d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 509d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 510d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 51195368f25c1793619e94d464fe94afcea0409ae26Brian Paul "glDisableVertexAttribArrayARB(index)"); 512d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 513d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 514d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 515762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 516d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 517d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul FLUSH_VERTICES(ctx, _NEW_ARRAY); 518762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE; 519104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich ctx->Array.ArrayObj->_Enabled &= ~VERT_BIT_GENERIC(index); 520104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich ctx->Array.NewState |= VERT_BIT_GENERIC(index); 521d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 522d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 523d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 524d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** 525d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy 526d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)). This function does 527d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query. 528d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */ 529d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint 530f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname, 531d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const char *caller) 532d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 533d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul const struct gl_client_array *array; 534d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 5355c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (index >= ctx->Const.VertexProgram.MaxAttribs) { 536d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index); 537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return 0; 538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 540762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 542762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 543d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 544d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul switch (pname) { 545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: 546d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Enabled; 547d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: 548d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Size; 549d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: 550d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Stride; 551d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: 552d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Type; 553d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: 554d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->Normalized; 555d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return array->BufferObj->Name; 557d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul case GL_VERTEX_ATTRIB_ARRAY_INTEGER: 558d56ad273c0ff37d790c614b2d3f04c1249b47307Kenneth Graunke if (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_gpu_shader4) { 559d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul return array->Integer; 560d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul } 5611d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul goto error; 5621d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB: 5631d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (ctx->Extensions.ARB_instanced_arrays) { 5641d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return array->InstanceDivisor; 5651d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 5661d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul goto error; 567d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul default: 5681d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul ; /* fall-through */ 569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 5701d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 5711d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulerror: 5721d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname); 5731d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return 0; 574d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 575d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 576d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 5775c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickstatic const GLfloat * 5785c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickget_current_attrib(struct gl_context *ctx, GLuint index, const char *function) 5795c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick{ 5805c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (index == 0) { 5815c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (ctx->API != API_OPENGLES2) { 5825c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function); 5835c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick return NULL; 5845c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 5855c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 5865c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick else if (index >= ctx->Const.VertexProgram.MaxAttribs) { 5875c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick _mesa_error(ctx, GL_INVALID_VALUE, 5885c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function); 5895c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick return NULL; 5905c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick } 5915c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick 592762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 593762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich 5945c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick FLUSH_CURRENT(ctx, 0); 595762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)]; 5965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick} 5975c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick 598d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 599d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) 600d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 601d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 602d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 603d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 604d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6055c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv"); 6065c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 607d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul COPY_4V(params, v); 608d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 609d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 610d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname, 612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribfv"); 613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 618d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) 619d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 620d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 621d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 622d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 623d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6245c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv"); 6255c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 626d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) v[0]; 627d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLdouble) v[1]; 628d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLdouble) v[2]; 629d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLdouble) v[3]; 630d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 632d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname, 634d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribdv"); 635d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 636d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 637d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 638d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) 641d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 642d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 643d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 644d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 645d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6465c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv"); 6475c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 648d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX should floats in[0,1] be scaled to full int range? */ 649d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 650d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 651d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 652d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 653d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 654d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 655d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 656d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 657d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribiv"); 658d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 659d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 660d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 661d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 662d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 663d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 664d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params) 665d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 666d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 667d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6705c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = 6715c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick get_current_attrib(ctx, index, "glGetVertexAttribIiv"); 6725c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX we don't have true integer-valued vertex attribs yet */ 674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) v[0]; 675d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLint) v[1]; 676d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLint) v[2]; 677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLint) v[3]; 678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIiv"); 683d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 684d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 685d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */ 688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params) 690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 694d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 6955c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick const GLfloat *v = 6965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick get_current_attrib(ctx, index, "glGetVertexAttribIuiv"); 6975c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick if (v != NULL) { 698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul /* XXX we don't have true integer-valued vertex attribs yet */ 699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = (GLuint) v[0]; 700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[1] = (GLuint) v[1]; 701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[2] = (GLuint) v[2]; 702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[3] = (GLuint) v[3]; 703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 704d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 705d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul else { 706d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul params[0] = get_vertex_array_attrib(ctx, index, pname, 707d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul "glGetVertexAttribIuiv"); 708d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 709d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 710d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 711d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 712d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 713d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) 714d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{ 715d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul GET_CURRENT_CONTEXT(ctx); 716d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul ASSERT_OUTSIDE_BEGIN_END(ctx); 717d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 718d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 719d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)"); 720d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 721d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 722d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 723d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) { 724d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)"); 725d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul return; 726d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul } 727d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 728762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 729d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 730762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; 731d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul} 732d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 733d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul 734d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY 7351f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 7361f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7371f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7381f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7391f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_VertexPointer(size, type, stride, ptr); 7401f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7411f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 743c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_NormalPointer(type, stride, ptr); 7491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7501f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 752c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 7541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7561f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7571f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_ColorPointer(size, type, stride, ptr); 7581f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7591f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7601f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 761c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7621f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 7631f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul const GLvoid *ptr) 7641f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7651f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7661f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_IndexPointer(type, stride, ptr); 7671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7681f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7691f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 770c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7711f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 7721f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul GLsizei count, const GLvoid *ptr) 7731f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7741f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7751f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_TexCoordPointer(size, type, stride, ptr); 7761f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7771f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7781f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 779c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 7801f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 7811f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{ 7821f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul (void) count; 7831f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul _mesa_EdgeFlagPointer(stride, ptr); 7841f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul} 7851f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 7861f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul 787c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean tflag, cflag, nflag; /* enable/disable flags */ 792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 793f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLenum ctype = 0; /* color type */ 794f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 7954a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul const GLint toffset = 0; /* always zero */ 796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint defstride; /* default stride */ 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint c, f; 7985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen 799cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 800cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg f = sizeof(GLfloat); 802c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 804c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul if (stride < 0) { 80508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (format) { 810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V2F: 811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 2; 813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 2*f; 815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_V3F: 817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 0; 820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 3*f; 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V2F: 823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 2; 825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 2*f; 829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4UB_V3F: 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c; 836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c + 3*f; 837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C3F_V3F: 839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 3; vcomps = 3; 841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_N3F_V3F: 847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 0; vcomps = 3; 849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 0; 850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 3*f; 851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 6*f; 852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_C4F_N3F_V3F: 854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 0; ccomps = 4; vcomps = 3; 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 0; 858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 4*f; 859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 7*f; 860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 10*f; 861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_V3F: 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 2*f; 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 5*f; 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_V4F: 869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 0; vcomps = 4; 871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 4*f; 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4UB_V3F: 875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_UNSIGNED_BYTE; 878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = c+2*f; 880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = c+5*f; 881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C3F_V3F: 883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 3; vcomps = 3; 885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_N3F_V3F: 891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 0; vcomps = 3; 893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 2*f; 894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 5*f; 895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 8*f; 896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T2F_C4F_N3F_V3F: 898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 2; ccomps = 4; vcomps = 3; 900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 2*f; 902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 6*f; 903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 9*f; 904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 12*f; 905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_T4F_C4F_N3F_V4F: 907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg tcomps = 4; ccomps = 4; vcomps = 4; 909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctype = GL_FLOAT; 910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg coffset = 4*f; 911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg noffset = 8*f; 912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg voffset = 11*f; 913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg defstride = 15*f; 914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 91608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (stride==0) { 921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg stride = defstride; 922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 924fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 925fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_INDEX_ARRAY ); 926095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul /* XXX also disable secondary color and generic arrays? */ 927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Texcoords */ 929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (tflag) { 9304a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 9314a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 932ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul (GLubyte *) pointer + toffset ); 933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 935ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Color */ 939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (cflag) { 940fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_COLOR_ARRAY ); 941cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_ColorPointer( ccomps, ctype, stride, 9424a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul (GLubyte *) pointer + coffset ); 943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 945fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_COLOR_ARRAY ); 946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Normals */ 950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (nflag) { 951fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_NORMAL_ARRAY ); 9524a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 955fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_DisableClientState( GL_NORMAL_ARRAY ); 956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 9584a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul /* Vertices */ 959fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul _mesa_EnableClientState( GL_VERTEX_ARRAY ); 960cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 961cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell (GLubyte *) pointer + voffset ); 962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 965c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 966ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count) 967ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 968ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 969cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 970ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 971ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 9724753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 973ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 9745857e988be9317810cf713478195b4ed849eea4aEric Anholt if (first < 0) { 9755857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 9765857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 97722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes } 9785857e988be9317810cf713478195b4ed849eea4aEric Anholt if (count <= 0) { 9795857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 9805857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 9815857e988be9317810cf713478195b4ed849eea4aEric Anholt } 9825857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount != 0) { 9835857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 9845857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 985ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell } 986ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 9875857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockFirst = first; 9885857e988be9317810cf713478195b4ed849eea4aEric Anholt ctx->Array.LockCount = count; 9895857e988be9317810cf713478195b4ed849eea4aEric Anholt 990ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 991104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich ctx->Array.NewState |= VERT_BIT_ALL; 992ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 993ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 994ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 995c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 996ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void ) 997ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{ 998ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell GET_CURRENT_CONTEXT(ctx); 999cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1000ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 1001ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell if (MESA_VERBOSE & VERBOSE_API) 10024753d60dd070bb08d0116076bcc08025c86ce857Brian Paul _mesa_debug(ctx, "glUnlockArrays\n"); 1003ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell 10045857e988be9317810cf713478195b4ed849eea4aEric Anholt if (ctx->Array.LockCount == 0) { 10055857e988be9317810cf713478195b4ed849eea4aEric Anholt _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 10065857e988be9317810cf713478195b4ed849eea4aEric Anholt return; 10075857e988be9317810cf713478195b4ed849eea4aEric Anholt } 10085857e988be9317810cf713478195b4ed849eea4aEric Anholt 1009ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockFirst = 0; 1010ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->Array.LockCount = 0; 1011ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell ctx->NewState |= _NEW_ARRAY; 1012104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich ctx->Array.NewState |= VERT_BIT_ALL; 1013ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell} 10142525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10152525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10162525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */ 1017c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10187993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first, 10197993832c12bba578010005b344dcd3817be84a42Brian Paul const GLsizei *count, GLsizei primcount ) 10202525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{ 10212525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GET_CURRENT_CONTEXT(ctx); 10222525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul GLint i; 10232525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10242525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10252525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10262525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul for (i = 0; i < primcount; i++) { 10272525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul if (count[i] > 0) { 10289bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 10292525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10302525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul } 10312525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul} 10322525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10332525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul 10343baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1035c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10363baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 10373baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick const GLsizei * count, 10383baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10393baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 10403baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 10413baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 10423baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10433baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10443baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10453baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 10463baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 104703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10489bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 10493baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10503baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10513baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 10523baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10533baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10543baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */ 1055c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 10563baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 10573baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLenum type, const GLvoid * const * indices, 10583baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLsizei primcount, GLint modestride ) 10593baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{ 10603baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GET_CURRENT_CONTEXT(ctx); 10613baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick GLint i; 10623baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10633baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 10643baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1065d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul /* XXX not sure about ARB_vertex_buffer_object handling here */ 1066d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul 10673baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick for ( i = 0 ; i < primcount ; i++ ) { 10683baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick if ( count[i] > 0 ) { 106903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 10709bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 10713baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10723baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick } 10733baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick} 10743baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 10753baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick 1076095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/** 10777f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1 1078a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */ 1079a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY 1080a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index) 1081a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{ 1082a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul GET_CURRENT_CONTEXT(ctx); 1083a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 10847f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul if (!ctx->Extensions.NV_primitive_restart && 10857f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul ctx->VersionMajor * 10 + ctx->VersionMinor < 31) { 10867f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); 1087a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul return; 1088a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul } 1089a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1090a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1091a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1092a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 1093a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1094a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul ctx->Array.RestartIndex = index; 1095a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul} 1096a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1097a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul 1098a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/** 10991d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * See GL_ARB_instanced_arrays. 11001d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * Note that the instance divisor only applies to generic arrays, not 11011d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * the legacy vertex arrays. 11021d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul */ 11031d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulvoid GLAPIENTRY 11041d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul_mesa_VertexAttribDivisor(GLuint index, GLuint divisor) 11051d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul{ 11061d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul GET_CURRENT_CONTEXT(ctx); 11071d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 11081d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11091d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (!ctx->Extensions.ARB_instanced_arrays) { 11101d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); 11111d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return; 11121d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 11131d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11141d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul if (index >= ctx->Const.VertexProgram.MaxAttribs) { 11151d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)", 11161d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul index); 11171d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul return; 11181d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul } 11191d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 1120762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 1121762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich 1122762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].InstanceDivisor = divisor; 11231d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul} 11241d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11251d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11261d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul 11271d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul/** 1128b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another. 1129b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */ 1130b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid 1131f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx, 1132b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *dst, 1133b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul struct gl_client_array *src) 1134b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{ 1135b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Size = src->Size; 1136b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Type = src->Type; 1137b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Format = src->Format; 1138b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Stride = src->Stride; 1139b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->StrideB = src->StrideB; 1140b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Ptr = src->Ptr; 1141b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Enabled = src->Enabled; 1142b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->Normalized = src->Normalized; 1143d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul dst->Integer = src->Integer; 11441d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul dst->InstanceDivisor = src->InstanceDivisor; 1145b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_ElementSize = src->_ElementSize; 1146b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 1147b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul dst->_MaxElement = src->_MaxElement; 1148b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul} 1149b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1150b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1151b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul 1152b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/** 115339d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields. 115439d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 115539d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void 115639d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array) 115739d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 115839d7524f7b176d4375e230ac60963d197be539f2Brian Paul if (index >= 0) 1159298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s[%d]: ", name, index); 116039d7524f7b176d4375e230ac60963d197be539f2Brian Paul else 1161298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" %s: ", name); 11624beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n", 1163298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->Ptr, array->Type, array->Size, 1164298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_ElementSize, array->StrideB, 11654beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul array->BufferObj->Name, (unsigned long) array->BufferObj->Size, 1166298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg array->_MaxElement); 116739d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 116839d7524f7b176d4375e230ac60963d197be539f2Brian Paul 116939d7524f7b176d4375e230ac60963d197be539f2Brian Paul 117039d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 117139d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info. For debug. 117239d7524f7b176d4375e230ac60963d197be539f2Brian Paul */ 117339d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid 1174f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx) 117539d7524f7b176d4375e230ac60963d197be539f2Brian Paul{ 11766a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 117739d7524f7b176d4375e230ac60963d197be539f2Brian Paul GLuint i; 117839d7524f7b176d4375e230ac60963d197be539f2Brian Paul 11798fe3134622eed34159ff6f72a33558a659e8d299Brian Paul _mesa_update_array_object_max_element(ctx, arrayObj); 11808fe3134622eed34159ff6f72a33558a659e8d299Brian Paul 1181298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("Array Object %u\n", arrayObj->Name); 1182762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) 1183762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]); 1184762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) 1185762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]); 1186762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) 1187762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]); 1188762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) 1189762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled) 1190762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]); 1191762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) 1192762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled) 1193762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]); 1194298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf(" _MaxElement = %u\n", arrayObj->_MaxElement); 119539d7524f7b176d4375e230ac60963d197be539f2Brian Paul} 119639d7524f7b176d4375e230ac60963d197be539f2Brian Paul 119739d7524f7b176d4375e230ac60963d197be539f2Brian Paul 119839d7524f7b176d4375e230ac60963d197be539f2Brian Paul/** 1199095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context. 1200095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */ 1201c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid 1202f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx) 12036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{ 1204ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0); 12051030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj, 12061030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul ctx->Array.DefaultArrayObj); 1207095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 120812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 120912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul ctx->Array.Objects = _mesa_NewHashTable(); 121012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 121112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 121212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 121312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 121412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 121512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 121612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void 121712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData) 121812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 121912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul struct gl_array_object *arrayObj = (struct gl_array_object *) data; 1220f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = (struct gl_context *) userData; 122112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_delete_array_object(ctx, arrayObj); 122212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul} 122312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 122412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul 122512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/** 122612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context. 122712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */ 122812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid 1229f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx) 123012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{ 123112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 123212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul _mesa_DeleteHashTable(ctx->Array.Objects); 12336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell} 1234