diff options
Diffstat (limited to 'src/mesa')
| -rw-r--r-- | src/mesa/vbo/vbo_exec_array.c | 35 | 
1 files changed, 31 insertions, 4 deletions
| diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c index 12911f5750..3f0656a816 100644 --- a/src/mesa/vbo/vbo_exec_array.c +++ b/src/mesa/vbo/vbo_exec_array.c @@ -677,9 +677,10 @@ vbo_exec_DrawRangeElements(GLenum mode,        /* the max element is out of bounds of one or more enabled arrays */        _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)", -                    start, end, count, type, indices, end, +                    "\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); @@ -689,7 +690,33 @@ vbo_exec_DrawRangeElements(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" | 
