mesa: new validation functions for GL_ARB_draw_instanced

This commit is contained in:
Brian Paul 2010-04-04 18:18:28 -06:00
parent 3258dfbbbd
commit cf3193ad1c
2 changed files with 116 additions and 1 deletions

View file

@ -175,7 +175,7 @@ _mesa_validate_DrawElements(GLcontext *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLint basevertex)
{
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
if (count <= 0) {
if (count < 0)
@ -314,3 +314,108 @@ _mesa_validate_DrawArrays(GLcontext *ctx,
return GL_TRUE;
}
GLboolean
_mesa_validate_DrawArraysInstanced(GLcontext *ctx, GLenum mode, GLint first,
GLsizei count, GLsizei primcount)
{
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
if (count <= 0) {
if (count < 0)
_mesa_error(ctx, GL_INVALID_VALUE,
"glDrawArraysInstanced(count=%d)", count);
return GL_FALSE;
}
if (mode > GL_POLYGON) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glDrawArraysInstanced(mode=0x%x)", mode);
return GL_FALSE;
}
if (primcount <= 0) {
if (primcount < 0)
_mesa_error(ctx, GL_INVALID_VALUE,
"glDrawArraysInstanced(primcount=%d)", primcount);
return GL_FALSE;
}
if (!check_valid_to_render(ctx, "glDrawArraysInstanced(invalid to render)"))
return GL_FALSE;
if (ctx->CompileFlag) {
_mesa_error(ctx, GL_INVALID_OPERATION,
"glDrawArraysInstanced(display list");
return GL_FALSE;
}
if (ctx->Const.CheckArrayBounds) {
if (first + count > (GLint) ctx->Array.ArrayObj->_MaxElement)
return GL_FALSE;
}
return GL_TRUE;
}
GLboolean
_mesa_validate_DrawElementsInstanced(GLcontext *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei primcount)
{
ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
if (count <= 0) {
if (count < 0)
_mesa_error(ctx, GL_INVALID_VALUE,
"glDrawElementsInstanced(count=%d)", count);
return GL_FALSE;
}
if (mode > GL_POLYGON) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glDrawElementsInstanced(mode = 0x%x)", mode);
return GL_FALSE;
}
if (type != GL_UNSIGNED_INT &&
type != GL_UNSIGNED_BYTE &&
type != GL_UNSIGNED_SHORT) {
_mesa_error(ctx, GL_INVALID_ENUM,
"glDrawElementsInstanced(type=0x%x)", type);
return GL_FALSE;
}
if (primcount <= 0) {
if (primcount < 0)
_mesa_error(ctx, GL_INVALID_VALUE,
"glDrawElementsInstanced(primcount=%d)", primcount);
return GL_FALSE;
}
if (!check_valid_to_render(ctx, "glDrawElementsInstanced"))
return GL_FALSE;
/* Vertex buffer object tests */
if (_mesa_is_bufferobj(ctx->Array.ElementArrayBufferObj)) {
/* use indices in the buffer object */
/* make sure count doesn't go outside buffer bounds */
if (index_bytes(type, count) > ctx->Array.ElementArrayBufferObj->Size) {
_mesa_warning(ctx,
"glDrawElementsInstanced index out of buffer bounds");
return GL_FALSE;
}
}
else {
/* not using a VBO */
if (!indices)
return GL_FALSE;
}
if (!check_index_bounds(ctx, count, type, indices, 0))
return GL_FALSE;
return GL_TRUE;
}

View file

@ -52,4 +52,14 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
const GLvoid *indices, GLint basevertex);
extern GLboolean
_mesa_validate_DrawArraysInstanced(GLcontext *ctx, GLenum mode, GLint first,
GLsizei count, GLsizei primcount);
extern GLboolean
_mesa_validate_DrawElementsInstanced(GLcontext *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLsizei primcount);
#endif