summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian <brian.paul@tungstengraphics.com>2007-08-20 12:55:34 +0100
committerBrian <brian.paul@tungstengraphics.com>2007-08-20 12:56:34 +0100
commita3c3bc9ece7e7c55c8832dbc8c50ab1c34f5bfe9 (patch)
tree8bfa3583343fcc106e6ad949bb34cce55f247a8d
parentef71a0fd4536363e578c49a05b6f1161f907c150 (diff)
don't map buffer in _mesa_validate_DrawElements() unless needed
-rw-r--r--src/mesa/main/api_validate.c51
1 files changed, 19 insertions, 32 deletions
diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c
index 18dead61c3..ab8c3e19ba 100644
--- a/src/mesa/main/api_validate.c
+++ b/src/mesa/main/api_validate.c
@@ -1,6 +1,6 @@
/*
* Mesa 3-D graphics library
- * Version: 7.0.1
+ * Version: 7.1
*
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
*
@@ -35,7 +35,6 @@ _mesa_validate_DrawElements(GLcontext *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices)
{
- GLboolean mapped = GL_FALSE;
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
if (count <= 0) {
@@ -68,19 +67,14 @@ _mesa_validate_DrawElements(GLcontext *ctx,
/* Vertex buffer object tests */
if (ctx->Array.ElementArrayBufferObj->Name) {
GLuint indexBytes;
- const GLvoid *map = ctx->Driver.MapBuffer(ctx,
- GL_ELEMENT_ARRAY_BUFFER_ARB,
- GL_READ_ONLY,
- ctx->Array.ElementArrayBufferObj);
/* use indices in the buffer object */
- if (!map) {
- _mesa_warning(ctx, "DrawElements with empty vertex elements buffer!");
+ if (!ctx->Array.ElementArrayBufferObj->Size) {
+ _mesa_warning(ctx,
+ "glDrawElements called with empty array elements buffer");
return GL_FALSE;
}
- mapped = GL_TRUE;
-
/* make sure count doesn't go outside buffer bounds */
if (type == GL_UNSIGNED_INT) {
indexBytes = count * sizeof(GLuint);
@@ -93,19 +87,10 @@ _mesa_validate_DrawElements(GLcontext *ctx,
indexBytes = count * sizeof(GLushort);
}
- if (ADD_POINTERS(map, indices) + indexBytes >
- (GLubyte *)map + ctx->Array.ElementArrayBufferObj->Size) {
+ if (indexBytes > ctx->Array.ElementArrayBufferObj->Size) {
_mesa_warning(ctx, "glDrawElements index out of buffer bounds");
- ctx->Driver.UnmapBuffer(ctx,
- GL_ELEMENT_ARRAY_BUFFER_ARB,
- ctx->Array.ElementArrayBufferObj);
return GL_FALSE;
}
-
- /* Actual address is the sum of pointers. Indices may be used below. */
- if (ctx->Const.CheckArrayBounds) {
- indices = ADD_POINTERS(map, indices);
- }
}
else {
/* not using a VBO */
@@ -115,8 +100,18 @@ _mesa_validate_DrawElements(GLcontext *ctx,
if (ctx->Const.CheckArrayBounds) {
/* find max array index */
+ const GLubyte *map;
GLuint max = 0;
GLint i;
+
+ map = ctx->Driver.MapBuffer(ctx,
+ GL_ELEMENT_ARRAY_BUFFER_ARB,
+ GL_READ_ONLY,
+ ctx->Array.ElementArrayBufferObj);
+
+ /* Actual address is the sum of pointers */
+ indices = (const GLvoid *) ADD_POINTERS(map, (const GLubyte *) indices);
+
if (type == GL_UNSIGNED_INT) {
for (i = 0; i < count; i++)
if (((GLuint *) indices)[i] > max)
@@ -134,24 +129,16 @@ _mesa_validate_DrawElements(GLcontext *ctx,
max = ((GLubyte *) indices)[i];
}
+ ctx->Driver.UnmapBuffer(ctx,
+ GL_ELEMENT_ARRAY_BUFFER_ARB,
+ ctx->Array.ElementArrayBufferObj);
+
if (max >= ctx->Array._MaxElement) {
/* the max element is out of bounds of one or more enabled arrays */
- if (mapped) {
- ctx->Driver.UnmapBuffer(ctx,
- GL_ELEMENT_ARRAY_BUFFER_ARB,
- ctx->Array.ElementArrayBufferObj);
- }
-
return GL_FALSE;
}
}
- if (mapped) {
- ctx->Driver.UnmapBuffer(ctx,
- GL_ELEMENT_ARRAY_BUFFER_ARB,
- ctx->Array.ElementArrayBufferObj);
- }
-
return GL_TRUE;
}