[Mesa-dev] [PATCH 3/4] vbo: Rework checking of 'end' against _MaxElement.
Brian Paul
brianp at vmware.com
Wed Feb 8 07:00:12 PST 2012
On 02/08/2012 06:08 AM, Kenneth Graunke wrote:
> This failed to take basevertex into account:
>
> If basevertex< 0:
> (end + basevertex) might actually be in-bounds while 'end' is not.
> We would have clamped in this case when we probably shouldn't.
> This could break application drawing.
>
> If basevertex> 0:
> 'end' might be in-bounds while (end + basevertex) might not.
> We would have failed to clamp in this place. There's a comment
> indicating the TNL module depends on max_index being in-bounds;
> if so, it would likely break horribly.
>
> Rather than trying to clamp correctly in the face of basevertex, simply
> delete the clamping code and indicate that we don't have a valid range.
> This causes _tnl_vbo_draw_prims to use vbo_get_minmax_indices() to
> compute the actual bounds, which is much safer.
>
> NOTE: This is a candidate for release branches.
>
> Signed-off-by: Kenneth Graunke<kenneth at whitecape.org>
> ---
> src/mesa/vbo/vbo_exec_array.c | 17 ++++++-----------
> 1 files changed, 6 insertions(+), 11 deletions(-)
>
> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
> index c26a8cd..67073df 100644
> --- a/src/mesa/vbo/vbo_exec_array.c
> +++ b/src/mesa/vbo/vbo_exec_array.c
> @@ -859,6 +859,7 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
> GLint basevertex)
> {
> static GLuint warnCount = 0;
> + GLboolean index_bounds_valid = GL_TRUE;
> GET_CURRENT_CONTEXT(ctx);
>
> if (MESA_VERBOSE& VERBOSE_DRAW)
> @@ -911,16 +912,6 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
> end = MIN2(end, 0xffff);
> }
>
> - if (end>= ctx->Array.ArrayObj->_MaxElement) {
> - /* Set 'end' to the max possible legal value */
> - assert(ctx->Array.ArrayObj->_MaxElement>= 1);
> - end = ctx->Array.ArrayObj->_MaxElement - 1;
> -
> - if (end< start) {
> - return;
> - }
> - }
> -
> if (0) {
> printf("glDraw[Range]Elements{,BaseVertex}"
> "(start %u, end %u, type 0x%x, count %d) ElemBuf %u, "
> @@ -930,13 +921,17 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
> basevertex);
> }
>
> + if ((int)(end + basevertex)< 0 ||
Again, maybe do this as:
if ((int) end + basevertex < 0 ||
> + end + basevertex>= ctx->Array.ArrayObj->_MaxElement)
> + index_bounds_valid = GL_FALSE;
> +
> #if 0
> check_draw_elements_data(ctx, count, type, indices);
> #else
> (void) check_draw_elements_data;
> #endif
>
> - vbo_validated_drawrangeelements(ctx, mode, GL_TRUE, start, end,
> + vbo_validated_drawrangeelements(ctx, mode, index_bounds_valid, start, end,
> count, type, indices, basevertex, 1);
> }
>
Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the mesa-dev
mailing list