From 2830c2fbeb9601c1760a9fffe45cd04f8c635d25 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fredrik=20H=C3=B6glund?= Date: Mon, 2 Mar 2015 18:24:36 +0100 Subject: [PATCH] mesa: Add _mesa_lookup_vao_err This is a convenience function that generates GL_INVALID_OPERATION when the array object doesn't exist. Reviewed-by: Laura Ekstrand --- src/mesa/main/arrayobj.c | 47 ++++++++++++++++++++++++++++++++++++++++ src/mesa/main/arrayobj.h | 3 +++ 2 files changed, 50 insertions(+) diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index ea56154f1ca..33c6a459539 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -74,6 +74,53 @@ _mesa_lookup_vao(struct gl_context *ctx, GLuint id) } +/** + * Looks up the array object for the given ID. + * + * Unlike _mesa_lookup_vao, this function generates a GL_INVALID_OPERATION + * error if the array object does not exist. It also returns the default + * array object when ctx is a compatibility profile context and id is zero. + */ +struct gl_vertex_array_object * +_mesa_lookup_vao_err(struct gl_context *ctx, GLuint id, const char *caller) +{ + /* The ARB_direct_state_access specification says: + * + * " is [compatibility profile: + * zero, indicating the default vertex array object, or] + * the name of the vertex array object." + */ + if (id == 0) { + if (ctx->API == API_OPENGL_CORE) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(zero is not valid vaobj name in a core profile " + "context)", caller); + return NULL; + } + + return ctx->Array.DefaultVAO; + } else { + struct gl_vertex_array_object *vao = + (struct gl_vertex_array_object *) + _mesa_HashLookup(ctx->Array.Objects, id); + + /* The ARB_direct_state_access specification says: + * + * "An INVALID_OPERATION error is generated if is not + * [compatibility profile: zero or] the name of an existing + * vertex array object." + */ + if (!vao || !vao->EverBound) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(non-existent vaobj=%u)", caller, id); + return NULL; + } + + return vao; + } +} + + /** * For all the vertex binding points in the array object, unbind any pointers * to any buffer objects (VBOs). diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h index ae671e3afcf..1e7436bfc55 100644 --- a/src/mesa/main/arrayobj.h +++ b/src/mesa/main/arrayobj.h @@ -48,6 +48,9 @@ struct gl_context; extern struct gl_vertex_array_object * _mesa_lookup_vao(struct gl_context *ctx, GLuint id); +extern struct gl_vertex_array_object * +_mesa_lookup_vao_err(struct gl_context *ctx, GLuint id, const char *caller); + extern struct gl_vertex_array_object * _mesa_new_vao(struct gl_context *ctx, GLuint name); -- 2.30.2