<p dir="ltr">You still have to check all enabled vertex attributes. If you don't want to loop, use bitmasks. See u_vbuf.c as an example of how to avoid loops.</p>
<p dir="ltr">Marek</p>
<div class="gmail_quote">On Oct 21, 2015 2:33 PM, "Lofstedt, Marta" <<a href="mailto:marta.lofstedt@intel.com">marta.lofstedt@intel.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">> -----Original Message-----<br>
> From: mesa-dev [mailto:<a href="mailto:mesa-dev-bounces@lists.freedesktop.org">mesa-dev-bounces@lists.freedesktop.org</a>] On<br>
> Behalf Of Tapani Pälli<br>
> Sent: Wednesday, October 21, 2015 1:25 PM<br>
> To: Marek Olšák<br>
> Cc: <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> Subject: Re: [Mesa-dev] [PATCH 2/4] mesa: Draw Indirect is not allowed<br>
> when no vertex array binding exists.<br>
><br>
> On 10/21/2015 01:41 PM, Marek Olšák wrote:<br>
> > On Wed, Oct 21, 2015 at 7:16 AM, Tapani Pälli <<a href="mailto:tapani.palli@intel.com">tapani.palli@intel.com</a>><br>
> wrote:<br>
> >> On 10/20/2015 08:54 PM, Marek Olšák wrote:<br>
> >>> On Tue, Oct 20, 2015 at 4:19 PM, Marta Lofstedt<br>
> >>> <<a href="mailto:marta.lofstedt@linux.intel.com">marta.lofstedt@linux.intel.com</a>> wrote:<br>
> >>>> From: Marta Lofstedt <<a href="mailto:marta.lofstedt@intel.com">marta.lofstedt@intel.com</a>><br>
> >>>><br>
> >>>> OpenGL ES 3.1 spec. section 10.5:<br>
> >>>> "An INVALID_OPERATION error is generated if zero is bound to<br>
> >>>> VERTEX_ARRAY_BINDING, DRAW_INDIRECT_BUFFER or to any enabled<br>
> vertex<br>
> >>>> array."<br>
> >>>><br>
> >>>> Signed-off-by: Marta Lofstedt <<a href="mailto:marta.lofstedt@linux.intel.com">marta.lofstedt@linux.intel.com</a>><br>
> >>>> ---<br>
> >>>>    src/mesa/main/api_validate.c | 14 ++++++++++++++<br>
> >>>>    1 file changed, 14 insertions(+)<br>
> >>>><br>
> >>>> diff --git a/src/mesa/main/api_validate.c<br>
> >>>> b/src/mesa/main/api_validate.c index c5628f5..7062cbd 100644<br>
> >>>> --- a/src/mesa/main/api_validate.c<br>
> >>>> +++ b/src/mesa/main/api_validate.c<br>
> >>>> @@ -711,6 +711,20 @@ valid_draw_indirect(struct gl_context *ctx,<br>
> >>>>          return GL_FALSE;<br>
> >>>>       }<br>
> >>>><br>
> >>>> +   /*<br>
> >>>> +    * OpenGL ES 3.1 spec. section 10.5:<br>
> >>>> +    * "An INVALID_OPERATION error is generated if zero is bound to<br>
> >>>> +    * VERTEX_ARRAY_BINDING, DRAW_INDIRECT_BUFFER or to any<br>
> enabled<br>
> >>>> +    * vertex array."<br>
> >>>> +    * OpenGL 4.5 spec. section 10.4:<br>
> >>>> +    * "An INVALID_OPERATION error is generated if  zero is bound to<br>
> >>>> +    * DRAW_INDIRECT_BUFFER, or if  no element array buffer is bound"<br>
> >>>> +    */<br>
> >>>> +   if (!_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {<br>
> >>>> +      _mesa_error(ctx, GL_INVALID_OPERATION,<br>
> >>>> +                  "%s(No VBO is bound)", name);<br>
> >>>> +   }<br>
> >>> NAK.<br>
> >>><br>
> >>> VERTEX_ARRAY_BINDING is a VAO. Array.ArrayBufferObj is from<br>
> glBindBuffer.<br>
> >><br>
> >> This check is valid, it is not against VERTEX_ARRAY_BINDING. Note<br>
> >> "any enabled vertex array", we hit this weird situation when client<br>
> >> has a VAO bound and has enabled vertex attrib array but has not bound<br>
> any VBO to it.<br>
> > No, it's invalid. The check has absolutely nothing to do with enabled<br>
> > vertex arrays and draw calls. Absolutely nothing. glBindBuffer changes<br>
> > a latched state, which means it doesn't do anything by itself, it only<br>
> > affects other functions that change states. The functions affected by<br>
> > glBindBuffer(GL_ARRAY_BUFFER, ..) are glVertexAttribPointer, etc. not<br>
> > glDraw*. If you called glBindBuffer(GL_ARRAY_BUFFER, ..) right before<br>
> > a Draw call, it wouldn't do anything to vertex arrays and buffers, but<br>
> > it would pass the check.<br>
><br>
> OK my understanding was that reason why this change fixes the bug is that<br>
> ctx->Array.ArrayBufferObj is 0 for the default VAO and never 0 when vertex<br>
> array buffer binding has been set, and this would happen when we would<br>
> have an VBO bound. I will spend some more time to understand this.<br>
<br>
If you have access to the CTS it is these tests that this fixed:<br>
ES31-CTS.draw_indirect.negative-noVBO-arrays<br>
ES31-CTS.draw_indirect.negative-noVBO-elements<br>
<br>
My understanding is as Tapanis above, I was trying to come up with a method<br>
of not needing to loop through the VertexAttribPointers.<br>
Also, I have mis-quoted the spec. I should have only quoted the:<br>
 "or any enabled vertex arrays" and limit to gles 3.1.<br>
<br>
><br>
> > Now, where does this patch check "enabled vertex arrays"? Nowhere. It<br>
> > doesn't check VERTEX_ARRAY_BINDING, it doesn't check<br>
> > DRAW_INDIRECT_BUFFER, and it doesn't check enabled vertex arrays. That<br>
> > whole comment is completely useless there.<br>
> ><br>
> > Sorry if I'm too direct, but you should really think more before<br>
> > making such statements and giving Reviewed-by.<br>
><br>
> // Tapani<br>
><br>
> _______________________________________________<br>
> mesa-dev mailing list<br>
> <a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
> <a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>