1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.6 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "bufferobj.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enable.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "hash.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "varray.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "arrayobj.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/dispatch.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Used to do error checking for GL_EXT_vertex_array_bgra */ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BGRA_OR_4 5 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Used to indicate which GL datatypes are accepted by each of the 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glVertex/Color/Attrib/EtcPointer() functions. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BOOL_BIT 0x1 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BYTE_BIT 0x2 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_BYTE_BIT 0x4 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SHORT_BIT 0x8 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_SHORT_BIT 0x10 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INT_BIT 0x20 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_INT_BIT 0x40 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HALF_BIT 0x80 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLOAT_BIT 0x100 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DOUBLE_BIT 0x200 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FIXED_ES_BIT 0x400 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FIXED_GL_BIT 0x800 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_INT_2_10_10_10_REV_BIT 0x1000 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INT_2_10_10_10_REV_BIT 0x2000 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Convert GL datatype enum into a <type>_BIT value seen above */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLbitfield 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtype_to_bit(const struct gl_context *ctx, GLenum type) 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (type) { 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BOOL: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BOOL_BIT; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return BYTE_BIT; 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UNSIGNED_BYTE_BIT; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SHORT: 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SHORT_BIT; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_SHORT: 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UNSIGNED_SHORT_BIT; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT: 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return INT_BIT; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT: 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UNSIGNED_INT_BIT; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_HALF_FLOAT: 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_half_float_vertex) 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return HALF_BIT; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0x0; 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FLOAT: 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FLOAT_BIT; 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DOUBLE: 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return DOUBLE_BIT; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_FIXED: 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_2_10_10_10_REV: 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return UNSIGNED_INT_2_10_10_10_REV_BIT; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INT_2_10_10_10_REV: 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return INT_2_10_10_10_REV_BIT; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do error checking and update state for glVertex/Color/TexCoord/...Pointer 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions. 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param func name of calling function used for error reporting 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param attrib the attribute array index to update 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param legalTypes bitmask of *_BIT above indicating legal datatypes 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param sizeMin min allowable size value 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param sizeMax max allowable size value (may also be BGRA_OR_4) 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param size components per element (1, 2, 3 or 4) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type datatype of each component (GL_FLOAT, GL_INT, etc) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param stride stride between elements, in elements 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param normalized are integer types converted to floats in [-1, 1]? 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param integer integer-valued values (will not be normalized to [-1,1]) 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ptr the address (or offset inside VBO) of the array data 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgupdate_array(struct gl_context *ctx, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *func, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint attrib, GLbitfield legalTypesMask, 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint sizeMin, GLint sizeMax, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint size, GLenum type, GLsizei stride, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean normalized, GLboolean integer, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *ptr) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_client_array *array; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield typeBit; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei elementSize; 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format = GL_RGBA; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says: 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Client vertex arrays - all vertex array attribute pointers must 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * refer to buffer objects (section 2.9.2). The default vertex array 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * object (the name zero) is also deprecated. Calling 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * VertexAttribPointer when no buffer object or no vertex array object 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is bound will generate an INVALID_OPERATION error..." 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The check for VBOs is handled below. 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGL_CORE 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Array.ArrayObj == ctx->Array.DefaultArrayObj)) { 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no array object bound)", 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func); 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_gles(ctx)) { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Once Mesa gets support for GL_OES_vertex_half_float this mask will 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * change. Adding support for this extension isn't quite as trivial as 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we'd like because ES uses a different enum value for GL_HALF_FLOAT. 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypesMask &= ~(FIXED_GL_BIT | HALF_BIT | DOUBLE_BIT); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3.0. The 2_10_10_10 types are added in OpenGL ES 3.0 or 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_OES_vertex_type_10_10_10_2. 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version < 30) { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypesMask &= ~(UNSIGNED_INT_BIT 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | INT_BIT 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | UNSIGNED_INT_2_10_10_10_REV_BIT 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | INT_2_10_10_10_REV_BIT); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* BGRA ordering is not supported in ES contexts. 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sizeMax == BGRA_OR_4) 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeMax = 4; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypesMask &= ~FIXED_ES_BIT; 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_ES2_compatibility) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypesMask &= ~FIXED_GL_BIT; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT | 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typeBit = type_to_bit(ctx, type); 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)", 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func, _mesa_lookup_enum_by_nr(type)); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do size parameter checking. 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * must be handled specially. 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_vertex_array_bgra && 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeMax == BGRA_OR_4 && 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size == GL_BGRA) { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean bgra_error = GL_FALSE; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) { 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type != GL_UNSIGNED_INT_2_10_10_10_REV && 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type != GL_INT_2_10_10_10_REV && 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type != GL_UNSIGNED_BYTE) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bgra_error = GL_TRUE; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (type != GL_UNSIGNED_BYTE) 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bgra_error = GL_TRUE; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bgra_error) { 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = GL_BGRA; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = 4; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (size < sizeMin || size > sizeMax || size > 4) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size); 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev && 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (type == GL_UNSIGNED_INT_2_10_10_10_REV || 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type == GL_INT_2_10_10_10_REV) && size != 4) { 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size); 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(size <= 4); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stride < 0) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride ); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Page 29 (page 44 of the PDF) of the OpenGL 3.3 spec says: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "An INVALID_OPERATION error is generated under any of the following 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * conditions: 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ... 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * * any of the *Pointer commands specifying the location and 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * organization of vertex array data are called while zero is bound 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the ARRAY_BUFFER buffer object binding point (see section 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2.9.6), and the pointer argument is not NULL." 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ptr != NULL && ctx->Array.ArrayObj->ARBsemantics && 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) { 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func); 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org elementSize = _mesa_sizeof_type(type) * size; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array = &ctx->Array.ArrayObj->VertexAttrib[attrib]; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Size = size; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Type = type; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Format = format; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Stride = stride; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->StrideB = stride ? stride : elementSize; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Normalized = normalized; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Integer = integer; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Ptr = (const GLubyte *) ptr; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->_ElementSize = elementSize; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_buffer_object(ctx, &array->BufferObj, 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.ArrayBufferObj); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_ARRAY; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield legalTypes = (ctx->API == API_OPENGLES) 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : (SHORT_BIT | INT_BIT | FLOAT_BIT | 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DOUBLE_BIT | HALF_BIT | 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNSIGNED_INT_2_10_10_10_REV_BIT | 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS, 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 2, 4, 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, GL_FALSE, GL_FALSE, ptr); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr ) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (ctx->API == API_OPENGLES) 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : (BYTE_BIT | SHORT_BIT | INT_BIT | 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNSIGNED_INT_2_10_10_10_REV_BIT | 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 3, 3, 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3, type, stride, GL_TRUE, GL_FALSE, ptr); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (ctx->API == API_OPENGLES) 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : (BYTE_BIT | UNSIGNED_BYTE_BIT | 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SHORT_BIT | UNSIGNED_SHORT_BIT | 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_BIT | UNSIGNED_INT_BIT | 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNSIGNED_INT_2_10_10_10_REV_BIT | 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint sizeMin = (ctx->API == API_OPENGLES) ? 4 : 3; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, sizeMin, BGRA_OR_4, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, GL_TRUE, GL_FALSE, ptr); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr) 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG, 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, 1, 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, type, stride, GL_FALSE, GL_FALSE, ptr); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr) 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT | 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLOAT_BIT | DOUBLE_BIT); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX, 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, 1, 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, type, stride, GL_FALSE, GL_FALSE, ptr); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_SecondaryColorPointerEXT(GLint size, GLenum type, 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei stride, const GLvoid *ptr) 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SHORT_BIT | UNSIGNED_SHORT_BIT | 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_BIT | UNSIGNED_INT_BIT | 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNSIGNED_INT_2_10_10_10_REV_BIT | 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1, 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 3, BGRA_OR_4, 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, GL_TRUE, GL_FALSE, ptr); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride, 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *ptr) 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield legalTypes = (ctx->API == API_OPENGLES) 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : (SHORT_BIT | INT_BIT | 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNSIGNED_INT_2_10_10_10_REV_BIT | 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint sizeMin = (ctx->API == API_OPENGLES) ? 2 : 1; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint unit = ctx->Array.ActiveTexture; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit), 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, sizeMin, 4, 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, GL_FALSE, GL_FALSE, 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr) 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = UNSIGNED_BYTE_BIT; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */ 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean integer = GL_TRUE; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG, 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, 1, 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API != API_OPENGLES) { 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glPointSizePointer(ES 1.x only)"); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE, 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, 1, 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, type, stride, GL_FALSE, GL_FALSE, ptr); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_NV_vertex_program 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set a vertex attribute array. 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that these arrays DO alias the conventional GL vertex arrays 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (position, normal, color, fog, texcoord, etc). 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The generic attribute slots at #16 and above are not touched. 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type, 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei stride, const GLvoid *ptr) 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLOAT_BIT | DOUBLE_BIT); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean normalized = GL_FALSE; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)"); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type == GL_UNSIGNED_BYTE && size != 4) { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)"); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index), 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, BGRA_OR_4, 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, normalized, GL_FALSE, ptr); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ARB_vertex_program 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set a generic vertex attribute array. 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that these arrays DO NOT alias the conventional GL vertex arrays 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (position, normal, color, fog, texcoord, etc). 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type, 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean normalized, 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei stride, const GLvoid *ptr) 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SHORT_BIT | UNSIGNED_SHORT_BIT | 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_BIT | UNSIGNED_INT_BIT | 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org HALF_BIT | FLOAT_BIT | DOUBLE_BIT | 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FIXED_ES_BIT | FIXED_GL_BIT | 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNSIGNED_INT_2_10_10_10_REV_BIT | 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_2_10_10_10_REV_BIT); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)"); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index), 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, BGRA_OR_4, 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, normalized, GL_FALSE, ptr); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_EXT_gpu_shader4 / GL 3.0. 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set an integer-valued vertex attribute array. 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that these arrays DO NOT alias the conventional GL vertex arrays 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (position, normal, color, fog, texcoord, etc). 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type, 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei stride, const GLvoid *ptr) 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT | 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SHORT_BIT | UNSIGNED_SHORT_BIT | 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INT_BIT | UNSIGNED_INT_BIT); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean normalized = GL_FALSE; 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean integer = GL_TRUE; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)"); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index), 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org legalTypes, 1, 4, 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size, type, stride, normalized, integer, ptr); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EnableVertexAttribArrayARB(GLuint index) 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_array_object *arrayObj; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glEnableVertexAttribArrayARB(index)"); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj = ctx->Array.ArrayObj; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib)); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* was disabled, now being enabled */ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_ARRAY); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj->_Enabled |= VERT_BIT_GENERIC(index); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj->NewArrays |= VERT_BIT_GENERIC(index); 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DisableVertexAttribArrayARB(GLuint index) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_array_object *arrayObj; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glDisableVertexAttribArrayARB(index)"); 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj = ctx->Array.ArrayObj; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib)); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) { 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* was enabled, now being disabled */ 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_ARRAY); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE; 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index); 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arrayObj->NewArrays |= VERT_BIT_GENERIC(index); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return info for a vertex attribute array (no alias with legacy 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex attributes (pos, normal, color, etc)). This function does 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query. 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname, 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *caller) 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_client_array *array; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index); 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB: 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->Enabled; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB: 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->Size; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB: 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->Stride; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB: 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->Type; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB: 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->Normalized; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->BufferObj->Name; 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_INTEGER: 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((_mesa_is_desktop_gl(ctx) 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4)) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || _mesa_is_gles3(ctx)) { 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->Integer; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB: 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_instanced_arrays) 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || _mesa_is_gles3(ctx)) { 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return array->InstanceDivisor; 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fall-through */ 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror: 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLfloat * 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_current_attrib(struct gl_context *ctx, GLuint index, const char *function) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index == 0) { 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2.0. Note that we cannot just check for API_OPENGL_CORE here because 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that will erroneously allow this usage in a 3.0 forward-compatible 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * context too. 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((ctx->API != API_OPENGL_CORE || ctx->Version < 31) 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->API != API_OPENGLES2) { 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (index >= ctx->Const.VertexProgram.MaxAttribs) { 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_CURRENT(ctx, 0); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)]; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params) 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv"); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v != NULL) { 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, v); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname, 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribfv"); 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv"); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v != NULL) { 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLdouble) v[0]; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[1] = (GLdouble) v[1]; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[2] = (GLdouble) v[2]; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[3] = (GLdouble) v[3]; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname, 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribdv"); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv"); 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v != NULL) { 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX should floats in[0,1] be scaled to full int range? */ 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLint) v[0]; 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[1] = (GLint) v[1]; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[2] = (GLint) v[2]; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[3] = (GLint) v[3]; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribiv"); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** GL 3.0 */ 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params) 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint *v = (const GLint *) 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_current_attrib(ctx, index, "glGetVertexAttribIiv"); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v != NULL) { 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, v); 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname, 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribIiv"); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** GL 3.0 */ 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params) 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *v = (const GLuint *) 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_current_attrib(ctx, index, "glGetVertexAttribIuiv"); 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v != NULL) { 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, v); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = get_vertex_array_attrib(ctx, index, pname, 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribIuiv"); 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer) 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)"); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) { 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)"); 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride, 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei count, const GLvoid *ptr) 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) count; 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_VertexPointer(size, type, stride, ptr); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count, 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *ptr) 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) count; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_NormalPointer(type, stride, ptr); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count, 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *ptr) 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) count; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ColorPointer(size, type, stride, ptr); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count, 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *ptr) 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) count; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_IndexPointer(type, stride, ptr); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride, 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei count, const GLvoid *ptr) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) count; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexCoordPointer(size, type, stride, ptr); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr) 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) count; 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_EdgeFlagPointer(stride, ptr); 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer) 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean tflag, cflag, nflag; /* enable/disable flags */ 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint tcomps, ccomps, vcomps; /* components per texcoord, color, vertex */ 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum ctype = 0; /* color type */ 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */ 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint toffset = 0; /* always zero */ 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint defstride; /* default stride */ 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint c, f; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f = sizeof(GLfloat); 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stride < 0) { 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" ); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_V2F: 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 0; vcomps = 2; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 0; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 2*f; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_V3F: 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_FALSE; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 0; vcomps = 3; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 0; 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 3*f; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_C4UB_V2F: 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 4; vcomps = 2; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_UNSIGNED_BYTE; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 0; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = c; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = c + 2*f; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_C4UB_V3F: 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 4; vcomps = 3; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_UNSIGNED_BYTE; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 0; 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = c; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = c + 3*f; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_C3F_V3F: 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_FALSE; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 3; vcomps = 3; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_FLOAT; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 0; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 3*f; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 6*f; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_N3F_V3F: 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_FALSE; nflag = GL_TRUE; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 0; vcomps = 3; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noffset = 0; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 3*f; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 6*f; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_C4F_N3F_V3F: 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_FALSE; cflag = GL_TRUE; nflag = GL_TRUE; 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 0; ccomps = 4; vcomps = 3; 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_FLOAT; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 0; 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noffset = 4*f; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 7*f; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 10*f; 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T2F_V3F: 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 2; ccomps = 0; vcomps = 3; 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 2*f; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 5*f; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T4F_V4F: 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_FALSE; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 4; ccomps = 0; vcomps = 4; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 4*f; 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 8*f; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T2F_C4UB_V3F: 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 2; ccomps = 4; vcomps = 3; 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_UNSIGNED_BYTE; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 2*f; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = c+2*f; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = c+5*f; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T2F_C3F_V3F: 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_FALSE; 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 2; ccomps = 3; vcomps = 3; 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_FLOAT; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 2*f; 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 5*f; 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 8*f; 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T2F_N3F_V3F: 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_FALSE; nflag = GL_TRUE; 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 2; ccomps = 0; vcomps = 3; 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noffset = 2*f; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 5*f; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 8*f; 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T2F_C4F_N3F_V3F: 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 2; ccomps = 4; vcomps = 3; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_FLOAT; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 2*f; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noffset = 6*f; 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 9*f; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 12*f; 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_T4F_C4F_N3F_V4F: 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tflag = GL_TRUE; cflag = GL_TRUE; nflag = GL_TRUE; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tcomps = 4; ccomps = 4; vcomps = 4; 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctype = GL_FLOAT; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org coffset = 4*f; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org noffset = 8*f; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org voffset = 11*f; 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defstride = 15*f; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" ); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (stride==0) { 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stride = defstride; 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY ); 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_DisableClientState( GL_INDEX_ARRAY ); 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX also disable secondary color and generic arrays? */ 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Texcoords */ 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tflag) { 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY ); 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride, 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLubyte *) pointer + toffset ); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY ); 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Color */ 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cflag) { 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_EnableClientState( GL_COLOR_ARRAY ); 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ColorPointer( ccomps, ctype, stride, 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLubyte *) pointer + coffset ); 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_DisableClientState( GL_COLOR_ARRAY ); 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Normals */ 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (nflag) { 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_EnableClientState( GL_NORMAL_ARRAY ); 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset ); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_DisableClientState( GL_NORMAL_ARRAY ); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Vertices */ 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_EnableClientState( GL_VERTEX_ARRAY ); 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_VertexPointer( vcomps, GL_FLOAT, stride, 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLubyte *) pointer + voffset ); 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_LockArraysEXT(GLint first, GLsizei count) 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & VERBOSE_API) 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glLockArrays %d %d\n", first, count); 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (first < 0) { 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" ); 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count <= 0) { 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" ); 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Array.LockCount != 0) { 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" ); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.LockFirst = first; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.LockCount = count; 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_ARRAY; 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_UnlockArraysEXT( void ) 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & VERBOSE_API) 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glUnlockArrays\n"); 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Array.LockCount == 0) { 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" ); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.LockFirst = 0; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.LockCount = 0; 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_ARRAY; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_EXT_multi_draw_arrays */ 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first, 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLsizei *count, GLsizei primcount ) 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < primcount; i++) { 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (count[i] > 0) { 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i])); 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_IBM_multimode_draw_arrays */ 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first, 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLsizei * count, 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei primcount, GLint modestride ) 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = 0 ; i < primcount ; i++ ) { 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( count[i] > 0 ) { 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] )); 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_IBM_multimode_draw_arrays */ 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count, 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum type, const GLvoid * const * indices, 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei primcount, GLint modestride ) 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX not sure about ARB_vertex_buffer_object handling here */ 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for ( i = 0 ; i < primcount ; i++ ) { 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ( count[i] > 0 ) { 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride)); 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] )); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_NV_primitive_restart and GL 3.1 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PrimitiveRestartIndex(GLuint index) 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) { 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()"); 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Array.RestartIndex != index) { 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_TRANSFORM); 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.RestartIndex = index; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See GL_ARB_instanced_arrays. 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that the instance divisor only applies to generic arrays, not 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the legacy vertex arrays. 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribDivisor(GLuint index, GLuint divisor) 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_client_array *array; 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_instanced_arrays) { 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()"); 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= ctx->Const.VertexProgram.MaxAttribs) { 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)", 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org index); 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib)); 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (array->InstanceDivisor != divisor) { 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_ARRAY); 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->InstanceDivisor = divisor; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index)); 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy one client vertex array to another. 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_copy_client_array(struct gl_context *ctx, 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_client_array *dst, 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_client_array *src) 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Size = src->Size; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Type = src->Type; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Format = src->Format; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Stride = src->Stride; 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->StrideB = src->StrideB; 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Ptr = src->Ptr; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Enabled = src->Enabled; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Normalized = src->Normalized; 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->Integer = src->Integer; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->InstanceDivisor = src->InstanceDivisor; 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->_ElementSize = src->_ElementSize; 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj); 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst->_MaxElement = src->_MaxElement; 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print vertex array's fields. 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_array(const char *name, GLint index, const struct gl_client_array *array) 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= 0) 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" %s[%d]: ", name, index); 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" %s: ", name); 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n", 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->Ptr, array->Type, array->Size, 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->_ElementSize, array->StrideB, 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->BufferObj->Name, (unsigned long) array->BufferObj->Size, 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array->_MaxElement); 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print current vertex object/array info. For debug. 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_print_arrays(struct gl_context *ctx) 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_array_object_max_element(ctx, arrayObj); 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Array Object %u\n", arrayObj->Name); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]); 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]); 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]); 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled) 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]); 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++) 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled) 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]); 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf(" _MaxElement = %u\n", arrayObj->_MaxElement); 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize vertex array state for given context. 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_varray(struct gl_context *ctx) 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.DefaultArrayObj = ctx->Driver.NewArrayObject(ctx, 0); 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj, 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.DefaultArrayObj); 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.ActiveTexture = 0; /* GL_ARB_multitexture */ 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Array.Objects = _mesa_NewHashTable(); 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Callback for deleting an array object. Called by _mesa_HashDeleteAll(). 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdelete_arrayobj_cb(GLuint id, void *data, void *userData) 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_array_object *arrayObj = (struct gl_array_object *) data; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = (struct gl_context *) userData; 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_delete_array_object(ctx, arrayObj); 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free vertex array state for given context. 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_free_varray_data(struct gl_context *ctx) 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx); 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_DeleteHashTable(ctx->Array.Objects); 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1300