Allow first != 0 in mesa CVA handling, and add more error checking.

This commit is contained in:
Eric Anholt 2008-02-02 02:54:13 -08:00
parent 2abcc512a3
commit 5857e988be
3 changed files with 27 additions and 9 deletions

View file

@ -1399,8 +1399,10 @@ _mesa_PopClientAttrib(void)
adjust_buffer_object_ref_counts(&ctx->Array, -1);
ctx->Array.ActiveTexture = data->ActiveTexture;
ctx->Array.LockFirst = data->LockFirst;
ctx->Array.LockCount = data->LockCount;
if (data->LockCount != 0)
_mesa_LockArraysEXT(data->LockFirst, data->LockCount);
else
_mesa_UnlockArraysEXT();
_mesa_BindVertexArrayAPPLE( data->ArrayObj->Name );

View file

@ -809,15 +809,21 @@ _mesa_LockArraysEXT(GLint first, GLsizei count)
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
if (first == 0 && count > 0 &&
count <= (GLint) ctx->Const.MaxArrayLockSize) {
ctx->Array.LockFirst = first;
ctx->Array.LockCount = count;
if (first < 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
return;
}
else {
ctx->Array.LockFirst = 0;
ctx->Array.LockCount = 0;
if (count <= 0) {
_mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
return;
}
if (ctx->Array.LockCount != 0) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
return;
}
ctx->Array.LockFirst = first;
ctx->Array.LockCount = count;
ctx->NewState |= _NEW_ARRAY;
ctx->Array.NewState |= _NEW_ARRAY_ALL;
@ -836,6 +842,11 @@ _mesa_UnlockArraysEXT( void )
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glUnlockArrays\n");
if (ctx->Array.LockCount == 0) {
_mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
return;
}
ctx->Array.LockFirst = 0;
ctx->Array.LockCount = 0;
ctx->NewState |= _NEW_ARRAY;

View file

@ -146,6 +146,11 @@ _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
GLenum type, const GLvoid * const * indices,
GLsizei primcount, GLint modestride );
extern void GLAPIENTRY
_mesa_LockArraysEXT(GLint first, GLsizei count);
extern void GLAPIENTRY
_mesa_UnlockArraysEXT( void );
extern void
_mesa_init_varray( GLcontext * ctx );