vbo_exec_array.c revision 2cb3594af9cd1434aa2c408cd6f8d51bcd12e8ea
1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/************************************************************************** 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 3fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * All Rights Reserved. 5fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 6fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * copy of this software and associated documentation files (the 8fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * "Software"), to deal in the Software without restriction, including 9fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 10fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 11fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 12fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * the following conditions: 13fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 14fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * The above copyright notice and this permission notice (including the 15fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 16fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * of the Software. 17fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 18fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 26fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell **************************************************************************/ 27fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 28fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "glheader.h" 29fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "context.h" 30fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "state.h" 31fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "api_validate.h" 32fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "api_noop.h" 33fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "dispatch.h" 34fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 35fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h" 36fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 37fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic GLuint get_max_index( GLuint count, GLuint type, 38fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLvoid *indices ) 39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 40fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLint i; 41fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 42fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* Compute max element. This is only needed for upload of non-VBO, 43fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * non-constant data elements. 44fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 45fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * XXX: Postpone this calculation until it is known that it is 46fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * needed. Otherwise could scan this pointlessly in the all-vbo 47fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * case. 48fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 49fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell switch(type) { 50fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_UNSIGNED_INT: { 51fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLuint *ui_indices = (const GLuint *)indices; 52fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint max_ui = 0; 53fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < count; i++) 54fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ui_indices[i] > max_ui) 55fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell max_ui = ui_indices[i]; 56fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return max_ui; 57fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 58fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_UNSIGNED_SHORT: { 59fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLushort *us_indices = (const GLushort *)indices; 60fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint max_us = 0; 61fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < count; i++) 62fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (us_indices[i] > max_us) 63fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell max_us = us_indices[i]; 64fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return max_us; 65fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 66fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_UNSIGNED_BYTE: { 67fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLubyte *ub_indices = (const GLubyte *)indices; 68fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint max_ub = 0; 69fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < count; i++) 70fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ub_indices[i] > max_ub) 71fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell max_ub = ub_indices[i]; 72fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return max_ub; 73fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 74fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell default: 75fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return 0; 76fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 78fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 79fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 80fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* Just translate the arrayobj into a sane layout. 81fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 82fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void bind_array_obj( GLcontext *ctx ) 83fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 845a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 855a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 86fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint i; 87fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* TODO: Fix the ArrayObj struct to keep legacy arrays in an array 89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * rather than as individual named arrays. Then this function can 90fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * go away. 91fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 92fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_POS] = &ctx->Array.ArrayObj->Vertex; 9301e238e5d51dabd28646356de825aa43a7290373Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_WEIGHT] = &vbo->legacy_currval[VERT_ATTRIB_WEIGHT]; 94fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_NORMAL] = &ctx->Array.ArrayObj->Normal; 95fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_COLOR0] = &ctx->Array.ArrayObj->Color; 96fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_COLOR1] = &ctx->Array.ArrayObj->SecondaryColor; 97fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_FOG] = &ctx->Array.ArrayObj->FogCoord; 98fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_COLOR_INDEX] = &ctx->Array.ArrayObj->Index; 992421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_EDGEFLAG] = &ctx->Array.ArrayObj->EdgeFlag; 100fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 101fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < 8; i++) 1022421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell exec->array.legacy_array[VERT_ATTRIB_TEX0 + i] = &ctx->Array.ArrayObj->TexCoord[i]; 103fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 104fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < VERT_ATTRIB_MAX; i++) 105fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.generic_array[i] = &ctx->Array.ArrayObj->VertexAttrib[i]; 106fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 107fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.array_obj = ctx->Array.ArrayObj->Name; 108fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 109fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 110fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void recalculate_input_bindings( GLcontext *ctx ) 111fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 11299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 11399efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 114fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const struct gl_client_array **inputs = &exec->array.inputs[0]; 115fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint i; 116fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 117fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.program_mode = get_program_mode(ctx); 118fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.enabled_flags = ctx->Array.ArrayObj->_Enabled; 119fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 120fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell switch (exec->array.program_mode) { 121fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case VP_NONE: 122fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* When no vertex program is active, we put the material values 123fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * into the generic slots. This is the only situation where 124fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * material values are available as per-vertex attributes. 125fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 126fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i <= VERT_ATTRIB_TEX7; i++) { 127fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.legacy_array[i]->Enabled) 128fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.legacy_array[i]; 129fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else 13099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[i] = &vbo->legacy_currval[i]; 131fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 132fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 133fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < MAT_ATTRIB_MAX; i++) { 13499efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[VERT_ATTRIB_GENERIC0 + i] = &vbo->mat_currval[i]; 135fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 1365a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell 1375a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell /* Could use just about anything, just to fill in the empty 1385a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell * slots: 1395a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell */ 1405a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell for (i = MAT_ATTRIB_MAX; i < VERT_ATTRIB_MAX; i++) 1415a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell inputs[i] = &vbo->generic_currval[i - VERT_ATTRIB_GENERIC0]; 1425a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell 143fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell break; 144fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case VP_NV: 145fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* NV_vertex_program - attribute arrays alias and override 146fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * conventional, legacy arrays. No materials, and the generic 147fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * slots are vacant. 148fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 149fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i <= VERT_ATTRIB_TEX7; i++) { 150fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.generic_array[i]->Enabled) 151fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.generic_array[i]; 152fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (exec->array.legacy_array[i]->Enabled) 153fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.legacy_array[i]; 154fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else 15599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[i] = &vbo->legacy_currval[i]; 156fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 157301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell 158301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell /* Could use just about anything, just to fill in the empty 159301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell * slots: 160301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell */ 161301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell for (i = VERT_ATTRIB_GENERIC0; i < VERT_ATTRIB_MAX; i++) 162301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell inputs[i] = &vbo->generic_currval[i - VERT_ATTRIB_GENERIC0]; 163301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell 164fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell break; 165fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case VP_ARB: 166fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* ARB_vertex_program - Only the attribute zero (position) array 167fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * aliases and overrides the legacy position array. 168fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 169fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Otherwise, legacy attributes available in the legacy slots, 170fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * generic attributes in the generic slots and materials are not 171fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * available as per-vertex attributes. 172fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 173fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.generic_array[0]->Enabled) 174fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[0] = exec->array.generic_array[0]; 175fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (exec->array.legacy_array[0]->Enabled) 176fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[0] = exec->array.legacy_array[0]; 177fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else 17899efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[0] = &vbo->legacy_currval[0]; 179fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 180fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 181fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 1; i <= VERT_ATTRIB_TEX7; i++) { 182fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.legacy_array[i]->Enabled) 183fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.legacy_array[i]; 184fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else 18599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[i] = &vbo->legacy_currval[i]; 186fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 187fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 188fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < 16; i++) { 189fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.generic_array[0]->Enabled) 190fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[VERT_ATTRIB_GENERIC0 + i] = exec->array.generic_array[i]; 191fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else 19299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[VERT_ATTRIB_GENERIC0 + i] = &vbo->generic_currval[i]; 193fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 194fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell break; 195fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 196fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 197fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 198fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void bind_arrays( GLcontext *ctx ) 199fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 200fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#if 0 201fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->Array.ArrayObj.Name != exec->array.array_obj) { 202fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell bind_array_obj(ctx); 203fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell recalculate_input_bindings(ctx); 204fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 205fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (exec->array.program_mode != get_program_mode(ctx) || 206fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.enabled_flags != ctx->Array.ArrayObj->_Enabled) { 207fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 208fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell recalculate_input_bindings(ctx); 209fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 210fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#else 211fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell bind_array_obj(ctx); 212fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell recalculate_input_bindings(ctx); 213fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#endif 214fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 215fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 216fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 217fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 218fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/*********************************************************************** 219fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * API functions. 220fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 221fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 222fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void GLAPIENTRY 223fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count) 224fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 225fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GET_CURRENT_CONTEXT(ctx); 226fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 227fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 228fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_prim prim[1]; 229fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 230fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (!_mesa_validate_DrawArrays( ctx, mode, start, count )) 231fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return; 232fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 233fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FLUSH_CURRENT( ctx, 0 ); 234fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 235fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->NewState) 236fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_update_state( ctx ); 237fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 238fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell bind_arrays( ctx ); 239fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 240fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].begin = 1; 241fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].end = 1; 242fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].weak = 0; 243fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].pad = 0; 244fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 245fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.inputs[0]->BufferObj->Name) { 246fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* Use vertex attribute as a hint to tell us if we expect all 247fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * arrays to be in VBO's and if so, don't worry about avoiding 248fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * the upload of elements < start. 249fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 250fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].mode = mode; 251fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].start = start; 252fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].count = count; 253fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].indexed = 0; 254fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 255fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo->draw_prims( ctx, exec->array.inputs, prim, 1, NULL, 0, start + count ); 256fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 257fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else { 258fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* If not using VBO's, we don't want to upload any more elements 259fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * than necessary from the arrays as they will not be valid next 260fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * time the application tries to draw with them. 261fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 262fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].mode = mode; 263fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].start = 0; 264fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].count = count; 265fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].indexed = 0; 266fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 267fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo->draw_prims( ctx, exec->array.inputs, prim, 1, NULL, start, start + count ); 268fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 269fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 270fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 271fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 272fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 273fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void GLAPIENTRY 274fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvbo_exec_DrawRangeElements(GLenum mode, 275fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint start, GLuint end, 276fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLsizei count, GLenum type, const GLvoid *indices) 277fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 278fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GET_CURRENT_CONTEXT(ctx); 279fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 280fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 281fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_index_buffer ib; 282fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_prim prim[1]; 283fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 284fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (!_mesa_validate_DrawRangeElements( ctx, mode, start, end, count, type, indices )) 285fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return; 286fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 287fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FLUSH_CURRENT( ctx, 0 ); 288fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 289fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->NewState) 290fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_update_state( ctx ); 291c3da1501b81a31e92f485ee9fbd99e60cc3a4337Roland Scheidegger 292c3da1501b81a31e92f485ee9fbd99e60cc3a4337Roland Scheidegger bind_arrays( ctx ); 293c3da1501b81a31e92f485ee9fbd99e60cc3a4337Roland Scheidegger 294fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.count = count; 295fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.type = type; 296fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.obj = ctx->Array.ElementArrayBufferObj; 297fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.ptr = indices; 298fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 299fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->Array.ElementArrayBufferObj->Name) { 300fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* Use the fact that indices are in a VBO as a hint that the 301fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * program has put all the arrays in VBO's and we don't have to 302fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * worry about performance implications of start > 0. 303fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 304fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * XXX: consider passing start as min_index to draw_prims instead. 305fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 306fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.rebase = 0; 307fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 308fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else { 309fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.rebase = start; 310fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 311fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 312fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].begin = 1; 313fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].end = 1; 314fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].weak = 0; 315fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].pad = 0; 316fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].mode = mode; 317fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].start = 0; 318fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].count = count; 319fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].indexed = 1; 320fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 321fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo->draw_prims( ctx, exec->array.inputs, prim, 1, &ib, ib.rebase, end+1 ); 322fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 323fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 324fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 325fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void GLAPIENTRY 326fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) 327fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 328fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GET_CURRENT_CONTEXT(ctx); 329fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint max_index; 330fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 331fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices )) 332fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return; 333fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 334fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->Array.ElementArrayBufferObj->Name) { 335fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLvoid *map = ctx->Driver.MapBuffer(ctx, 336fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GL_ELEMENT_ARRAY_BUFFER_ARB, 3372cb3594af9cd1434aa2c408cd6f8d51bcd12e8eaAapo Tahkola GL_READ_ONLY, 338fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->Array.ElementArrayBufferObj); 339fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 340fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell max_index = get_max_index(count, type, ADD_POINTERS(map, indices)); 341fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 342fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->Driver.UnmapBuffer(ctx, 343fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GL_ELEMENT_ARRAY_BUFFER_ARB, 344fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->Array.ElementArrayBufferObj); 345fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 346fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else { 347fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell max_index = get_max_index(count, type, indices); 348fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 349fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 350fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_exec_DrawRangeElements(mode, 0, max_index, count, type, indices); 351fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 352fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 353fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 354fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/*********************************************************************** 355fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Initialization 356fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 357fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 358fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 359fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 360fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 361fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvoid vbo_exec_array_init( struct vbo_exec_context *exec ) 362fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 363fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#if 1 364fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawArrays = vbo_exec_DrawArrays; 365fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawElements = vbo_exec_DrawElements; 366fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawRangeElements = vbo_exec_DrawRangeElements; 367fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#else 368fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawArrays = _mesa_noop_DrawArrays; 369fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawElements = _mesa_noop_DrawElements; 370fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawRangeElements = _mesa_noop_DrawRangeElements; 371fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#endif 372fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 373fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 374fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 375fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvoid vbo_exec_array_destroy( struct vbo_exec_context *exec ) 376fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 377584def75ad8dd13add5b4ed7e364d13202539539Keith Whitwell /* nothing to do */ 378fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 379