On 13/11/15 16:55, Tapani Pälli wrote: > On 11/13/2015 03:40 PM, Samuel Iglesias Gonsálvez wrote: >> >> On 13/11/15 11:32, Tapani Pälli wrote: >>> Patch adds additional mask for tracking which vertex buffer bindings >>> are set. This array can be directly compared to which vertex arrays >>> are enabled and should match when drawing. >>> >>> Fixes following CTS tests: >>> >>> ES31-CTS.draw_indirect.negative-noVBO-arrays >>> ES31-CTS.draw_indirect.negative-noVBO-elements >>> >>> Signed-off-by: Tapani Pälli <tapani.pa...@intel.com> >>> --- >>> src/mesa/main/api_validate.c | 13 +++++++++++++ >>> src/mesa/main/mtypes.h | 3 +++ >>> src/mesa/main/varray.c | 5 +++++ >>> 3 files changed, 21 insertions(+) >>> >>> diff --git a/src/mesa/main/api_validate.c b/src/mesa/main/api_validate.c >>> index a490189..e82e89a 100644 >>> --- a/src/mesa/main/api_validate.c >>> +++ b/src/mesa/main/api_validate.c >>> @@ -710,6 +710,19 @@ 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 vertex buffer bindings match with enabled >>> + * vertex arrays. >>> + */ >>> + if (ctx->Array.VAO->_Enabled != ctx->Array.VAO->VertexBindingMask) { >>> + _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 4efdf1e..6c6187f 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 binding points are set. */ >>> + GLbitfield64 VertexBindingMask; >>> + >>> /** 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 887d0c0..0a94c5a 100644 >>> --- a/src/mesa/main/varray.c >>> +++ b/src/mesa/main/varray.c >>> @@ -174,6 +174,11 @@ bind_vertex_buffer(struct gl_context *ctx, >>> binding->Offset = offset; >>> binding->Stride = stride; >>> + if (vbo == ctx->Shared->NullBufferObj) >>> + vao->VertexBindingMask &= ~VERT_BIT(index); >>> + else >>> + vao->VertexBindingMask |= VERT_BIT(index); >>> + >> Should't it be VERT_BIT_GENERIC()? > > I used VERT_BIT because that is used when enabling vertex arrays and > this mask should match that one. >
For that reason, I think it is VERT_BIT_GENERIC(). See: http://cgit.freedesktop.org/mesa/mesa/tree/src/mesa/main/varray.c#n759 Or am I missing something? Sam >> Sam >> >>> vao->NewArrays |= binding->_BoundArrays; >>> } >>> } >>> > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev