summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2014-11-11 09:21:40 +0000
committerKenneth Graunke <[email protected]>2015-01-14 17:09:50 -0800
commitd5f936367ffbec5833e5eb7cf22666e38c8e3821 (patch)
treece9833ac3a792f8838772aeca1cb983633623fe5
parenta4aeb534ea8a21770b28cdf1f66cff4afe123009 (diff)
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 <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/mesa/main/api_validate.c55
1 files 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
@@ -36,25 +36,6 @@
/**
- * \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.
*/
static bool
@@ -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;