From d5f936367ffbec5833e5eb7cf22666e38c8e3821 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Tue, 11 Nov 2014 09:21:40 +0000 Subject: [PATCH] mesa: Drop index buffer bounds check The previous check was insufficient (as it did not take 'indices' into consideration), and DX10 hardware does not need this check anyway. Since index_bytes is no longer used, remove it. On Bay Trail-D using Fedora 20 compile flags (-m64 -O2 -mtune=generic for 64-bit and -m32 -march=i686 -mtune=atom for 32-bit), affects Gl32Batch7: 32-bit: Difference at 95.0% confidence 1.66929% +/- 0.230107% (n=40) 64-bit: Difference at 95.0% confidence -1.40848% +/- 0.288038% (n=40) The regression on 64-bit is odd. Callgrind says the caller, validate_DrawElements_common is faster. Before it says 10,321,920 cycles, and after it says 8,945,664. Signed-off-by: Ian Romanick Reviewed-by: Kenneth Graunke --- src/mesa/main/api_validate.c | 55 +++++------------------------------- 1 file changed, 7 insertions(+), 48 deletions(-) diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index a93a67de1ea..869dc4ee47a 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -35,25 +35,6 @@ #include -/** - * \return number of bytes in array [count] of type. - */ -static GLsizei -index_bytes(GLenum type, GLsizei count) -{ - if (type == GL_UNSIGNED_INT) { - return count * sizeof(GLuint); - } - else if (type == GL_UNSIGNED_BYTE) { - return count * sizeof(GLubyte); - } - else { - ASSERT(type == GL_UNSIGNED_SHORT); - return count * sizeof(GLushort); - } -} - - /** * Check if OK to draw arrays/elements. */ @@ -363,20 +344,10 @@ validate_DrawElements_common(struct gl_context *ctx, if (!check_valid_to_render(ctx, caller)) return false; - /* Vertex buffer object tests */ - if (_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj)) { - /* use indices in the buffer object */ - /* make sure count doesn't go outside buffer bounds */ - if (index_bytes(type, count) > ctx->Array.VAO->IndexBufferObj->Size) { - _mesa_warning(ctx, "%s index out of buffer bounds", caller); - return false; - } - } - else { - /* not using a VBO */ - if (!indices) - return false; - } + /* Not using a VBO for indices, so avoid NULL pointer derefs later. + */ + if (!_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj) && indices == NULL) + return false; if (count == 0) return false; @@ -434,21 +405,9 @@ _mesa_validate_MultiDrawElements(struct gl_context *ctx, if (!check_valid_to_render(ctx, "glMultiDrawElements")) return GL_FALSE; - /* Vertex buffer object tests */ - if (_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj)) { - /* use indices in the buffer object */ - /* make sure count doesn't go outside buffer bounds */ - for (i = 0; i < primcount; i++) { - if (index_bytes(type, count[i]) > - ctx->Array.VAO->IndexBufferObj->Size) { - _mesa_warning(ctx, - "glMultiDrawElements index out of buffer bounds"); - return GL_FALSE; - } - } - } - else { - /* not using a VBO */ + /* Not using a VBO for indices, so avoid NULL pointer derefs later. + */ + if (!_mesa_is_bufferobj(ctx->Array.VAO->IndexBufferObj)) { for (i = 0; i < primcount; i++) { if (!indices[i]) return GL_FALSE; -- 2.30.2