mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 02:28:10 +02:00
mesa: refine the error checking vbo_exec_DrawRangeElements()
If the 'end' index is out of bounds issue a warning as before. But instead of just no-op'ing the draw call, examine the actual array indices to see if they're OK. If the max array index is out of bounds, issue another warning and no-op the draw call. Otherwise, draw normally. This is a debug build-only feature since it could impact performance. This "fixes" the missing torus in the OGL Distilled / Picking demo.
This commit is contained in:
parent
e5d29ebb5e
commit
40603526f4
1 changed files with 33 additions and 6 deletions
|
|
@ -680,11 +680,12 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
|
|||
|
||||
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{,BaseVertex}(start %u, end %u, "
|
||||
"count %d, type 0x%x, indices=%p, base=%d)\n"
|
||||
"\tindex=%u is out of bounds (max=%u) "
|
||||
"Element Buffer %u (size %d)",
|
||||
start, end, count, type, indices, end, basevertex,
|
||||
_mesa_warning(ctx, "glDraw[Range]Elements(start %u, end %u, count %d, "
|
||||
"type 0x%x, indices=%p)\n"
|
||||
"\tend is out of bounds (max=%u) "
|
||||
"Element Buffer %u (size %d)\n"
|
||||
"\tThis should probably be fixed in the application.",
|
||||
start, end, count, type, indices,
|
||||
ctx->Array.ArrayObj->_MaxElement - 1,
|
||||
ctx->Array.ElementArrayBufferObj->Name,
|
||||
ctx->Array.ElementArrayBufferObj->Size);
|
||||
|
|
@ -694,7 +695,33 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
|
|||
|
||||
if (0)
|
||||
_mesa_print_arrays(ctx);
|
||||
return;
|
||||
|
||||
#ifdef DEBUG
|
||||
/* 'end' was out of bounds, but now let's check the actual array
|
||||
* indexes to see if any of them are out of bounds. If so, warn
|
||||
* and skip the draw to avoid potential segfault, etc.
|
||||
*/
|
||||
{
|
||||
GLuint max = _mesa_max_buffer_index(ctx, count, type, indices,
|
||||
ctx->Array.ElementArrayBufferObj);
|
||||
if (max >= ctx->Array.ArrayObj->_MaxElement) {
|
||||
_mesa_warning(ctx, "glDraw[Range]Elements(start %u, end %u, "
|
||||
"count %d, type 0x%x, indices=%p)\n"
|
||||
"\tindex=%u is out of bounds (max=%u) "
|
||||
"Element Buffer %u (size %d)\n"
|
||||
"\tSkipping the glDrawRangeElements() call",
|
||||
start, end, count, type, indices, max,
|
||||
ctx->Array.ArrayObj->_MaxElement - 1,
|
||||
ctx->Array.ElementArrayBufferObj->Name,
|
||||
ctx->Array.ElementArrayBufferObj->Size);
|
||||
return;
|
||||
}
|
||||
/* XXX we could also find the min index and compare to 'start'
|
||||
* to see if start is correct. But it's more likely to get the
|
||||
* upper bound wrong.
|
||||
*/
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else if (0) {
|
||||
_mesa_printf("glDraw[Range]Elements{,BaseVertex}"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue