summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/api_validate.c8
-rw-r--r--src/mesa/main/mtypes.h7
-rw-r--r--src/mesa/main/state.c2
-rw-r--r--src/mesa/vbo/vbo_exec_array.c5
4 files changed, 14 insertions, 8 deletions
diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c
index d5c604c56a..1507671250 100644
--- a/src/mesa/main/api_validate.c
+++ b/src/mesa/main/api_validate.c
@@ -182,10 +182,10 @@ _mesa_validate_DrawElements(GLcontext *ctx,
/* find max array index */
GLuint max = max_buffer_index(ctx, count, type, indices,
ctx->Array.ElementArrayBufferObj);
- if (max >= ctx->Array._MaxElement) {
+ if (max >= ctx->Array.ArrayObj->_MaxElement) {
/* the max element is out of bounds of one or more enabled arrays */
_mesa_warning(ctx, "glDrawElements() index=%u is "
- "out of bounds (max=%u)", max, ctx->Array._MaxElement);
+ "out of bounds (max=%u)", max, ctx->Array.ArrayObj->_MaxElement);
return GL_FALSE;
}
}
@@ -254,7 +254,7 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
if (ctx->Const.CheckArrayBounds) {
GLuint max = max_buffer_index(ctx, count, type, indices,
ctx->Array.ElementArrayBufferObj);
- if (max >= ctx->Array._MaxElement) {
+ if (max >= ctx->Array.ArrayObj->_MaxElement) {
/* the max element is out of bounds of one or more enabled arrays */
return GL_FALSE;
}
@@ -293,7 +293,7 @@ _mesa_validate_DrawArrays(GLcontext *ctx,
return GL_FALSE;
if (ctx->Const.CheckArrayBounds) {
- if (start + count > (GLint) ctx->Array._MaxElement)
+ if (start + count > (GLint) ctx->Array.ArrayObj->_MaxElement)
return GL_FALSE;
}
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index d11df535f2..0df425c913 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -1578,6 +1578,12 @@ struct gl_array_object
/** Mask of _NEW_ARRAY_* values indicating which arrays are enabled */
GLbitfield _Enabled;
+
+ /**
+ * Min of all enabled arrays' _MaxElement. When arrays reside inside VBOs
+ * we can determine the max legal (in bounds) glDrawElements array index.
+ */
+ GLuint _MaxElement;
};
@@ -1602,7 +1608,6 @@ struct gl_array_attrib
struct gl_buffer_object *ArrayBufferObj;
struct gl_buffer_object *ElementArrayBufferObj;
#endif
- GLuint _MaxElement; /* Min of all enabled array's maxes */
};
diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
index a6411f7b62..bfbefa55d4 100644
--- a/src/mesa/main/state.c
+++ b/src/mesa/main/state.c
@@ -206,7 +206,7 @@ update_arrays( GLcontext *ctx )
}
/* _MaxElement is one past the last legal array element */
- ctx->Array._MaxElement = min;
+ arrayObj->_MaxElement = min;
}
diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
index fdb501815d..a4c67c1de1 100644
--- a/src/mesa/vbo/vbo_exec_array.c
+++ b/src/mesa/vbo/vbo_exec_array.c
@@ -352,10 +352,11 @@ vbo_exec_DrawRangeElements(GLenum mode,
if (!_mesa_validate_DrawRangeElements( ctx, mode, start, end, count, type, indices ))
return;
- if (end >= ctx->Array._MaxElement) {
+ if (end >= ctx->Array.ArrayObj->_MaxElement) {
/* the max element is out of bounds of one or more enabled arrays */
_mesa_warning(ctx, "glDraw[Range]Elements() index=%u is "
- "out of bounds (max=%u)", end, ctx->Array._MaxElement);
+ "out of bounds (max=%u)", end,
+ ctx->Array.ArrayObj->_MaxElement);
return;
}