diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/arrayobj.c | 16 | ||||
-rw-r--r-- | src/mesa/main/attrib.c | 2 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 17 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 2 |
4 files changed, 29 insertions, 8 deletions
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c index 3287745432f..d9ae187bbbd 100644 --- a/src/mesa/main/arrayobj.c +++ b/src/mesa/main/arrayobj.c @@ -372,6 +372,14 @@ bind_vertex_array(struct gl_context *ctx, GLuint id, GLboolean genRequired) _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindVertexArrayAPPLE"); return; } + + /* 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; save_array_object(ctx, newObj); } } @@ -468,8 +476,7 @@ _mesa_DeleteVertexArraysAPPLE(GLsizei n, const GLuint *ids) * \param vboOnly Will arrays have to reside in VBOs? */ static void -gen_vertex_arrays(struct gl_context *ctx, GLsizei n, GLuint *arrays, - GLboolean vboOnly) +gen_vertex_arrays(struct gl_context *ctx, GLsizei n, GLuint *arrays) { GLuint first; GLint i; @@ -496,7 +503,6 @@ gen_vertex_arrays(struct gl_context *ctx, GLsizei n, GLuint *arrays, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenVertexArraysAPPLE"); return; } - obj->VBOonly = vboOnly; save_array_object(ctx, obj); arrays[i] = first + i; } @@ -511,7 +517,7 @@ void GLAPIENTRY _mesa_GenVertexArrays(GLsizei n, GLuint *arrays) { GET_CURRENT_CONTEXT(ctx); - gen_vertex_arrays(ctx, n, arrays, GL_TRUE); + gen_vertex_arrays(ctx, n, arrays); } @@ -523,7 +529,7 @@ void GLAPIENTRY _mesa_GenVertexArraysAPPLE(GLsizei n, GLuint *arrays) { GET_CURRENT_CONTEXT(ctx); - gen_vertex_arrays(ctx, n, arrays, GL_FALSE); + gen_vertex_arrays(ctx, n, arrays); } diff --git a/src/mesa/main/attrib.c b/src/mesa/main/attrib.c index 1c1ee5dde02..1cd1fc46791 100644 --- a/src/mesa/main/attrib.c +++ b/src/mesa/main/attrib.c @@ -1320,7 +1320,7 @@ copy_array_object(struct gl_context *ctx, /* skip RefCount */ /* In theory must be the same anyway, but on recreate make sure it matches */ - dest->VBOonly = src->VBOonly; + dest->ARBsemantics = src->ARBsemantics; for (i = 0; i < Elements(src->VertexAttrib); i++) _mesa_copy_client_array(ctx, &dest->VertexAttrib[i], &src->VertexAttrib[i]); diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 2ff6085966b..e8a9d427043 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1614,7 +1614,22 @@ struct gl_array_object GLint RefCount; _glthread_Mutex Mutex; - GLboolean VBOonly; /**< require all arrays to live in VBOs? */ + + /** + * Does the VAO use ARB semantics or Apple semantics? + * + * There are several ways in which ARB_vertex_array_object and + * APPLE_vertex_array_object VAOs have differing semantics. At the very + * least, + * + * - ARB VAOs require that all array data be sourced from vertex buffer + * objects, but Apple VAOs do not. + * + * - ARB VAOs require that names come from GenVertexArrays. + * + * This flag notes which behavior governs this VAO. + */ + GLboolean ARBsemantics; /** Vertex attribute arrays */ struct gl_client_array VertexAttrib[VERT_ATTRIB_MAX]; diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 9078d116126..77c1d7d9b27 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -194,7 +194,7 @@ update_array(struct gl_context *ctx, return; } - if (ctx->Array.ArrayObj->VBOonly && + if (ctx->Array.ArrayObj->ARBsemantics && !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) { /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs. * Generate GL_INVALID_OPERATION if that's not true. |