diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/main/api_validate.c | 14 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 3 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 10 |
3 files changed, 27 insertions, 0 deletions
diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c index a49018953ae..d0b3ae7342e 100644 --- a/src/mesa/main/api_validate.c +++ b/src/mesa/main/api_validate.c @@ -710,6 +710,20 @@ valid_draw_indirect(struct gl_context *ctx, return GL_FALSE; } + /* From OpenGL ES 3.1 spec. section 10.5: + * "An INVALID_OPERATION error is generated if zero is bound to + * VERTEX_ARRAY_BINDING, DRAW_INDIRECT_BUFFER or to any enabled + * vertex array." + * + * Here we check that for each enabled vertex array we have a vertex + * buffer bound. + */ + if (_mesa_is_gles31(ctx) && + ctx->Array.VAO->_Enabled != ctx->Array.VAO->VertexAttribBufferMask) { + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(No VBO bound)", name); + return GL_FALSE; + } + if (!_mesa_valid_prim_mode(ctx, mode, name)) return GL_FALSE; diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index d425571ba1e..242efe8b548 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -1419,6 +1419,9 @@ struct gl_vertex_array_object /** Vertex buffer bindings */ struct gl_vertex_buffer_binding VertexBinding[VERT_ATTRIB_MAX]; + /** Mask indicating which vertex arrays have vertex buffer associated. */ + GLbitfield64 VertexAttribBufferMask; + /** Mask of VERT_BIT_* values indicating which arrays are enabled */ GLbitfield64 _Enabled; diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 8836c182a41..58f376b8af3 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -135,6 +135,11 @@ vertex_attrib_binding(struct gl_context *ctx, { struct gl_vertex_attrib_array *array = &vao->VertexAttrib[attribIndex]; + if (!_mesa_is_bufferobj(vao->VertexBinding[bindingIndex].BufferObj)) + vao->VertexAttribBufferMask &= ~VERT_BIT(attribIndex); + else + vao->VertexAttribBufferMask |= VERT_BIT(attribIndex); + if (array->VertexBinding != bindingIndex) { const GLbitfield64 array_bit = VERT_BIT(attribIndex); @@ -174,6 +179,11 @@ _mesa_bind_vertex_buffer(struct gl_context *ctx, binding->Offset = offset; binding->Stride = stride; + if (!_mesa_is_bufferobj(vbo)) + vao->VertexAttribBufferMask &= ~binding->_BoundArrays; + else + vao->VertexAttribBufferMask |= binding->_BoundArrays; + vao->NewArrays |= binding->_BoundArrays; } } |