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 <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
committed by
Kenneth Graunke
parent
a4aeb534ea
commit
d5f936367f
@@ -35,25 +35,6 @@
|
||||
#include <stdbool.h>
|
||||
|
||||
|
||||
/**
|
||||
* \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;
|
||||
|
||||
Reference in New Issue
Block a user