[Mesa-dev] [PATCH 3/7] mesa: implement glBindTextures()

Fredrik Höglund fredrik at kde.org
Tue Jan 7 00:05:42 PST 2014


On Friday 03 January 2014, Marek Olšák wrote:
> On Fri, Jan 3, 2014 at 2:04 PM, Marek Olšák <maraeo at gmail.com> wrote:
> > On Fri, Jan 3, 2014 at 1:27 AM, Maxence Le Doré
> > <maxence.ledore at gmail.com> wrote:
> >> ---
> >>  src/mesa/main/texobj.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++
> >>  src/mesa/main/texobj.h |  3 +++
> >>  2 files changed, 55 insertions(+)
> >>
> >> diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c
> >> index bddbc50..66e2fb0 100644
> >> --- a/src/mesa/main/texobj.c
> >> +++ b/src/mesa/main/texobj.c
> >> @@ -1686,4 +1686,56 @@ _mesa_InvalidateTexImage(GLuint texture, GLint level)
> >>     return;
> >>  }
> >>
> >> +/** ARB_multi_bind / OpenGL 4.4 */
> >> +
> >> +void GLAPIENTRY
> >> +_mesa_BindTextures(GLuint first, GLsizei count, const GLuint *textures)
> >> +{
> >> +   GET_CURRENT_CONTEXT(ctx);
> >> +   struct GLuint currentTexUnit = 0;
> >> +   int i = 0;
> >> +
> >> +   currentTexUnit = ctx->Texture.CurrentUnit;
> >> +
> >> +   if(first + count > ctx->Const.MaxCombinedTextureImageUnits) {
> >> +      _mesa_error(ctx, GL_INVALID_OPERATION, "glBindTextures(first+count)");
> >> +      return;
> >> +   }
> >> +
> >> +   for(i = 0 ; i < count ; i++) {
> >> +      GLuint texture;
> >> +      struct gl_texture_object *texObj;
> >> +      GLenum texTarget;
> >> +      int j = 0;
> >> +
> >> +      if(textures == NULL)
> >> +        texture = 0;
> >> +      else
> >> +        texture = textures[i];
> >> +
> >> +      _mesa_ActiveTexture(GL_TEXTURE0 + first + i);
> >> +      if(texture != 0) {
> >> +        texObj = _mesa_lookup_texture(ctx, texture);
> >> +        if(texObj) {
> >> +          texTarget = texObj->Target;
> >> +          _mesa_BindTexture(texTarget, texture);
> >> +        }
> >> +        else
> >> +          _mesa_error(ctx, GL_INVALID_OPERATION,
> >> +                      "glBindTextures(textures[%i])", i);
> >
> > This error is set too late. It should be done before changing textures.
> 
> Note that you make the same mistake in the other patches too. Also
> please double-check that none of the _mesa_ functions generate errors.

This is actually not the case with the ARB_multi_bind functions:

    (11) Typically, OpenGL specifies that if an error is generated by a
         command, that command has no effect.  This is somewhat unfortunate
         for multi-bind commands, because it would require a first pass to
         scan the entire list of bound objects for errors and then a second
         pass to actually perform the bindings.  Should we have different
         error semantics?

      RESOLVED:  Yes.  In this specification, when the parameters for one of
      the <count> binding points are invalid, that binding point is not
      updated and an error will be generated.  However, other binding points
      in the same command will be updated if their parameters are valid and no
      other error occurs.

The code is still wrong for a different reason though; when a texture has
has never been bound, it doesn't have a target.  That case needs to be
handled correctly.

Fredrik



More information about the mesa-dev mailing list