api_validate.c revision 37f2117cd132527ebf89f9294b2f35db87326460
1cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell/* 2cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Mesa 3-D graphics library 3a3c3bc9ece7e7c55c8832dbc8c50ab1c34f5bfe9Brian * Version: 7.1 4cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 537ece4df7c654b30b6720044b35a83694d7e5bb3Brian * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 6cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 7cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * copy of this software and associated documentation files (the "Software"), 9cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * to deal in the Software without restriction, including without limitation 10cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * Software is furnished to do so, subject to the following conditions: 13cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 14cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * The above copyright notice and this permission notice shall be included 15cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * in all copies or substantial portions of the Software. 16cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * 17cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell */ 24cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 25cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "glheader.h" 268446d1bab15ef82b35b8980a0a56072ace6feb04Brian Paul#include "api_validate.h" 27cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "context.h" 283c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 29cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "mtypes.h" 308446d1bab15ef82b35b8980a0a56072ace6feb04Brian Paul#include "state.h" 31cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3258e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell 33d8c6719f95b1543296ac954f95d13b048ae48634Brian/** 34d8c6719f95b1543296ac954f95d13b048ae48634Brian * Find the max index in the given element/index buffer 35d8c6719f95b1543296ac954f95d13b048ae48634Brian */ 36d8c6719f95b1543296ac954f95d13b048ae48634Brianstatic GLuint 37d8c6719f95b1543296ac954f95d13b048ae48634Brianmax_buffer_index(GLcontext *ctx, GLuint count, GLenum type, 38d8c6719f95b1543296ac954f95d13b048ae48634Brian const void *indices, 39d8c6719f95b1543296ac954f95d13b048ae48634Brian struct gl_buffer_object *elementBuf) 40d8c6719f95b1543296ac954f95d13b048ae48634Brian{ 41d8c6719f95b1543296ac954f95d13b048ae48634Brian const GLubyte *map = NULL; 42d8c6719f95b1543296ac954f95d13b048ae48634Brian GLuint max = 0; 4337f2117cd132527ebf89f9294b2f35db87326460José Fonseca GLuint i; 44d8c6719f95b1543296ac954f95d13b048ae48634Brian 45d8c6719f95b1543296ac954f95d13b048ae48634Brian if (elementBuf->Name) { 46d8c6719f95b1543296ac954f95d13b048ae48634Brian /* elements are in a user-defined buffer object. need to map it */ 47d8c6719f95b1543296ac954f95d13b048ae48634Brian map = ctx->Driver.MapBuffer(ctx, 48d8c6719f95b1543296ac954f95d13b048ae48634Brian GL_ELEMENT_ARRAY_BUFFER_ARB, 49d8c6719f95b1543296ac954f95d13b048ae48634Brian GL_READ_ONLY, 50d8c6719f95b1543296ac954f95d13b048ae48634Brian elementBuf); 51d8c6719f95b1543296ac954f95d13b048ae48634Brian /* Actual address is the sum of pointers */ 52d8c6719f95b1543296ac954f95d13b048ae48634Brian indices = (const GLvoid *) ADD_POINTERS(map, (const GLubyte *) indices); 53d8c6719f95b1543296ac954f95d13b048ae48634Brian } 54d8c6719f95b1543296ac954f95d13b048ae48634Brian 55d8c6719f95b1543296ac954f95d13b048ae48634Brian if (type == GL_UNSIGNED_INT) { 56d8c6719f95b1543296ac954f95d13b048ae48634Brian for (i = 0; i < count; i++) 57d8c6719f95b1543296ac954f95d13b048ae48634Brian if (((GLuint *) indices)[i] > max) 58d8c6719f95b1543296ac954f95d13b048ae48634Brian max = ((GLuint *) indices)[i]; 59d8c6719f95b1543296ac954f95d13b048ae48634Brian } 60d8c6719f95b1543296ac954f95d13b048ae48634Brian else if (type == GL_UNSIGNED_SHORT) { 61d8c6719f95b1543296ac954f95d13b048ae48634Brian for (i = 0; i < count; i++) 62d8c6719f95b1543296ac954f95d13b048ae48634Brian if (((GLushort *) indices)[i] > max) 63d8c6719f95b1543296ac954f95d13b048ae48634Brian max = ((GLushort *) indices)[i]; 64d8c6719f95b1543296ac954f95d13b048ae48634Brian } 65d8c6719f95b1543296ac954f95d13b048ae48634Brian else { 66d8c6719f95b1543296ac954f95d13b048ae48634Brian ASSERT(type == GL_UNSIGNED_BYTE); 67d8c6719f95b1543296ac954f95d13b048ae48634Brian for (i = 0; i < count; i++) 68d8c6719f95b1543296ac954f95d13b048ae48634Brian if (((GLubyte *) indices)[i] > max) 69d8c6719f95b1543296ac954f95d13b048ae48634Brian max = ((GLubyte *) indices)[i]; 70d8c6719f95b1543296ac954f95d13b048ae48634Brian } 71d8c6719f95b1543296ac954f95d13b048ae48634Brian 72d8c6719f95b1543296ac954f95d13b048ae48634Brian if (map) { 73d8c6719f95b1543296ac954f95d13b048ae48634Brian ctx->Driver.UnmapBuffer(ctx, 74d8c6719f95b1543296ac954f95d13b048ae48634Brian GL_ELEMENT_ARRAY_BUFFER_ARB, 75d8c6719f95b1543296ac954f95d13b048ae48634Brian ctx->Array.ElementArrayBufferObj); 76d8c6719f95b1543296ac954f95d13b048ae48634Brian } 77d8c6719f95b1543296ac954f95d13b048ae48634Brian 78d8c6719f95b1543296ac954f95d13b048ae48634Brian return max; 79d8c6719f95b1543296ac954f95d13b048ae48634Brian} 80d8c6719f95b1543296ac954f95d13b048ae48634Brian 81263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihanestatic GLboolean 82263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihanecheck_valid_to_render(GLcontext *ctx, char *function) 83263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane{ 84263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 85263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 86263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane "glDraw%s(incomplete framebuffer)", function); 87263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane return GL_FALSE; 88263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane } 89263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane 9097dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul#if FEATURE_es2_glsl 9197dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul /* For ES2, we can draw if any vertex array is enabled (and we should 9297dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul * always have a vertex program/shader). 9397dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul */ 9497dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul if (ctx->Array.ArrayObj->_Enabled == 0x0 || !ctx->VertexProgram._Current) 9597dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul return GL_FALSE; 9697dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul#else 9797dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul /* For regular OpenGL, only draw if we have vertex positions (regardless 9897dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul * of whether or not we have a vertex program/shader). 9997dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul */ 10097dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul if (!ctx->Array.ArrayObj->Vertex.Enabled && 101263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane !ctx->Array.ArrayObj->VertexAttrib[0].Enabled) 102263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane return GL_FALSE; 10397dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul#endif 104263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane 105263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane return GL_TRUE; 106263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane} 107d8c6719f95b1543296ac954f95d13b048ae48634Brian 108cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith WhitwellGLboolean 109cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell_mesa_validate_DrawElements(GLcontext *ctx, 11022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLenum mode, GLsizei count, GLenum type, 111cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvoid *indices) 112cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 11322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 114cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 115cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count <= 0) { 116cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count < 0) 11708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glDrawElements(count)" ); 118cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 119cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 120cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 121464bc3b6747108dd32e4a9fcfe6549a9d4a52a95Brian Paul if (mode > GL_POLYGON) { 122a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(mode)" ); 123cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 124cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 125cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 12622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (type != GL_UNSIGNED_INT && 12722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes type != GL_UNSIGNED_BYTE && 128cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell type != GL_UNSIGNED_SHORT) 129cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell { 13008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)" ); 131cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 132cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 133cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 134cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->NewState) 135a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_update_state(ctx); 136a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 137263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane if (!check_valid_to_render(ctx, "Elements")) 138a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul return GL_FALSE; 139a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 14003e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul /* Vertex buffer object tests */ 14103e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul if (ctx->Array.ElementArrayBufferObj->Name) { 14203e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul /* use indices in the buffer object */ 143d8c6719f95b1543296ac954f95d13b048ae48634Brian GLuint indexBytes; 14403e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul 145730df7662f57a46dee892733afc9a55f37d2ab03Brian if (!ctx->Array.ElementArrayBufferObj->Size) { 146730df7662f57a46dee892733afc9a55f37d2ab03Brian _mesa_warning(ctx, 147730df7662f57a46dee892733afc9a55f37d2ab03Brian "glDrawElements called with empty array elements buffer"); 14803e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul return GL_FALSE; 14903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 15003e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul 15103e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul if (type == GL_UNSIGNED_INT) { 15203e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul indexBytes = count * sizeof(GLuint); 15303e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 15403e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul else if (type == GL_UNSIGNED_BYTE) { 15503e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul indexBytes = count * sizeof(GLubyte); 15603e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 15703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul else { 15803e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul ASSERT(type == GL_UNSIGNED_SHORT); 15903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul indexBytes = count * sizeof(GLushort); 16003e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 16103e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul 162d8c6719f95b1543296ac954f95d13b048ae48634Brian /* make sure count doesn't go outside buffer bounds */ 16353174afeeb68a79e471185cb463c13ff90af698fJosé Fonseca if (indexBytes > (GLuint) ctx->Array.ElementArrayBufferObj->Size) { 16403e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul _mesa_warning(ctx, "glDrawElements index out of buffer bounds"); 16503e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul return GL_FALSE; 16603e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 16703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 16837ece4df7c654b30b6720044b35a83694d7e5bb3Brian else { 16937ece4df7c654b30b6720044b35a83694d7e5bb3Brian /* not using a VBO */ 17037ece4df7c654b30b6720044b35a83694d7e5bb3Brian if (!indices) 17137ece4df7c654b30b6720044b35a83694d7e5bb3Brian return GL_FALSE; 17237ece4df7c654b30b6720044b35a83694d7e5bb3Brian } 17303e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul 174a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul if (ctx->Const.CheckArrayBounds) { 175a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul /* find max array index */ 176d8c6719f95b1543296ac954f95d13b048ae48634Brian GLuint max = max_buffer_index(ctx, count, type, indices, 177d8c6719f95b1543296ac954f95d13b048ae48634Brian ctx->Array.ElementArrayBufferObj); 178a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul if (max >= ctx->Array._MaxElement) { 179a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul /* the max element is out of bounds of one or more enabled arrays */ 180a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul return GL_FALSE; 181a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul } 182a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul } 183cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 184cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_TRUE; 185cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 186cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 187cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith WhitwellGLboolean 18822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes_mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode, 18922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLuint start, GLuint end, 19022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLsizei count, GLenum type, 191cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell const GLvoid *indices) 192cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 19322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 194cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 195cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count <= 0) { 196cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count < 0) 197a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(count)" ); 198cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 199cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 200cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 201464bc3b6747108dd32e4a9fcfe6549a9d4a52a95Brian Paul if (mode > GL_POLYGON) { 202a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(mode)" ); 203cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 204cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 205cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 206cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (end < start) { 20708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(end<start)"); 208cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 210cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 21122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (type != GL_UNSIGNED_INT && 21222144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes type != GL_UNSIGNED_BYTE && 21361bac6014aa15e0bec134e290aebac18f9815299Brian Paul type != GL_UNSIGNED_SHORT) { 214a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(type)" ); 215cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 216cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 217cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 218cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->NewState) 219a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_update_state(ctx); 220a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 221263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane if (!check_valid_to_render(ctx, "RangeElements")) 222a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul return GL_FALSE; 223a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 22437ece4df7c654b30b6720044b35a83694d7e5bb3Brian /* Vertex buffer object tests */ 22537ece4df7c654b30b6720044b35a83694d7e5bb3Brian if (ctx->Array.ElementArrayBufferObj->Name) { 226d8c6719f95b1543296ac954f95d13b048ae48634Brian /* use indices in the buffer object */ 22737f2117cd132527ebf89f9294b2f35db87326460José Fonseca GLsizei indexBytes; 228d8c6719f95b1543296ac954f95d13b048ae48634Brian 229d8c6719f95b1543296ac954f95d13b048ae48634Brian if (type == GL_UNSIGNED_INT) { 230d8c6719f95b1543296ac954f95d13b048ae48634Brian indexBytes = count * sizeof(GLuint); 231d8c6719f95b1543296ac954f95d13b048ae48634Brian } 232d8c6719f95b1543296ac954f95d13b048ae48634Brian else if (type == GL_UNSIGNED_BYTE) { 233d8c6719f95b1543296ac954f95d13b048ae48634Brian indexBytes = count * sizeof(GLubyte); 234d8c6719f95b1543296ac954f95d13b048ae48634Brian } 235d8c6719f95b1543296ac954f95d13b048ae48634Brian else { 236d8c6719f95b1543296ac954f95d13b048ae48634Brian ASSERT(type == GL_UNSIGNED_SHORT); 237d8c6719f95b1543296ac954f95d13b048ae48634Brian indexBytes = count * sizeof(GLushort); 238d8c6719f95b1543296ac954f95d13b048ae48634Brian } 239d8c6719f95b1543296ac954f95d13b048ae48634Brian 240d8c6719f95b1543296ac954f95d13b048ae48634Brian /* make sure count doesn't go outside buffer bounds */ 241d8c6719f95b1543296ac954f95d13b048ae48634Brian if (indexBytes > ctx->Array.ElementArrayBufferObj->Size) { 242ef5935bc94a1439eb8f1731732a3eabd0e360407Brian _mesa_warning(ctx, "glDrawRangeElements index out of buffer bounds"); 243d8c6719f95b1543296ac954f95d13b048ae48634Brian return GL_FALSE; 244d8c6719f95b1543296ac954f95d13b048ae48634Brian } 24537ece4df7c654b30b6720044b35a83694d7e5bb3Brian } 24637ece4df7c654b30b6720044b35a83694d7e5bb3Brian else { 247d8c6719f95b1543296ac954f95d13b048ae48634Brian /* not using a VBO */ 24837ece4df7c654b30b6720044b35a83694d7e5bb3Brian if (!indices) 24937ece4df7c654b30b6720044b35a83694d7e5bb3Brian return GL_FALSE; 25037ece4df7c654b30b6720044b35a83694d7e5bb3Brian } 25137ece4df7c654b30b6720044b35a83694d7e5bb3Brian 252a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul if (ctx->Const.CheckArrayBounds) { 253d8c6719f95b1543296ac954f95d13b048ae48634Brian GLuint max = max_buffer_index(ctx, count, type, indices, 254d8c6719f95b1543296ac954f95d13b048ae48634Brian ctx->Array.ElementArrayBufferObj); 255a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul if (max >= ctx->Array._MaxElement) { 256a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul /* the max element is out of bounds of one or more enabled arrays */ 257c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_FALSE; 258a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul } 259c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul } 260a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 261c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_TRUE; 262c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul} 263c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 264cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 265c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/** 266c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul * Called from the tnl module to error check the function parameters and 267c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul * verify that we really can draw something. 268c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */ 269cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith WhitwellGLboolean 27022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes_mesa_validate_DrawArrays(GLcontext *ctx, 271cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLenum mode, GLint start, GLsizei count) 272cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 27322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2755cb203433ab5c4e54a7386a816263a237c716aa2Brian if (count <= 0) { 2765cb203433ab5c4e54a7386a816263a237c716aa2Brian if (count < 0) 2775cb203433ab5c4e54a7386a816263a237c716aa2Brian _mesa_error(ctx, GL_INVALID_VALUE, "glDrawArrays(count)" ); 278cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 279cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 280cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 281464bc3b6747108dd32e4a9fcfe6549a9d4a52a95Brian Paul if (mode > GL_POLYGON) { 28208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawArrays(mode)" ); 283cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 284cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (ctx->NewState) 287a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_update_state(ctx); 288c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 289263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane if (!check_valid_to_render(ctx, "Arrays")) 290c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_FALSE; 291c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 292a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul if (ctx->Const.CheckArrayBounds) { 2932c9f50dd4acc65ddfeb8e3fde98137711167e579Brian Paul if (start + count > (GLint) ctx->Array._MaxElement) 294c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_FALSE; 295a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul } 296c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 297c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_TRUE; 298cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 299