[Mesa-dev] [PATCH 1/4] vbo: Remove pedantic warning about 'end' beind out of bounds.
Brian Paul
brianp at vmware.com
Wed Feb 8 06:59:55 PST 2012
On 02/08/2012 06:08 AM, Kenneth Graunke wrote:
> The application supplied [start, end] range is merely a conservative
> hint of the ranges of index values inside the index buffer. There is no
> requirement that all vertices in the range [start, end] be referenced.
>
> Passing an 'end' value larger than the maximum legal index is perfectly
> acceptible; applications can legally pass 0xffffffff when they don't
> have a tighter bound readily available.
>
> Thus, the warning doesn't indicate a correctness issue; it could only
> indicate a performance issue. However, it does not even do that.
>
> glDrawRangeElements is designed to optimize non-VBO vertex data uploads
> by providing an upper bound on the size of buffers a driver would need
> to allocate. With VBOs, the data is already in an uploaded buffer, so
> the range doesn't help.
>
> The clincher is: we only know _MaxElement for VBOs. For user-space
> arrays, we just set it to 2,000,000,000 (see mesa/main/varray.h:63.)
> So we can only check this in the case where it is not useful.
>
> Many applications, including the Unigine demos, currently trigger this
> warning, which suggests the applications are buggy when they're actually
> fine. Eliminating the warning should confuse users less while not
> actually losing any benefit to application developers.
>
> NOTE: This is a candidate for release branches.
>
> Suggested-by: Jose Fonseca<jfonseca at vmware.com>
> Signed-off-by: Kenneth Graunke<kenneth at whitecape.org>
> ---
> src/mesa/vbo/vbo_exec_array.c | 49 +---------------------------------------
> 1 files changed, 2 insertions(+), 47 deletions(-)
>
> diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
> index d6b4d61..ec4cb4f 100644
> --- a/src/mesa/vbo/vbo_exec_array.c
> +++ b/src/mesa/vbo/vbo_exec_array.c
> @@ -708,6 +708,7 @@ vbo_exec_DrawArraysInstanced(GLenum mode, GLint start, GLsizei count,
> * Map GL_ELEMENT_ARRAY_BUFFER and print contents.
> * For debugging.
> */
> +#if 0
> static void
> dump_element_buffer(struct gl_context *ctx, GLenum type)
> {
> @@ -759,6 +760,7 @@ dump_element_buffer(struct gl_context *ctx, GLenum type)
>
> ctx->Driver.UnmapBuffer(ctx, ctx->Array.ArrayObj->ElementArrayBufferObj);
> }
> +#endif
Not a big deal, but someday I might wind up removing the #if 0 /
#endif so that I can use this in gdb when debugging something.
> /**
> @@ -856,7 +858,6 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
> const GLvoid *indices,
> GLint basevertex)
> {
> - static GLuint warnCount = 0;
> GET_CURRENT_CONTEXT(ctx);
>
> if (MESA_VERBOSE& VERBOSE_DRAW)
> @@ -886,52 +887,6 @@ vbo_exec_DrawRangeElementsBaseVertex(GLenum mode,
> }
>
> if (end>= ctx->Array.ArrayObj->_MaxElement) {
> - /* the max element is out of bounds of one or more enabled arrays */
> - warnCount++;
> -
> - if (warnCount< 10) {
> - _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.ArrayObj->ElementArrayBufferObj->Name,
> - (int) ctx->Array.ArrayObj->ElementArrayBufferObj->Size);
> - }
> -
> - if (0)
> - dump_element_buffer(ctx, type);
> -
> - if (0)
> - _mesa_print_arrays(ctx);
> -
> - /* '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 (0) {
> - GLuint max = _mesa_max_buffer_index(ctx, count, type, indices,
> - ctx->Array.ArrayObj->ElementArrayBufferObj);
> - if (max>= ctx->Array.ArrayObj->_MaxElement) {
> - if (warnCount< 10) {
> - _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.ArrayObj->ElementArrayBufferObj->Name,
> - (int) ctx->Array.ArrayObj->ElementArrayBufferObj->Size);
> - }
> - }
> - /* 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.
> - */
> - }
> -
> /* Set 'end' to the max possible legal value */
> assert(ctx->Array.ArrayObj->_MaxElement>= 1);
> end = ctx->Array.ArrayObj->_MaxElement - 1;
Reviewed-by: Brian Paul <brianp at vmware.com>
More information about the mesa-dev
mailing list