api_validate.c revision 7ca4f07b5b77ccac0a9b60dc5ac9082906b5947e
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" 27434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul#include "bufferobj.h" 28cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "context.h" 293c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 306bf0ac0916bf09e049b378d94478035072efed53Vinson Lee#include "mfeatures.h" 31cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "mtypes.h" 3292d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt#include "vbo/vbo.h" 3358e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell 34bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul 35bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul/** 36bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul * \return number of bytes in array [count] of type. 37bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul */ 38bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paulstatic GLsizei 39bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paulindex_bytes(GLenum type, GLsizei count) 40bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul{ 41bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul if (type == GL_UNSIGNED_INT) { 42bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul return count * sizeof(GLuint); 43bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul } 44bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul else if (type == GL_UNSIGNED_BYTE) { 45bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul return count * sizeof(GLubyte); 46bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul } 47bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul else { 48bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul ASSERT(type == GL_UNSIGNED_SHORT); 49bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul return count * sizeof(GLushort); 50bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul } 51bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul} 52bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul 53bb1fb2a5444c6b7d83ccb47949f60ed9fb4f0f93Brian Paul 54d8c6719f95b1543296ac954f95d13b048ae48634Brian/** 55e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul * Find the max index in the given element/index buffer 56e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul */ 57e5d29ebb5e5dd923c9c60972170d072120007aabBrian PaulGLuint 58f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_max_buffer_index(struct gl_context *ctx, GLuint count, GLenum type, 59e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul const void *indices, 60e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul struct gl_buffer_object *elementBuf) 61e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul{ 62e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul const GLubyte *map = NULL; 63e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul GLuint max = 0; 64e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul GLuint i; 65e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul 66e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul if (_mesa_is_bufferobj(elementBuf)) { 67e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul /* elements are in a user-defined buffer object. need to map it */ 6828249bd260f4c52badf3eb61ade2744604b21bcaIan Romanick map = ctx->Driver.MapBufferRange(ctx, 0, elementBuf->Size, 6928249bd260f4c52badf3eb61ade2744604b21bcaIan Romanick GL_MAP_READ_BIT, elementBuf); 70e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul /* Actual address is the sum of pointers */ 71e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul indices = (const GLvoid *) ADD_POINTERS(map, (const GLubyte *) indices); 72e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul } 73e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul 74e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul if (type == GL_UNSIGNED_INT) { 75e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul for (i = 0; i < count; i++) 76e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul if (((GLuint *) indices)[i] > max) 77e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul max = ((GLuint *) indices)[i]; 78e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul } 79e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul else if (type == GL_UNSIGNED_SHORT) { 80e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul for (i = 0; i < count; i++) 81e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul if (((GLushort *) indices)[i] > max) 82e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul max = ((GLushort *) indices)[i]; 83e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul } 84e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul else { 85e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul ASSERT(type == GL_UNSIGNED_BYTE); 86e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul for (i = 0; i < count; i++) 87e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul if (((GLubyte *) indices)[i] > max) 88e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul max = ((GLubyte *) indices)[i]; 89e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul } 90e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul 91e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul if (map) { 9256f0c00f125ee75caeadc1c9e8cab8a488635e5eIan Romanick ctx->Driver.UnmapBuffer(ctx, elementBuf); 93e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul } 94e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul 95e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul return max; 96e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul} 97e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul 98e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul 99e5d29ebb5e5dd923c9c60972170d072120007aabBrian Paul/** 100b6e5600bd460245afef605dbfbcf6650ff677dcbBrian Paul * Check if OK to draw arrays/elements. 10188af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul */ 102263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihanestatic GLboolean 103f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcheck_valid_to_render(struct gl_context *ctx, const char *function) 104263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane{ 105b6e5600bd460245afef605dbfbcf6650ff677dcbBrian Paul if (!_mesa_valid_to_render(ctx, function)) { 106263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane return GL_FALSE; 107263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane } 108263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane 109f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg switch (ctx->API) { 11097dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul#if FEATURE_es2_glsl 111f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg case API_OPENGLES2: 112f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg /* For ES2, we can draw if any vertex array is enabled (and we 113f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg * should always have a vertex program/shader). */ 114f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg if (ctx->Array.ArrayObj->_Enabled == 0x0 || !ctx->VertexProgram._Current) 115f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg return GL_FALSE; 116f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg break; 117f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg#endif 118f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg 11943bdabd47d98975b56a759954fb5f37d2942c101Brian Paul#if FEATURE_ES1 120f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg case API_OPENGLES: 12143bdabd47d98975b56a759954fb5f37d2942c101Brian Paul /* For OpenGL ES, only draw if we have vertex positions 12243bdabd47d98975b56a759954fb5f37d2942c101Brian Paul */ 123762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich if (!ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) 124f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg return GL_FALSE; 125f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg break; 12697dd2ddbd97ba95e8bc8ab572ec05e8081556e1eBrian Paul#endif 127263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane 12843bdabd47d98975b56a759954fb5f37d2942c101Brian Paul#if FEATURE_GL 12943bdabd47d98975b56a759954fb5f37d2942c101Brian Paul case API_OPENGL: 13043bdabd47d98975b56a759954fb5f37d2942c101Brian Paul { 13143bdabd47d98975b56a759954fb5f37d2942c101Brian Paul const struct gl_shader_program *vsProg = 13243bdabd47d98975b56a759954fb5f37d2942c101Brian Paul ctx->Shader.CurrentVertexProgram; 13343bdabd47d98975b56a759954fb5f37d2942c101Brian Paul GLboolean haveVertexShader = (vsProg && vsProg->LinkStatus); 13443bdabd47d98975b56a759954fb5f37d2942c101Brian Paul GLboolean haveVertexProgram = ctx->VertexProgram._Enabled; 13543bdabd47d98975b56a759954fb5f37d2942c101Brian Paul if (haveVertexShader || haveVertexProgram) { 13643bdabd47d98975b56a759954fb5f37d2942c101Brian Paul /* Draw regardless of whether or not we have any vertex arrays. 13743bdabd47d98975b56a759954fb5f37d2942c101Brian Paul * (Ex: could draw a point using a constant vertex pos) 13843bdabd47d98975b56a759954fb5f37d2942c101Brian Paul */ 13943bdabd47d98975b56a759954fb5f37d2942c101Brian Paul return GL_TRUE; 14043bdabd47d98975b56a759954fb5f37d2942c101Brian Paul } 14143bdabd47d98975b56a759954fb5f37d2942c101Brian Paul else { 14243bdabd47d98975b56a759954fb5f37d2942c101Brian Paul /* Draw if we have vertex positions (GL_VERTEX_ARRAY or generic 14343bdabd47d98975b56a759954fb5f37d2942c101Brian Paul * array [0]). 14443bdabd47d98975b56a759954fb5f37d2942c101Brian Paul */ 145762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich return (ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled || 146762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled); 14743bdabd47d98975b56a759954fb5f37d2942c101Brian Paul } 14843bdabd47d98975b56a759954fb5f37d2942c101Brian Paul } 14943bdabd47d98975b56a759954fb5f37d2942c101Brian Paul break; 15043bdabd47d98975b56a759954fb5f37d2942c101Brian Paul#endif 15143bdabd47d98975b56a759954fb5f37d2942c101Brian Paul 152f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg default: 153f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg ASSERT_NO_FEATURE(); 154f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg } 155f67b020a942911f80b7b774c6d64701d1981c608Kristian Høgsberg 156263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane return GL_TRUE; 157263b96e160606975285154c4b8b610fcb8f4c930Alan Hourihane} 158d8c6719f95b1543296ac954f95d13b048ae48634Brian 159e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul 160e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul/** 161e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul * Do bounds checking on array element indexes. Check that the vertices 162e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul * pointed to by the indices don't lie outside buffer object bounds. 163e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul * \return GL_TRUE if OK, GL_FALSE if any indexed vertex goes is out of bounds 164e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul */ 16592d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholtstatic GLboolean 166f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcheck_index_bounds(struct gl_context *ctx, GLsizei count, GLenum type, 16792d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt const GLvoid *indices, GLint basevertex) 16892d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt{ 16992d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt struct _mesa_prim prim; 17092d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt struct _mesa_index_buffer ib; 17192d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt GLuint min, max; 17292d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt 17392d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt /* Only the X Server needs to do this -- otherwise, accessing outside 17492d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt * array/BO bounds allows application termination. 17592d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt */ 17692d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt if (!ctx->Const.CheckArrayBounds) 17792d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt return GL_TRUE; 17892d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt 17992d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt memset(&prim, 0, sizeof(prim)); 18092d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt prim.count = count; 18192d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt 18292d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt memset(&ib, 0, sizeof(ib)); 18392d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt ib.type = type; 18492d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt ib.ptr = indices; 185a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu ib.obj = ctx->Array.ArrayObj->ElementArrayBufferObj; 18692d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt 18742d4972bf0b147b0241c2be7e6579fd64cf2c216Yuanhan Liu vbo_get_minmax_indices(ctx, &prim, &ib, &min, &max, 1); 18892d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt 189391b396f3fb300a912e6d9bfbf26f49cc30e52dfMichel Dänzer if ((int)(min + basevertex) < 0 || 1901f4a853b1e4691400ab832c589b044b659c20c06Roland Scheidegger max + basevertex >= ctx->Array.ArrayObj->_MaxElement) { 19192d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt /* the max element is out of bounds of one or more enabled arrays */ 192e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul _mesa_warning(ctx, "glDrawElements() index=%u is out of bounds (max=%u)", 193e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul max, ctx->Array.ArrayObj->_MaxElement); 19492d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt return GL_FALSE; 19592d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt } 19692d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt 19792d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt return GL_TRUE; 19892d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt} 19988af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul 200e9968ebfa40b4740601c1596950ebd3f168664b0Brian Paul 20188af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul/** 2020e6646db3248057b7750031d825535cd7a0e5aecBrian Paul * Is 'mode' a valid value for glBegin(), glDrawArrays(), glDrawElements(), 2030e6646db3248057b7750031d825535cd7a0e5aecBrian Paul * etc? The set of legal values depends on whether geometry shaders/programs 2040e6646db3248057b7750031d825535cd7a0e5aecBrian Paul * are supported. 2050e6646db3248057b7750031d825535cd7a0e5aecBrian Paul */ 2060e6646db3248057b7750031d825535cd7a0e5aecBrian PaulGLboolean 2077ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt_mesa_valid_prim_mode(struct gl_context *ctx, GLenum mode, const char *name) 2080e6646db3248057b7750031d825535cd7a0e5aecBrian Paul{ 2090e6646db3248057b7750031d825535cd7a0e5aecBrian Paul if (ctx->Extensions.ARB_geometry_shader4 && 2100e6646db3248057b7750031d825535cd7a0e5aecBrian Paul mode > GL_TRIANGLE_STRIP_ADJACENCY_ARB) { 2117ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt _mesa_error(ctx, GL_INVALID_ENUM, "%s(mode=%x)", name, mode); 2120e6646db3248057b7750031d825535cd7a0e5aecBrian Paul return GL_FALSE; 2130e6646db3248057b7750031d825535cd7a0e5aecBrian Paul } 2140e6646db3248057b7750031d825535cd7a0e5aecBrian Paul else if (mode > GL_POLYGON) { 2157ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt _mesa_error(ctx, GL_INVALID_ENUM, "%s(mode=%x)", name, mode); 2160e6646db3248057b7750031d825535cd7a0e5aecBrian Paul return GL_FALSE; 2170e6646db3248057b7750031d825535cd7a0e5aecBrian Paul } 2180e6646db3248057b7750031d825535cd7a0e5aecBrian Paul else { 2190e6646db3248057b7750031d825535cd7a0e5aecBrian Paul return GL_TRUE; 2200e6646db3248057b7750031d825535cd7a0e5aecBrian Paul } 2210e6646db3248057b7750031d825535cd7a0e5aecBrian Paul} 2220e6646db3248057b7750031d825535cd7a0e5aecBrian Paul 2230e6646db3248057b7750031d825535cd7a0e5aecBrian Paul 2240e6646db3248057b7750031d825535cd7a0e5aecBrian Paul/** 22588af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * Error checking for glDrawElements(). Includes parameter checking 22688af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * and VBO bounds checking. 22788af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * \return GL_TRUE if OK to render, GL_FALSE if error found 22888af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul */ 229cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith WhitwellGLboolean 230f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_DrawElements(struct gl_context *ctx, 23122144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLenum mode, GLsizei count, GLenum type, 23292d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt const GLvoid *indices, GLint basevertex) 233cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 234cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count <= 0) { 237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count < 0) 23808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glDrawElements(count)" ); 239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 240cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 241cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2427ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt if (!_mesa_valid_prim_mode(ctx, mode, "glDrawElements")) { 243cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 244cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 245cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 24622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (type != GL_UNSIGNED_INT && 24722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes type != GL_UNSIGNED_BYTE && 248cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell type != GL_UNSIGNED_SHORT) 249cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell { 25008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawElements(type)" ); 251cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 252cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 253cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 254a48b0a5ce7fc17eab4daa375fb95768fa2f50825Brian Paul if (!check_valid_to_render(ctx, "glDrawElements")) 255a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul return GL_FALSE; 256a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 25703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul /* Vertex buffer object tests */ 258a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu if (_mesa_is_bufferobj(ctx->Array.ArrayObj->ElementArrayBufferObj)) { 25903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul /* use indices in the buffer object */ 260d8c6719f95b1543296ac954f95d13b048ae48634Brian /* make sure count doesn't go outside buffer bounds */ 261a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu if (index_bytes(type, count) > ctx->Array.ArrayObj->ElementArrayBufferObj->Size) { 26203e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul _mesa_warning(ctx, "glDrawElements index out of buffer bounds"); 26303e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul return GL_FALSE; 26403e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 26503e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul } 26637ece4df7c654b30b6720044b35a83694d7e5bb3Brian else { 26737ece4df7c654b30b6720044b35a83694d7e5bb3Brian /* not using a VBO */ 26837ece4df7c654b30b6720044b35a83694d7e5bb3Brian if (!indices) 26937ece4df7c654b30b6720044b35a83694d7e5bb3Brian return GL_FALSE; 27037ece4df7c654b30b6720044b35a83694d7e5bb3Brian } 27103e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul 27292d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt if (!check_index_bounds(ctx, count, type, indices, basevertex)) 27392d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt return GL_FALSE; 274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 275cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_TRUE; 276cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 277cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 27888af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul 27988af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul/** 28088af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * Error checking for glDrawRangeElements(). Includes parameter checking 28188af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * and VBO bounds checking. 28288af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * \return GL_TRUE if OK to render, GL_FALSE if error found 28388af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul */ 284cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith WhitwellGLboolean 285f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_DrawRangeElements(struct gl_context *ctx, GLenum mode, 28622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLuint start, GLuint end, 28722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes GLsizei count, GLenum type, 28892d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt const GLvoid *indices, GLint basevertex) 289cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 29022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 291cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 292cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count <= 0) { 293cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (count < 0) 294a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(count)" ); 295cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 296cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 297cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 2987ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt if (!_mesa_valid_prim_mode(ctx, mode, "glDrawRangeElements")) { 299cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 300cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 301cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell if (end < start) { 30308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glDrawRangeElements(end<start)"); 304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 305cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 306cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 30722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes if (type != GL_UNSIGNED_INT && 30822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes type != GL_UNSIGNED_BYTE && 30961bac6014aa15e0bec134e290aebac18f9815299Brian Paul type != GL_UNSIGNED_SHORT) { 310a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glDrawRangeElements(type)" ); 311cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 312cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 313cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 314a48b0a5ce7fc17eab4daa375fb95768fa2f50825Brian Paul if (!check_valid_to_render(ctx, "glDrawRangeElements")) 315a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul return GL_FALSE; 316a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 31737ece4df7c654b30b6720044b35a83694d7e5bb3Brian /* Vertex buffer object tests */ 318a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu if (_mesa_is_bufferobj(ctx->Array.ArrayObj->ElementArrayBufferObj)) { 319d8c6719f95b1543296ac954f95d13b048ae48634Brian /* use indices in the buffer object */ 320d8c6719f95b1543296ac954f95d13b048ae48634Brian /* make sure count doesn't go outside buffer bounds */ 321a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu if (index_bytes(type, count) > ctx->Array.ArrayObj->ElementArrayBufferObj->Size) { 322ef5935bc94a1439eb8f1731732a3eabd0e360407Brian _mesa_warning(ctx, "glDrawRangeElements index out of buffer bounds"); 323d8c6719f95b1543296ac954f95d13b048ae48634Brian return GL_FALSE; 324d8c6719f95b1543296ac954f95d13b048ae48634Brian } 32537ece4df7c654b30b6720044b35a83694d7e5bb3Brian } 32637ece4df7c654b30b6720044b35a83694d7e5bb3Brian else { 327d8c6719f95b1543296ac954f95d13b048ae48634Brian /* not using a VBO */ 32837ece4df7c654b30b6720044b35a83694d7e5bb3Brian if (!indices) 32937ece4df7c654b30b6720044b35a83694d7e5bb3Brian return GL_FALSE; 33037ece4df7c654b30b6720044b35a83694d7e5bb3Brian } 33137ece4df7c654b30b6720044b35a83694d7e5bb3Brian 33292d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt if (!check_index_bounds(ctx, count, type, indices, basevertex)) 33392d7ed8a20d4a018ce5324e6537ae7b478b9e5bfEric Anholt return GL_FALSE; 334a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul 335c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_TRUE; 336c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul} 337c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 338cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 339c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/** 340c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul * Called from the tnl module to error check the function parameters and 341c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul * verify that we really can draw something. 34288af3f8783452dcf50a9e2e82076f52b2044f643Brian Paul * \return GL_TRUE if OK to render, GL_FALSE if error found 343c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */ 344cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith WhitwellGLboolean 345f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_DrawArrays(struct gl_context *ctx, 346cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell GLenum mode, GLint start, GLsizei count) 347cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell{ 34822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 349cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3505cb203433ab5c4e54a7386a816263a237c716aa2Brian if (count <= 0) { 3515cb203433ab5c4e54a7386a816263a237c716aa2Brian if (count < 0) 3525cb203433ab5c4e54a7386a816263a237c716aa2Brian _mesa_error(ctx, GL_INVALID_VALUE, "glDrawArrays(count)" ); 353cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 354cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 355cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 3567ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt if (!_mesa_valid_prim_mode(ctx, mode, "glDrawArrays")) { 357cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell return GL_FALSE; 358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell } 359cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell 360a48b0a5ce7fc17eab4daa375fb95768fa2f50825Brian Paul if (!check_valid_to_render(ctx, "glDrawArrays")) 361c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_FALSE; 362c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 363a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul if (ctx->Const.CheckArrayBounds) { 364a185bcbdec856cc98c26098e4e447a683eed14d1Brian Paul if (start + count > (GLint) ctx->Array.ArrayObj->_MaxElement) 365c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_FALSE; 366a2b9bad251b058f6255fa037b842c5465c0609a2Brian Paul } 367c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul 368c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul return GL_TRUE; 369cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell} 370cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 371cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 372cf3193ad1cd75b847c5d626def701a4bb012d080Brian PaulGLboolean 373f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_DrawArraysInstanced(struct gl_context *ctx, GLenum mode, GLint first, 37472f2551017e03f888d63fa9040120740c6d40620Brian Paul GLsizei count, GLsizei numInstances) 375cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul{ 376cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 377cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 378cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (count <= 0) { 379cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (count < 0) 380cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 381cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul "glDrawArraysInstanced(count=%d)", count); 382cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 383cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 384cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 385767ba60831657a684e3852c398a0d13d1201158fEric Anholt if (first < 0) { 386767ba60831657a684e3852c398a0d13d1201158fEric Anholt _mesa_error(ctx, GL_INVALID_VALUE, 387767ba60831657a684e3852c398a0d13d1201158fEric Anholt "glDrawArraysInstanced(start=%d)", first); 388767ba60831657a684e3852c398a0d13d1201158fEric Anholt return GL_FALSE; 389767ba60831657a684e3852c398a0d13d1201158fEric Anholt } 390767ba60831657a684e3852c398a0d13d1201158fEric Anholt 3917ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt if (!_mesa_valid_prim_mode(ctx, mode, "glDrawArraysInstanced")) { 392cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 393cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 394cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 39572f2551017e03f888d63fa9040120740c6d40620Brian Paul if (numInstances <= 0) { 39672f2551017e03f888d63fa9040120740c6d40620Brian Paul if (numInstances < 0) 397cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 39872f2551017e03f888d63fa9040120740c6d40620Brian Paul "glDrawArraysInstanced(numInstances=%d)", numInstances); 399cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 400cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 401cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 402cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (!check_valid_to_render(ctx, "glDrawArraysInstanced(invalid to render)")) 403cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 404cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 405cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (ctx->Const.CheckArrayBounds) { 406cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (first + count > (GLint) ctx->Array.ArrayObj->_MaxElement) 407cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 408cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 409cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 410cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_TRUE; 411cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul} 412cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 413cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 414cf3193ad1cd75b847c5d626def701a4bb012d080Brian PaulGLboolean 415f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_DrawElementsInstanced(struct gl_context *ctx, 416cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul GLenum mode, GLsizei count, GLenum type, 41709201cc7a0c4c50871bb8aa5d00ac70aa4e9e670Pierre-Eric Pelloux-Prayer const GLvoid *indices, GLsizei numInstances, 41809201cc7a0c4c50871bb8aa5d00ac70aa4e9e670Pierre-Eric Pelloux-Prayer GLint basevertex) 419cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul{ 420cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 421cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 422cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (count <= 0) { 423cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (count < 0) 424cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 425cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul "glDrawElementsInstanced(count=%d)", count); 426cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 427cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 428cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 4297ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt if (!_mesa_valid_prim_mode(ctx, mode, "glDrawElementsInstanced")) { 430cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 431cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 432cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 433cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (type != GL_UNSIGNED_INT && 434cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul type != GL_UNSIGNED_BYTE && 435cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul type != GL_UNSIGNED_SHORT) { 436cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 437cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul "glDrawElementsInstanced(type=0x%x)", type); 438cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 439cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 440cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 44172f2551017e03f888d63fa9040120740c6d40620Brian Paul if (numInstances <= 0) { 44272f2551017e03f888d63fa9040120740c6d40620Brian Paul if (numInstances < 0) 443cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 44472f2551017e03f888d63fa9040120740c6d40620Brian Paul "glDrawElementsInstanced(numInstances=%d)", numInstances); 445cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 446cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 447cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 448cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (!check_valid_to_render(ctx, "glDrawElementsInstanced")) 449cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 450cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 451cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul /* Vertex buffer object tests */ 452a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu if (_mesa_is_bufferobj(ctx->Array.ArrayObj->ElementArrayBufferObj)) { 453cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul /* use indices in the buffer object */ 454cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul /* make sure count doesn't go outside buffer bounds */ 455a0a5bd4bb30a73c10b02c3c3b914940a03f9b790Yuanhan Liu if (index_bytes(type, count) > ctx->Array.ArrayObj->ElementArrayBufferObj->Size) { 456cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul _mesa_warning(ctx, 457cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul "glDrawElementsInstanced index out of buffer bounds"); 458cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 459cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 460cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 461cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul else { 462cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul /* not using a VBO */ 463cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul if (!indices) 464cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 465cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul } 466cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 46709201cc7a0c4c50871bb8aa5d00ac70aa4e9e670Pierre-Eric Pelloux-Prayer if (!check_index_bounds(ctx, count, type, indices, basevertex)) 468cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_FALSE; 469cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul 470cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul return GL_TRUE; 471cf3193ad1cd75b847c5d626def701a4bb012d080Brian Paul} 47214bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 47314bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 47414bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák#if FEATURE_EXT_transform_feedback 47514bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 47614bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek OlšákGLboolean 47714bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák_mesa_validate_DrawTransformFeedback(struct gl_context *ctx, 47814bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák GLenum mode, 47914bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák struct gl_transform_feedback_object *obj) 48014bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák{ 48114bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 48214bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 4837ca4f07b5b77ccac0a9b60dc5ac9082906b5947eEric Anholt if (!_mesa_valid_prim_mode(ctx, mode, "glDrawTransformFeedback")) { 48414bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák return GL_FALSE; 48514bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák } 48614bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 48714bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák if (!obj) { 48814bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák _mesa_error(ctx, GL_INVALID_VALUE, "glDrawTransformFeedback(name)"); 48914bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák return GL_FALSE; 49014bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák } 49114bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 49214bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák if (!obj->EndedAnytime) { 49314bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawTransformFeedback"); 49414bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák return GL_FALSE; 49514bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák } 49614bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 49714bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák if (!check_valid_to_render(ctx, "glDrawTransformFeedback")) { 49814bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák return GL_FALSE; 49914bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák } 50014bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 50114bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák return GL_TRUE; 50214bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák} 50314bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák 50414bb957b996dcc5392b8fa589bd3ffa5c55cb6b4Marek Olšák#endif 505