vbo_exec_array.c revision e3d47515f9b376b00743137529b4ca35a8436c92
1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/************************************************************************** 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 3fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul * Copyright 2009 VMware, Inc. 5fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * All Rights Reserved. 6fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 7fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * copy of this software and associated documentation files (the 9fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * "Software"), to deal in the Software without restriction, including 10fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 11fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 12fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 13fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * the following conditions: 14fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 15fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * The above copyright notice and this permission notice (including the 16fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 17fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * of the Software. 18fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 19fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 23fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 27fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell **************************************************************************/ 28fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 29c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/glheader.h" 30c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/context.h" 31c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/state.h" 32c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/api_validate.h" 33c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/api_noop.h" 34feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul#include "main/varray.h" 35a3b7db0326337117ccdea526818040d2c24d83b4Brian Paul#include "main/bufferobj.h" 36c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "glapi/dispatch.h" 37fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 38fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h" 39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 400b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paul 413bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul/** 423bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * Compute min and max elements for glDraw[Range]Elements() calls. 43893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell */ 442708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtvoid 452708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtvbo_get_minmax_index(GLcontext *ctx, 462708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt const struct _mesa_prim *prim, 472708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt const struct _mesa_index_buffer *ib, 482708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLuint *min_index, GLuint *max_index) 49fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 5053174afeeb68a79e471185cb463c13ff90af698fJosé Fonseca GLuint i; 512708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLsizei count = prim->count; 522708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt const void *indices; 532708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 54bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(ib->obj)) { 552708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt const GLvoid *map = ctx->Driver.MapBuffer(ctx, 562708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GL_ELEMENT_ARRAY_BUFFER_ARB, 572708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GL_READ_ONLY, 582708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ib->obj); 592708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt indices = ADD_POINTERS(map, ib->ptr); 602708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt } else { 612708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt indices = ib->ptr; 622708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt } 63fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 642708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt switch (ib->type) { 65fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_UNSIGNED_INT: { 66855374a76a6e83cc0ad4af143b74e655e7b77d5eBrian Paul const GLuint *ui_indices = (const GLuint *)indices; 67026e7731e549e0777c010348460fd48b3d75a843Keith Whitwell GLuint max_ui = ui_indices[count-1]; 68893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell GLuint min_ui = ui_indices[0]; 69026e7731e549e0777c010348460fd48b3d75a843Keith Whitwell for (i = 0; i < count; i++) { 70893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell if (ui_indices[i] > max_ui) max_ui = ui_indices[i]; 71893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell if (ui_indices[i] < min_ui) min_ui = ui_indices[i]; 72893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell } 73893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell *min_index = min_ui; 74893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell *max_index = max_ui; 75893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell break; 76fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_UNSIGNED_SHORT: { 78fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLushort *us_indices = (const GLushort *)indices; 79026e7731e549e0777c010348460fd48b3d75a843Keith Whitwell GLuint max_us = us_indices[count-1]; 80893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell GLuint min_us = us_indices[0]; 81026e7731e549e0777c010348460fd48b3d75a843Keith Whitwell for (i = 0; i < count; i++) { 82893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell if (us_indices[i] > max_us) max_us = us_indices[i]; 83893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell if (us_indices[i] < min_us) min_us = us_indices[i]; 84893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell } 85893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell *min_index = min_us; 86893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell *max_index = max_us; 87893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell break; 88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case GL_UNSIGNED_BYTE: { 90fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const GLubyte *ub_indices = (const GLubyte *)indices; 91026e7731e549e0777c010348460fd48b3d75a843Keith Whitwell GLuint max_ub = ub_indices[count-1]; 92893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell GLuint min_ub = ub_indices[0]; 93026e7731e549e0777c010348460fd48b3d75a843Keith Whitwell for (i = 0; i < count; i++) { 94893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell if (ub_indices[i] > max_ub) max_ub = ub_indices[i]; 95893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell if (ub_indices[i] < min_ub) min_ub = ub_indices[i]; 96893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell } 97893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell *min_index = min_ub; 98893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell *max_index = max_ub; 99893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell break; 100fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 101fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell default: 102893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell assert(0); 103893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell break; 104fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 1052708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 106bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(ib->obj)) { 1072708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ctx->Driver.UnmapBuffer(ctx, 1082708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GL_ELEMENT_ARRAY_BUFFER_ARB, 1092708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ib->obj); 1102708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt } 111fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 112fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 113fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 1143bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul/** 11513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul * Check that element 'j' of the array has reasonable data. 11613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul * Map VBO if needed. 11713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul */ 11813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulstatic void 11913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulcheck_array_data(GLcontext *ctx, struct gl_client_array *array, 12013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GLuint attrib, GLuint j) 12113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul{ 12213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul if (array->Enabled) { 12313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul const void *data = array->Ptr; 124bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(array->BufferObj)) { 12513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul if (!array->BufferObj->Pointer) { 12613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul /* need to map now */ 12713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul array->BufferObj->Pointer = ctx->Driver.MapBuffer(ctx, 12813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GL_ARRAY_BUFFER_ARB, 12913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GL_READ_ONLY, 13013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul array->BufferObj); 13113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 13213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul data = ADD_POINTERS(data, array->BufferObj->Pointer); 13313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 13413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul switch (array->Type) { 13513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul case GL_FLOAT: 13613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul { 13713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GLfloat *f = (GLfloat *) ((GLubyte *) data + array->StrideB * j); 13813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GLuint k; 13913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul for (k = 0; k < array->Size; k++) { 14013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul if (IS_INF_OR_NAN(f[k]) || 14113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul f[k] >= 1.0e20 || f[k] <= -1.0e10) { 14213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul _mesa_printf("Bad array data:\n"); 14313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul _mesa_printf(" Element[%u].%u = %f\n", j, k, f[k]); 14413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul _mesa_printf(" Array %u at %p\n", attrib, (void* ) array); 14513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul _mesa_printf(" Type 0x%x, Size %d, Stride %d\n", 14613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul array->Type, array->Size, array->Stride); 14713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul _mesa_printf(" Address/offset %p in Buffer Object %u\n", 14813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul array->Ptr, array->BufferObj->Name); 14913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul f[k] = 1.0; /* XXX replace the bad value! */ 15013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 15113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul //assert(!IS_INF_OR_NAN(f[k])); 15213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 15313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 15413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul break; 15513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul default: 15613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul ; 15713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 15813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 15913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul} 16013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 16113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 16213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul/** 16313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul * Unmap the buffer object referenced by given array, if mapped. 16413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul */ 16513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulstatic void 16613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulunmap_array_buffer(GLcontext *ctx, struct gl_client_array *array) 16713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul{ 16813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul if (array->Enabled && 169bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul _mesa_is_bufferobj(array->BufferObj) && 170bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul _mesa_bufferobj_mapped(array->BufferObj)) { 17113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul ctx->Driver.UnmapBuffer(ctx, 17213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GL_ARRAY_BUFFER_ARB, 17313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul array->BufferObj); 17413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 17513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul} 17613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 17713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 17813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul/** 17913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul * Examine the array's data for NaNs, etc. 18013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul */ 18113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulstatic void 18213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulcheck_draw_elements_data(GLcontext *ctx, GLsizei count, GLenum elemType, 18313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul const void *elements) 18413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul{ 18513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 18613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul const void *elemMap; 18713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GLint i, k; 18813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 189bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) { 19013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul elemMap = ctx->Driver.MapBuffer(ctx, 19113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GL_ELEMENT_ARRAY_BUFFER_ARB, 19213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GL_READ_ONLY, 19313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul ctx->Array.ElementArrayBufferObj); 19413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul elements = ADD_POINTERS(elements, elemMap); 19513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 19613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 19713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul for (i = 0; i < count; i++) { 19813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GLuint j; 19913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 20013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul /* j = element[i] */ 20113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul switch (elemType) { 20213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul case GL_UNSIGNED_BYTE: 20313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul j = ((const GLubyte *) elements)[i]; 20413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul break; 20513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul case GL_UNSIGNED_SHORT: 20613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul j = ((const GLushort *) elements)[i]; 20713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul break; 20813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul case GL_UNSIGNED_INT: 20913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul j = ((const GLuint *) elements)[i]; 21013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul break; 21113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul default: 21213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul assert(0); 21313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 21413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 21513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul /* check element j of each enabled array */ 21613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_array_data(ctx, &arrayObj->Vertex, VERT_ATTRIB_POS, j); 21713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_array_data(ctx, &arrayObj->Normal, VERT_ATTRIB_NORMAL, j); 21813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_array_data(ctx, &arrayObj->Color, VERT_ATTRIB_COLOR0, j); 21913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_array_data(ctx, &arrayObj->SecondaryColor, VERT_ATTRIB_COLOR1, j); 22013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul for (k = 0; k < Elements(arrayObj->TexCoord); k++) { 22113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_array_data(ctx, &arrayObj->TexCoord[k], VERT_ATTRIB_TEX0 + k, j); 22213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 22313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul for (k = 0; k < Elements(arrayObj->VertexAttrib); k++) { 22413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_array_data(ctx, &arrayObj->VertexAttrib[k], VERT_ATTRIB_GENERIC0 + k, j); 22513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 22613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 22713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 228bd4c6a2e503db43e81ef41f77d876308badd93ebBrian Paul if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) { 22913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul ctx->Driver.UnmapBuffer(ctx, 23013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul GL_ELEMENT_ARRAY_BUFFER_ARB, 23113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul ctx->Array.ElementArrayBufferObj); 23213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 23313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 23413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul unmap_array_buffer(ctx, &arrayObj->Vertex); 23513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul unmap_array_buffer(ctx, &arrayObj->Normal); 23613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul unmap_array_buffer(ctx, &arrayObj->Color); 23713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul for (k = 0; k < Elements(arrayObj->TexCoord); k++) { 23813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul unmap_array_buffer(ctx, &arrayObj->TexCoord[k]); 23913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 24013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul for (k = 0; k < Elements(arrayObj->VertexAttrib); k++) { 24113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul unmap_array_buffer(ctx, &arrayObj->VertexAttrib[k]); 24213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul } 24313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul} 24413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 24513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 24613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul/** 24713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul * Check array data, looking for NaNs, etc. 24813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul */ 24913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulstatic void 25013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paulcheck_draw_arrays_data(GLcontext *ctx, GLint start, GLsizei count) 25113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul{ 25213f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul /* TO DO */ 25313f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul} 25413f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 25513f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 25613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul/** 257aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul * Print info/data for glDrawArrays(). 258aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul */ 259aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paulstatic void 260aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paulprint_draw_arrays(GLcontext *ctx, struct vbo_exec_context *exec, 261aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul GLenum mode, GLint start, GLsizei count) 262aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul{ 263aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul int i; 264aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul 265aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul _mesa_printf("vbo_exec_DrawArrays(mode 0x%x, start %d, count %d):\n", 266aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul mode, start, count); 267aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul 268aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul for (i = 0; i < 32; i++) { 269aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul GLuint bufName = exec->array.inputs[i]->BufferObj->Name; 270aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul GLint stride = exec->array.inputs[i]->Stride; 271aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul _mesa_printf("attr %2d: size %d stride %d enabled %d " 272aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul "ptr %p Bufobj %u\n", 273aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul i, 274aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul exec->array.inputs[i]->Size, 275aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul stride, 276aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul /*exec->array.inputs[i]->Enabled,*/ 277aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul exec->array.legacy_array[i]->Enabled, 278aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul exec->array.inputs[i]->Ptr, 279aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul bufName); 280aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul 281aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul if (bufName) { 282aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul struct gl_buffer_object *buf = _mesa_lookup_bufferobj(ctx, bufName); 283aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul GLubyte *p = ctx->Driver.MapBuffer(ctx, GL_ARRAY_BUFFER_ARB, 284aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul GL_READ_ONLY_ARB, buf); 285aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul int offset = (int) (GLintptr) exec->array.inputs[i]->Ptr; 286aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul float *f = (float *) (p + offset); 287aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul int *k = (int *) f; 288aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul int i; 289aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul int n = (count * stride) / 4; 290aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul if (n > 32) 291aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul n = 32; 292aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul _mesa_printf(" Data at offset %d:\n", offset); 293aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul for (i = 0; i < n; i++) { 294aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul _mesa_printf(" float[%d] = 0x%08x %f\n", i, k[i], f[i]); 295aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul } 296aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul ctx->Driver.UnmapBuffer(ctx, GL_ARRAY_BUFFER_ARB, buf); 297aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul } 298aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul } 299aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul} 300aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul 301aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul 302aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul/** 3033bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * Just translate the arrayobj into a sane layout. 304fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 3050b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulstatic void 3060b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulbind_array_obj(GLcontext *ctx) 307fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 3085a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 3095a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 3102e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul struct gl_array_object *arrayObj = ctx->Array.ArrayObj; 311fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint i; 312fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 313fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* TODO: Fix the ArrayObj struct to keep legacy arrays in an array 314fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * rather than as individual named arrays. Then this function can 315fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * go away. 316fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 3172e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_POS] = &arrayObj->Vertex; 3188fa0cb2b422abaeee1b69f82ca7e9f02dc8393b9Brian Paul exec->array.legacy_array[VERT_ATTRIB_WEIGHT] = &arrayObj->Weight; 3192e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_NORMAL] = &arrayObj->Normal; 3202e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_COLOR0] = &arrayObj->Color; 3212e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_COLOR1] = &arrayObj->SecondaryColor; 3222e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_FOG] = &arrayObj->FogCoord; 3232e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_COLOR_INDEX] = &arrayObj->Index; 3242e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul if (arrayObj->PointSize.Enabled) { 325d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul /* this aliases COLOR_INDEX */ 3262e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_POINT_SIZE] = &arrayObj->PointSize; 327d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul } 3282e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_EDGEFLAG] = &arrayObj->EdgeFlag; 329fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3308e3f6c0f96eb22198ec436990acc85d44aca7d8eBrian Paul for (i = 0; i < Elements(arrayObj->TexCoord); i++) 3312e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.legacy_array[VERT_ATTRIB_TEX0 + i] = &arrayObj->TexCoord[i]; 332fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3338e3f6c0f96eb22198ec436990acc85d44aca7d8eBrian Paul for (i = 0; i < Elements(arrayObj->VertexAttrib); i++) { 3348da09e6924ca22ba7951d5a7673dfab2a711a997Brian Paul assert(i < Elements(exec->array.generic_array)); 3352e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.generic_array[i] = &arrayObj->VertexAttrib[i]; 3368da09e6924ca22ba7951d5a7673dfab2a711a997Brian Paul } 337fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3382e798e4b7e5956dbf3c7fde18f408b5d4c1b151cBrian Paul exec->array.array_obj = arrayObj->Name; 339fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 340fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 3413bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul 3420b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulstatic void 3430b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulrecalculate_input_bindings(GLcontext *ctx) 344fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 34599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 34699efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 347fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell const struct gl_client_array **inputs = &exec->array.inputs[0]; 348239617fbe22d4dd7b2794510a6665f09602b5adfBrian Paul GLbitfield const_inputs = 0x0; 349fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GLuint i; 350fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 351fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.program_mode = get_program_mode(ctx); 352fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.enabled_flags = ctx->Array.ArrayObj->_Enabled; 353fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 354fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell switch (exec->array.program_mode) { 355fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case VP_NONE: 3563bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul /* When no vertex program is active (or the vertex program is generated 3573bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * from fixed-function state). We put the material values into the 3583bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * generic slots. This is the only situation where material values 3593bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * are available as per-vertex attributes. 360fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 361fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i <= VERT_ATTRIB_TEX7; i++) { 362fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.legacy_array[i]->Enabled) 363fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.legacy_array[i]; 3641680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell else { 36599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[i] = &vbo->legacy_currval[i]; 3661680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << i; 3671680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 368fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 369fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 370fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i < MAT_ATTRIB_MAX; i++) { 37199efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[VERT_ATTRIB_GENERIC0 + i] = &vbo->mat_currval[i]; 3721680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << (VERT_ATTRIB_GENERIC0 + i); 373fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 3745a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell 3755a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell /* Could use just about anything, just to fill in the empty 3765a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell * slots: 3775a652f595716a82ebd79e33011f6082199c4b0d0Keith Whitwell */ 3781680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell for (i = MAT_ATTRIB_MAX; i < VERT_ATTRIB_MAX - VERT_ATTRIB_GENERIC0; i++) { 379fcccf8943213a20957f305161e8aae7fef55baabZou Nan hai inputs[VERT_ATTRIB_GENERIC0 + i] = &vbo->generic_currval[i]; 3801680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << (VERT_ATTRIB_GENERIC0 + i); 3811680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 382fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell break; 3833bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul 384fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case VP_NV: 385fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* NV_vertex_program - attribute arrays alias and override 386fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * conventional, legacy arrays. No materials, and the generic 387fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * slots are vacant. 388fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 389fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 0; i <= VERT_ATTRIB_TEX7; i++) { 390fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.generic_array[i]->Enabled) 391fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.generic_array[i]; 392fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (exec->array.legacy_array[i]->Enabled) 393fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.legacy_array[i]; 3941680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell else { 39599efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[i] = &vbo->legacy_currval[i]; 3961680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << i; 3971680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 398fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 399301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell 400301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell /* Could use just about anything, just to fill in the empty 401301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell * slots: 402301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell */ 4031680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell for (i = VERT_ATTRIB_GENERIC0; i < VERT_ATTRIB_MAX; i++) { 404301acdf34ad01315f41c14638d92aa7fe0c2d2dcKeith Whitwell inputs[i] = &vbo->generic_currval[i - VERT_ATTRIB_GENERIC0]; 4051680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << i; 4061680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 407fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell break; 4083bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul 409fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell case VP_ARB: 4103bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul /* GL_ARB_vertex_program or GLSL vertex shader - Only the generic[0] 4113bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * attribute array aliases and overrides the legacy position array. 412fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 413fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Otherwise, legacy attributes available in the legacy slots, 414fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * generic attributes in the generic slots and materials are not 415fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * available as per-vertex attributes. 416fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 417fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.generic_array[0]->Enabled) 418fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[0] = exec->array.generic_array[0]; 419fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (exec->array.legacy_array[0]->Enabled) 420fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[0] = exec->array.legacy_array[0]; 4211680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell else { 42299efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[0] = &vbo->legacy_currval[0]; 4231680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << 0; 4241680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 425fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 426fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell for (i = 1; i <= VERT_ATTRIB_TEX7; i++) { 427fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (exec->array.legacy_array[i]->Enabled) 428fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[i] = exec->array.legacy_array[i]; 4291680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell else { 43099efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[i] = &vbo->legacy_currval[i]; 4311680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << i; 4321680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 433fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 434fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 4354a95185c9f30c2de7a03bb1a0653f51b53b1111dBrian Paul for (i = 0; i < MAX_VERTEX_GENERIC_ATTRIBS; i++) { 4367d8ed0f5f5960a492734cb415b8a85ef4ad79846Roland Scheidegger if (exec->array.generic_array[i]->Enabled) 437fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell inputs[VERT_ATTRIB_GENERIC0 + i] = exec->array.generic_array[i]; 4381680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell else { 43999efde461d3b8615863bdb7308e05289e0db0422Keith Whitwell inputs[VERT_ATTRIB_GENERIC0 + i] = &vbo->generic_currval[i]; 4401680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell const_inputs |= 1 << (VERT_ATTRIB_GENERIC0 + i); 4411680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell } 4421680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 443fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 444fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell break; 445fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 4461680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 4471680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell _mesa_set_varying_vp_inputs( ctx, ~const_inputs ); 448fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 449fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 4503bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul 4510b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulstatic void 4520b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulbind_arrays(GLcontext *ctx) 453fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 454fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#if 0 455fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->Array.ArrayObj.Name != exec->array.array_obj) { 456fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell bind_array_obj(ctx); 457fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell recalculate_input_bindings(ctx); 458fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 459fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell else if (exec->array.program_mode != get_program_mode(ctx) || 460fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->array.enabled_flags != ctx->Array.ArrayObj->_Enabled) { 461fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 462fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell recalculate_input_bindings(ctx); 463fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 464fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#else 465fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell bind_array_obj(ctx); 466fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell recalculate_input_bindings(ctx); 467fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#endif 468fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 469fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 470fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 471fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 472fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/*********************************************************************** 473fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * API functions. 474fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 475fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 476fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void GLAPIENTRY 477fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvbo_exec_DrawArrays(GLenum mode, GLint start, GLsizei count) 478fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 479fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GET_CURRENT_CONTEXT(ctx); 480fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 481fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 482fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_prim prim[1]; 483fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 484fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (!_mesa_validate_DrawArrays( ctx, mode, start, count )) 485fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return; 486fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 487fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FLUSH_CURRENT( ctx, 0 ); 488fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 489fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->NewState) 490fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_update_state( ctx ); 491fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 492e3d47515f9b376b00743137529b4ca35a8436c92Brian Paul if (!_mesa_valid_to_render(ctx, "glDrawArrays")) { 493d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul return; 494d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul } 495d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul 49613f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul#if 0 49713f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul check_draw_arrays_data(ctx, start, count); 49813f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul#else 49913f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul (void) check_draw_arrays_data; 50013f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul#endif 50113f6d07521119afc4b6d9e6daa94d5091f4b9c65Brian Paul 502fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell bind_arrays( ctx ); 503fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 5043bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul /* Again... because we may have changed the bitmask of per-vertex varying 5053bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * attributes. If we regenerate the fixed-function vertex program now 5063bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * we may be able to prune down the number of vertex attributes which we 5073bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul * need in the shader. 5081680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell */ 5091680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell if (ctx->NewState) 5101680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell _mesa_update_state( ctx ); 5111680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 512fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].begin = 1; 513fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].end = 1; 514fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].weak = 0; 515fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].pad = 0; 516893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell prim[0].mode = mode; 517893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell prim[0].start = start; 518893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell prim[0].count = count; 519893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell prim[0].indexed = 0; 520fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 5213bfe312d0136c95b2a8518d65fa32c89ed474987Brian Paul vbo->draw_prims( ctx, exec->array.inputs, prim, 1, NULL, 5222708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GL_TRUE, start, start + count - 1 ); 523a3b7db0326337117ccdea526818040d2c24d83b4Brian Paul 524a3b7db0326337117ccdea526818040d2c24d83b4Brian Paul#if 0 525aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul print_draw_arrays(ctx, exec, mode, start, count); 526aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul#else 527aa18e54ac9a70883a98f803c097d45f8ee84e717Brian Paul (void) print_draw_arrays; 528a3b7db0326337117ccdea526818040d2c24d83b4Brian Paul#endif 529fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 530fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 531fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 532c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul/** 533c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul * Map GL_ELEMENT_ARRAY_BUFFER and print contents. 534c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul */ 535c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paulstatic void 536c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Pauldump_element_buffer(GLcontext *ctx, GLenum type) 537c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul{ 538c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul const GLvoid *map = ctx->Driver.MapBuffer(ctx, 539c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul GL_ELEMENT_ARRAY_BUFFER_ARB, 540c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul GL_READ_ONLY, 541c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul ctx->Array.ElementArrayBufferObj); 542c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul switch (type) { 543c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul case GL_UNSIGNED_BYTE: 544c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul { 545c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul const GLubyte *us = (const GLubyte *) map; 546c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul GLuint i; 547c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul for (i = 0; i < ctx->Array.ElementArrayBufferObj->Size; i++) { 548c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("%02x ", us[i]); 549c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul if (i % 32 == 31) 550c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("\n"); 551c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 552c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("\n"); 553c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 554c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul break; 555c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul case GL_UNSIGNED_SHORT: 556c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul { 557c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul const GLushort *us = (const GLushort *) map; 558c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul GLuint i; 559c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul for (i = 0; i < ctx->Array.ElementArrayBufferObj->Size / 2; i++) { 560c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("%04x ", us[i]); 561c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul if (i % 16 == 15) 562c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("\n"); 563c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 564c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("\n"); 565c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 566c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul break; 567c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul case GL_UNSIGNED_INT: 568c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul { 569c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul const GLuint *us = (const GLuint *) map; 570c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul GLuint i; 571c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul for (i = 0; i < ctx->Array.ElementArrayBufferObj->Size / 4; i++) { 572c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("%08x ", us[i]); 573c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul if (i % 8 == 7) 574c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("\n"); 575c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 576c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul _mesa_printf("\n"); 577c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 578c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul break; 579c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul default: 580c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul ; 581c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul } 582c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul 583c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul ctx->Driver.UnmapBuffer(ctx, 584c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul GL_ELEMENT_ARRAY_BUFFER_ARB, 585c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul ctx->Array.ElementArrayBufferObj); 586c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul} 587c55f1a6c9917a87cc6b29808b4132b83cf516e05Brian Paul 5882708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt/* Inner support for both _mesa_DrawElements and _mesa_DrawRangeElements */ 5892708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtstatic void 5902708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtvbo_validated_drawrangeelements(GLcontext *ctx, GLenum mode, 5912708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLboolean index_bounds_valid, 5922708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLuint start, GLuint end, 5932708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLsizei count, GLenum type, 5942708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt const GLvoid *indices) 595fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 596fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_context *vbo = vbo_context(ctx); 597fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_exec_context *exec = &vbo->exec; 598fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_index_buffer ib; 599fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct _mesa_prim prim[1]; 600fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 601fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell FLUSH_CURRENT( ctx, 0 ); 602fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 603fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->NewState) 604fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _mesa_update_state( ctx ); 605c3da1501b81a31e92f485ee9fbd99e60cc3a4337Roland Scheidegger 606e3d47515f9b376b00743137529b4ca35a8436c92Brian Paul if (!_mesa_valid_to_render(ctx, "glDraw[Range]Elements")) { 607d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul return; 608d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul } 609d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul 6101680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell if (ctx->NewState) 6111680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell _mesa_update_state( ctx ); 6121680ef869625dc1fe9cf481b180382a34e0738e7Keith Whitwell 6132708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt bind_arrays( ctx ); 6142708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 615fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.count = count; 6162708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ib.type = type; 617fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.obj = ctx->Array.ElementArrayBufferObj; 618fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ib.ptr = indices; 619fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 620fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].begin = 1; 621fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].end = 1; 622fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].weak = 0; 623fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].pad = 0; 624fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].mode = mode; 625fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].start = 0; 626fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].count = count; 627fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell prim[0].indexed = 1; 628fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 629893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell /* Need to give special consideration to rendering a range of 630893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * indices starting somewhere above zero. Typically the 631893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * application is issuing multiple DrawRangeElements() to draw 632893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * successive primitives layed out linearly in the vertex arrays. 633893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * Unless the vertex arrays are all in a VBO (or locked as with 634893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * CVA), the OpenGL semantics imply that we need to re-read or 635893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * re-upload the vertex data on each draw call. 636893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 637893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * In the case of hardware tnl, we want to avoid starting the 638893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * upload at zero, as it will mean every draw call uploads an 639893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * increasing amount of not-used vertex data. Worse - in the 640893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * software tnl module, all those vertices might be transformed and 641893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * lit but never rendered. 642893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 643893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * If we just upload or transform the vertices in start..end, 644893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * however, the indices will be incorrect. 645893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 646893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * At this level, we don't know exactly what the requirements of 647893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * the backend are going to be, though it will likely boil down to 648893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * either: 649893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 650893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 1) Do nothing, everything is in a VBO and is processed once 651893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * only. 652893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 653893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 2) Adjust the indices and vertex arrays so that start becomes 654893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * zero. 655893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * 656893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * Rather than doing anything here, I'll provide a helper function 657893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell * for the latter case elsewhere. 658893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell */ 659fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 6602708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt vbo->draw_prims( ctx, exec->array.inputs, prim, 1, &ib, 6612708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt index_bounds_valid, start, end ); 662893526b8a823fe1b88f2b46376155afb91c84016Keith Whitwell} 663fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 664fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void GLAPIENTRY 6652708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtvbo_exec_DrawRangeElements(GLenum mode, 6662708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLuint start, GLuint end, 6672708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GLsizei count, GLenum type, const GLvoid *indices) 668fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 669fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell GET_CURRENT_CONTEXT(ctx); 670fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 6712708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt if (!_mesa_validate_DrawRangeElements( ctx, mode, start, end, count, 6722708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt type, indices )) 673fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return; 674fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 6752708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt if (end >= ctx->Array.ArrayObj->_MaxElement) { 6762708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt /* the max element is out of bounds of one or more enabled arrays */ 6772708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt _mesa_warning(ctx, "glDraw[Range]Elements(start %u, end %u, count %d, " 6782708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt "type 0x%x, indices=%p)\n" 6792708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt "\tindex=%u is out of bounds (max=%u) " 6802708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt "Element Buffer %u (size %d)", 6812708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt start, end, count, type, indices, end, 6822708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ctx->Array.ArrayObj->_MaxElement - 1, 6832708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ctx->Array.ElementArrayBufferObj->Name, 6842708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ctx->Array.ElementArrayBufferObj->Size); 6852708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 6862708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt if (0) 6872708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt dump_element_buffer(ctx, type); 6882708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 6892708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt if (0) 6902708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt _mesa_print_arrays(ctx); 691d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul return; 692d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul } 6932708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt else if (0) { 6942708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt _mesa_printf("glDraw[Range]Elements" 6952708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt "(start %u, end %u, type 0x%x, count %d) ElemBuf %u\n", 6962708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt start, end, type, count, 6972708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt ctx->Array.ElementArrayBufferObj->Name); 6982708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt } 699d758479b9fbff803bdac15f3f39d32ef9064db71Brian Paul 7002708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt#if 0 7012708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt check_draw_elements_data(ctx, count, type, indices); 7022708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt#else 7032708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt (void) check_draw_elements_data; 7042708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt#endif 7052708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 7062708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt vbo_validated_drawrangeelements(ctx, mode, GL_TRUE, start, end, 7072708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt count, type, indices); 7082708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt} 709fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 710fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 7112708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtstatic void GLAPIENTRY 7122708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholtvbo_exec_DrawElements(GLenum mode, GLsizei count, GLenum type, 7132708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt const GLvoid *indices) 7142708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt{ 7152708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt GET_CURRENT_CONTEXT(ctx); 7162708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt 7172708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt if (!_mesa_validate_DrawElements( ctx, mode, count, type, indices )) 7182708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt return; 719fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 7202708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt vbo_validated_drawrangeelements(ctx, mode, GL_FALSE, ~0, ~0, 7212708ddfb06a36d8568e2aa130bf1f7d551fcd309Eric Anholt count, type, indices); 722fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 723fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 724fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 725fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/*********************************************************************** 726fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Initialization 727fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 728fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 7290b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulvoid 7300b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulvbo_exec_array_init( struct vbo_exec_context *exec ) 731fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 732fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#if 1 733fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawArrays = vbo_exec_DrawArrays; 734fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawElements = vbo_exec_DrawElements; 735fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawRangeElements = vbo_exec_DrawRangeElements; 736fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#else 737fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawArrays = _mesa_noop_DrawArrays; 738fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawElements = _mesa_noop_DrawElements; 739fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->vtxfmt.DrawRangeElements = _mesa_noop_DrawRangeElements; 740fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#endif 741fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 742fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 743fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 7440b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulvoid 7450b6a0b367fdb575048b69d80ad4202d164a61f1eBrian Paulvbo_exec_array_destroy( struct vbo_exec_context *exec ) 746fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 747584def75ad8dd13add5b4ed7e364d13202539539Keith Whitwell /* nothing to do */ 748fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 749feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul 750feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul 751feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul/* This API entrypoint is not ordinarily used */ 752feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paulvoid GLAPIENTRY 753feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul_mesa_DrawArrays(GLenum mode, GLint first, GLsizei count) 754feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul{ 755feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul vbo_exec_DrawArrays(mode, first, count); 756feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul} 757feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul 758feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul 759feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul/* This API entrypoint is not ordinarily used */ 760feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paulvoid GLAPIENTRY 761feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul_mesa_DrawElements(GLenum mode, GLsizei count, GLenum type, 762feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul const GLvoid *indices) 763feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul{ 764feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul vbo_exec_DrawElements(mode, count, type, indices); 765feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul} 766feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul 767feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul 768feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul/* This API entrypoint is not ordinarily used */ 769feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paulvoid GLAPIENTRY 770feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul_mesa_DrawRangeElements(GLenum mode, GLuint start, GLuint end, GLsizei count, 771feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul GLenum type, const GLvoid *indices) 772feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul{ 773feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul vbo_exec_DrawRangeElements(mode, start, end, count, type, indices); 774feb722fa98f04a4487b7ec4746bcc8c7296899c8Brian Paul} 775