mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-01 08:08:06 +02:00
vbo: Rework checking of 'end' against _MaxElement.
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@whitecape.org> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
parent
f00c97b23f
commit
112b02c324
1 changed files with 6 additions and 11 deletions
|
|
@ -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) start + 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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue