diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/mesa/main/api_validate.c | 8 | ||||
| -rw-r--r-- | src/mesa/main/mtypes.h | 7 | ||||
| -rw-r--r-- | src/mesa/main/state.c | 2 | ||||
| -rw-r--r-- | src/mesa/vbo/vbo_exec_array.c | 5 | 
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;     }  | 
