/** * Delete a set of array objects. * * \param n Number of array objects to delete. * \param ids Array of \c n array object IDs. */ void GLAPIENTRY _mesa_DeleteVertexArrays(GLsizei n, const GLuint *ids) { GET_CURRENT_CONTEXT(ctx); GLsizei i; if (n < 0) { _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteVertexArray(n)"); return; } for (i = 0; i < n; i++) { struct gl_vertex_array_object *obj = _mesa_lookup_vao(ctx, ids[i]); if ( obj != NULL ) { ASSERT( obj->Name == ids[i] ); /* If the array object is currently bound, the spec says "the binding * for that object reverts to zero and the default vertex array * becomes current." */ if ( obj == ctx->Array.VAO ) { _mesa_BindVertexArray(0); } /* The ID is immediately freed for re-use */ remove_array_object(ctx, obj); /* Unreference the array object. * If refcount hits zero, the object will be deleted. */ _mesa_reference_vao(ctx, &obj, NULL); } } }
/** * Determine if ID is the name of an array object. * * \param id ID of the potential array object. * \return \c GL_TRUE if \c id is the name of a array object, * \c GL_FALSE otherwise. */ GLboolean GLAPIENTRY _mesa_IsVertexArray( GLuint id ) { struct gl_vertex_array_object * obj; GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); if (id == 0) return GL_FALSE; obj = _mesa_lookup_vao(ctx, id); if (obj == NULL) return GL_FALSE; return obj->EverBound; }
static bool brw_fast_clear_init(struct brw_context *brw) { struct brw_fast_clear_state *clear; struct gl_context *ctx = &brw->ctx; if (brw->fast_clear_state) { clear = brw->fast_clear_state; _mesa_BindVertexArray(clear->vao); return true; } brw->fast_clear_state = clear = malloc(sizeof *clear); if (clear == NULL) return false; memset(clear, 0, sizeof *clear); _mesa_GenVertexArrays(1, &clear->vao); _mesa_BindVertexArray(clear->vao); clear->buf_obj = ctx->Driver.NewBufferObject(ctx, 0xDEADBEEF); if (clear->buf_obj == NULL) return false; clear->array_obj = _mesa_lookup_vao(ctx, clear->vao); assert(clear->array_obj != NULL); _mesa_update_array_format(ctx, clear->array_obj, VERT_ATTRIB_GENERIC(0), 2, GL_FLOAT, GL_RGBA, GL_FALSE, GL_FALSE, GL_FALSE, 0, true); _mesa_bind_vertex_buffer(ctx, clear->array_obj, VERT_ATTRIB_GENERIC(0), clear->buf_obj, 0, sizeof(float) * 2); _mesa_enable_vertex_array_attrib(ctx, clear->array_obj, VERT_ATTRIB_GENERIC(0)); return true; }
/** * Helper for _mesa_BindVertexArray() and _mesa_BindVertexArrayAPPLE(). * \param genRequired specifies behavour when id was not generated with * glGenVertexArrays(). */ static void bind_vertex_array(struct gl_context *ctx, GLuint id, GLboolean genRequired) { struct gl_vertex_array_object * const oldObj = ctx->Array.VAO; struct gl_vertex_array_object *newObj = NULL; assert(oldObj != NULL); if ( oldObj->Name == id ) return; /* rebinding the same array object- no change */ /* * Get pointer to new array object (newObj) */ if (id == 0) { /* The spec says there is no array object named 0, but we use * one internally because it simplifies things. */ newObj = ctx->Array.DefaultVAO; } else { /* non-default array object */ newObj = _mesa_lookup_vao(ctx, id); if (!newObj) { if (genRequired) { _mesa_error(ctx, GL_INVALID_OPERATION, "glBindVertexArray(non-gen name)"); return; } /* For APPLE version, generate a new array object now */ newObj = _mesa_new_vao(ctx, id); if (!newObj) { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindVertexArrayAPPLE"); return; } save_array_object(ctx, newObj); } if (!newObj->EverBound) { /* The "Interactions with APPLE_vertex_array_object" section of the * GL_ARB_vertex_array_object spec says: * * "The first bind call, either BindVertexArray or * BindVertexArrayAPPLE, determines the semantic of the object." */ newObj->ARBsemantics = genRequired; newObj->EverBound = GL_TRUE; } } if (ctx->Array.DrawMethod == DRAW_ARRAYS) { /* The _DrawArrays pointer is pointing at the VAO being unbound and * that VAO may be in the process of being deleted. If it's not going * to be deleted, this will have no effect, because the pointer needs * to be updated by the VBO module anyway. * * Before the VBO module can update the pointer, we have to set it * to NULL for drivers not to set up arrays which are not bound, * or to prevent a crash if the VAO being unbound is going to be * deleted. */ ctx->Array._DrawArrays = NULL; ctx->Array.DrawMethod = DRAW_NONE; } ctx->NewState |= _NEW_ARRAY; _mesa_reference_vao(ctx, &ctx->Array.VAO, newObj); }