[Mesa-dev] [PATCH 11/38] main: Major refactor of get_texture_for_framebuffer.

Fredrik Höglund fredrik at kde.org
Tue Apr 28 06:49:36 PDT 2015


On Sunday 12 April 2015, Fredrik Höglund wrote:
> This looks like a very nice cleanup indeed!
> 
> One thing I noticed though is that fbobject.c seems to use two blank
> lines between function definitions, although it's not consistent about it.
> The functions introduced in this patch only have one blank line between
> them.
> 
> Some more comments (mostly nitpicks) below.
> 
> On Wednesday 04 March 2015, Laura Ekstrand wrote:
> > This splits off the (still) rather large chunk that is
> > get_texture_for_framebuffer into lots of smaller functions specialized to
> > service the wide variety of unique needs of *FramebufferTexture* entry points.
> > The result is much cleaner because, rather than having a pile of branches and
> > confusing conditions (like the boolean layered), the uniqueness is baked into
> > the entry points. The entry points know whether or not they are layered or use
> > a textarget.
> > ---
> >  src/mesa/main/fbobject.c | 457 +++++++++++++++++++++++++----------------------
> >  src/mesa/main/fbobject.h |   2 +-
> >  2 files changed, 247 insertions(+), 212 deletions(-)
> > 
> > diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> > index f634aed..4df0b6b 100644
> > --- a/src/mesa/main/fbobject.c
> > +++ b/src/mesa/main/fbobject.c
> > @@ -2415,14 +2415,7 @@ reuse_framebuffer_texture_attachment(struct gl_framebuffer *fb,
> >  
> >  /**
> >   * Common code called by gl*FramebufferTexture*() to retrieve the correct
> > - * texture object pointer and check for associated errors.
> > - *
> > - * \param textarget is the textarget that was passed to the
> > - * glFramebufferTexture...() function, or 0 if the corresponding function
> > - * doesn't have a textarget parameter.
> > - *
> > - * \param layered is true if this function was called from
> > - * gl*FramebufferTexture(), false otherwise.
> > + * texture object pointer.
> >   *
> >   * \param texObj where the pointer to the texture object is returned.  Note
> >   * that a successful call may return texObj = NULL.
> > @@ -2430,20 +2423,12 @@ reuse_framebuffer_texture_attachment(struct gl_framebuffer *fb,
> >   * \return true if no errors, false if errors
> >   */
> >  static bool
> > -get_texture_for_framebuffer(struct gl_context *ctx,
> > -                            GLuint texture, GLenum textarget,
> > -                            GLint level, GLuint zoffset, GLboolean *layered,
> > -                            const char *caller,
> > +get_texture_for_framebuffer(struct gl_context *ctx, GLuint texture,
> > +                            bool layered, const char *caller,
> >                              struct gl_texture_object **texObj)
> >  {
> > -   GLenum maxLevelsTarget;
> > -   GLboolean err = GL_TRUE;
> > -
> >     *texObj = NULL; /* This will get returned if texture = 0. */
> >  
> > -   /* The textarget, level, and zoffset parameters are only validated if
> > -    * texture is non-zero.
> > -    */
> >     if (!texture)
> >        return true;
> >  
> > @@ -2458,27 +2443,40 @@ get_texture_for_framebuffer(struct gl_context *ctx,
> >         * value, while the other commands throw invalid operation (where
> >         * *layered = GL_FALSE).
> >         */
> > -      GLenum no_texobj_err = *layered ? GL_INVALID_VALUE :
> > +      GLenum no_texobj_err = layered ? GL_INVALID_VALUE :
> >                               GL_INVALID_OPERATION;
> >        _mesa_error(ctx, no_texobj_err,
> >                    "%s(non-generated texture %u)", caller, texture);
> >        return false;
> >     }
> >  
> > -   if (textarget == 0) {
> > -      if (*layered) {
> > -         /* We're being called by gl*FramebufferTexture() and textarget
> > -          * is not used.
> > -          */
> > -         switch ((*texObj)->Target) {
> > +   return true;
> > +}
> > +
> > +/**
> > + * Common code called by gl*FramebufferTexture() to verify the texture target
> > + * and decide whether or not the attachment should truly be considered
> > + * layered.
> > + *
> > + * \param layered true if attachment should be considered layered, false if
> > + * not
> > + *
> > + * \return true if no errors, false if errors
> > + */
> > +static bool
> > +check_layered_texture_target(struct gl_context *ctx, GLenum target,
> > +                             const char *caller, bool *layered)
> 
> I don't think layered should be a bool here, because it's stored as a
> GLboolean in gl_renderbuffer_attachment, and can be queried with
> glGetFramebufferAttachmentParameteriv.
> 
> > +{
> > +   *layered = true;
> > +
> > +         switch (target) {
> >           case GL_TEXTURE_3D:
> >           case GL_TEXTURE_1D_ARRAY_EXT:
> >           case GL_TEXTURE_2D_ARRAY_EXT:
> >           case GL_TEXTURE_CUBE_MAP:
> >           case GL_TEXTURE_CUBE_MAP_ARRAY:
> >           case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
> > -            err = false;
> > -            break;
> > +            return true;
> >           case GL_TEXTURE_1D:
> >           case GL_TEXTURE_2D:
> >           case GL_TEXTURE_RECTANGLE:
> > @@ -2486,41 +2484,139 @@ get_texture_for_framebuffer(struct gl_context *ctx,
> >              /* These texture types are valid to pass to
> >               * glFramebufferTexture(), but since they aren't layered, it
> >               * is equivalent to calling glFramebufferTexture{1D,2D}().
> > +             *
> > +             * textarget can remain 0 since CUBE MAP is not valid here.
> 
> This comment is a bit confusing since the function no longer has a
> textarget parameter.  I would also say that it's cube map faces
> that are not valid, since GL_TEXTURE_CUBE_MAP is valid.
> 
> >               */
> > -            err = false;
> >              *layered = false;
> > -            textarget = (*texObj)->Target;
> > -            break;
> > -         default:
> > -            err = true;
> > -            break;
> > +            return true;
> >           }
> > -      } else {
> > +
> > +      _mesa_error(ctx, GL_INVALID_OPERATION,
> > +                  "%s(invalid texture target %s)", caller,
> > +                  _mesa_lookup_enum_by_nr(target));
> > +      return false;
> > +}
> > +
> > +/**
> > + * Common code called by gl*FramebufferTextureLayer() to verify the texture
> > + * target.
> > + *
> > + * \return true if no errors, false if errors
> > + */
> > +static bool
> > +check_texture_target(struct gl_context *ctx, GLenum target,
> > +                     const char *caller)
> > +{
> >           /* We're being called by glFramebufferTextureLayer() and
> >            * textarget is not used.  The only legal texture types for
> >            * that function are 3D and 1D/2D arrays textures.
> >            */
> 
> This comment is not true when ARB_direct_state_access is supported;
> all texture targets that are valid in FrameBufferTexture are now also
> valid in FrameBufferTextureLayer.  See issues 30 and 36 in the
> ARB_direct_state_access specification.

Correction: Only cube map textures should be added to the valid
texture types in FramebufferTextureLayer.

> The code also needs to be updated to reflect that, but that should
> probably be done in a separate patch.
> 
> > -         err = ((*texObj)->Target != GL_TEXTURE_3D) &&
> > -            ((*texObj)->Target != GL_TEXTURE_1D_ARRAY_EXT) &&
> > -            ((*texObj)->Target != GL_TEXTURE_2D_ARRAY_EXT) &&
> > -            ((*texObj)->Target != GL_TEXTURE_CUBE_MAP_ARRAY) &&
> > -            ((*texObj)->Target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY);
> > +         switch (target) {
> > +         case GL_TEXTURE_3D:
> > +         case GL_TEXTURE_1D_ARRAY_EXT:
> > +         case GL_TEXTURE_2D_ARRAY_EXT:
> > +         case GL_TEXTURE_CUBE_MAP_ARRAY:
> > +         case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
> > +            return true;
> > +         }
> 
> I think this is an opportunity to remove the EXT suffixes here.
> 
> > +
> > +      _mesa_error(ctx, GL_INVALID_OPERATION,
> > +                  "%s(invalid texture target %s)", caller,
> > +                  _mesa_lookup_enum_by_nr(target));
> > +      return false;
> > +}
> > +
> > +/**
> > + * Common code called by glFramebufferTexture*D() to verify the texture
> > + * target.
> > + *
> > + * \return true if no errors, false if errors
> > + */
> > +static bool
> > +check_textarget(struct gl_context *ctx, int dims, GLenum target,
> > +                GLenum textarget, const char *caller)
> > +{
> > +   bool err = false;
> > +
> > +   switch (dims) {
> > +   case 1:
> > +      switch (textarget) {
> > +      case GL_TEXTURE_1D:
> > +         break;
> > +      case GL_TEXTURE_1D_ARRAY:
> > +         err = !ctx->Extensions.EXT_texture_array;
> > +         break;
> > +      default:
> > +         err = true;
> >        }
> > +      break;
> > +   case 2:
> > +      switch (textarget) {
> > +      case GL_TEXTURE_2D:
> > +         break;
> > +      case GL_TEXTURE_RECTANGLE:
> > +         err = _mesa_is_gles(ctx)
> > +            || !ctx->Extensions.NV_texture_rectangle;
> > +         break;
> > +      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
> > +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
> > +      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
> > +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
> > +      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
> > +      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
> > +         err = !ctx->Extensions.ARB_texture_cube_map;
> > +         break;
> > +      case GL_TEXTURE_2D_ARRAY:
> > +         err = (_mesa_is_gles(ctx) && ctx->Version < 30)
> > +               || !ctx->Extensions.EXT_texture_array;
> > +         break;
> > +      case GL_TEXTURE_2D_MULTISAMPLE:
> > +      case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
> > +         err = _mesa_is_gles(ctx)
> > +               || !ctx->Extensions.ARB_texture_multisample;
> > +         break;
> > +      default:
> > +         err = true;
> > +      }
> > +      break;
> > +   case 3:
> > +      if (textarget != GL_TEXTURE_3D)
> > +         err = true;
> > +      break;
> > +   default:
> > +      err = true;
> >     }
> > -   else {
> > -      /* Make sure textarget is consistent with the texture's type */
> > -      err = ((*texObj)->Target == GL_TEXTURE_CUBE_MAP)
> > -          ? !_mesa_is_cube_face(textarget)
> > -          : ((*texObj)->Target != textarget);
> > +
> > +   if (err) {
> > +      _mesa_error(ctx, GL_INVALID_OPERATION,
> > +                  "%s(invalid texture target)", caller);
> 
> I think it would be nice if the error message mentioned the value
> of the target.
> 
> > +      return false;
> >     }
> >  
> > +   /* Make sure textarget is consistent with the texture's type */
> > +   err = (target == GL_TEXTURE_CUBE_MAP) ?
> > +          !_mesa_is_cube_face(textarget): (target != textarget);
> > +
> >     if (err) {
> >        _mesa_error(ctx, GL_INVALID_OPERATION,
> > -                  "%s(invalid or mismatched texture target)", caller);
> > +                  "%s(mismatched texture target)", caller);
> >        return false;
> >     }
> >  
> > -   if ((*texObj)->Target == GL_TEXTURE_3D) {
> > +   return true;
> > +}
> > +
> > +/**
> > + * Common code called by gl*FramebufferTextureLayer() and
> > + * glFramebufferTexture3D() to verify the zoffset.
> > + *
> > + * \return true if no errors, false if errors
> > + */
> > +static bool
> > +check_zoffset(struct gl_context *ctx, GLenum target, GLuint zoffset,
> > +              const char *caller)
> > +{
> > +   if (target == GL_TEXTURE_3D) {
> >        const GLuint maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
> >        if (zoffset >= maxSize) {
> >           _mesa_error(ctx, GL_INVALID_VALUE,
> > @@ -2528,10 +2624,10 @@ get_texture_for_framebuffer(struct gl_context *ctx,
> >           return false;
> >        }
> >     }
> > -   else if (((*texObj)->Target == GL_TEXTURE_1D_ARRAY_EXT) ||
> > -            ((*texObj)->Target == GL_TEXTURE_2D_ARRAY_EXT) ||
> > -            ((*texObj)->Target == GL_TEXTURE_CUBE_MAP_ARRAY) ||
> > -            ((*texObj)->Target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)) {
> > +   else if ((target == GL_TEXTURE_1D_ARRAY_EXT) ||
> > +            (target == GL_TEXTURE_2D_ARRAY_EXT) ||
> > +            (target == GL_TEXTURE_CUBE_MAP_ARRAY) ||
> > +            (target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)) {
> 
> The EXT suffixes could be removed here too.
> 
> >        if (zoffset >= ctx->Const.MaxArrayTextureLayers) {
> >           _mesa_error(ctx, GL_INVALID_VALUE,
> >                       "%s(invalid layer %u)", caller, zoffset);
> > @@ -2539,9 +2635,21 @@ get_texture_for_framebuffer(struct gl_context *ctx,
> >        }
> >     }
> >  
> > -   maxLevelsTarget = textarget ? textarget : (*texObj)->Target;
> > +   return true;
> > +}
> > +
> > +/**
> > + * Common code called by all gl*FramebufferTexture*() entry points to verify
> > + * the level.
> > + *
> > + * \return true if no errors, false if errors
> > + */
> > +static bool
> > +check_level(struct gl_context *ctx, GLenum target, GLint level,
> > +            const char *caller)
> > +{
> >     if ((level < 0) ||
> > -       (level >= _mesa_max_texture_levels(ctx, maxLevelsTarget))) {
> > +       (level >= _mesa_max_texture_levels(ctx, target))) {
> >        _mesa_error(ctx, GL_INVALID_VALUE,
> >                    "%s(invalid level %d)", caller, level);
> >        return false;
> > @@ -2554,7 +2662,7 @@ void
> >  _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
> >                            GLenum attachment,
> >                            struct gl_texture_object *texObj, GLenum textarget,
> > -                          GLint level, GLuint zoffset, GLboolean layered,
> > +                          GLint level, GLuint zoffset, bool layered,
> 
> layered should remain a GLboolean here too.
> 
> >                            const char *caller)
> >  {
> >     struct gl_renderbuffer_attachment *att;
> > @@ -2639,127 +2747,58 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
> >  }
> >  
> >  
> > -void GLAPIENTRY
> > -_mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
> > -                           GLenum textarget, GLuint texture, GLint level)
> > +static void
> > +framebuffer_texture_with_dims(int dims, GLenum target,
> > +                              GLenum attachment, GLenum textarget,
> > +                              GLuint texture, GLint level, GLint zoffset,
> > +                              const char *caller)
> >  {
> >     GET_CURRENT_CONTEXT(ctx);
> >     struct gl_framebuffer *fb;
> >     struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_FALSE;
> > -
> > -   if (texture != 0) {
> > -      GLboolean error;
> > -
> > -      switch (textarget) {
> > -      case GL_TEXTURE_1D:
> > -         error = GL_FALSE;
> > -         break;
> > -      case GL_TEXTURE_1D_ARRAY:
> > -         error = !ctx->Extensions.EXT_texture_array;
> > -         break;
> > -      default:
> > -         error = GL_TRUE;
> > -      }
> > -
> > -      if (error) {
> > -         _mesa_error(ctx, GL_INVALID_OPERATION,
> > -                     "glFramebufferTexture1D(invalid texture target %s)",
> > -                     _mesa_lookup_enum_by_nr(textarget));
> > -         return;
> > -      }
> > -   }
> >  
> >     /* Get the framebuffer object */
> >     fb = get_framebuffer_target(ctx, target);
> >     if (!fb) {
> > -      _mesa_error(ctx, GL_INVALID_ENUM,
> > -                  "glFramebufferTexture1D(invalid target %s)",
> > +      _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid target %s)", caller,
> >                    _mesa_lookup_enum_by_nr(target));
> >        return;
> >     }
> >  
> >     /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, textarget, level, 0,
> > -                                    &layered, "glFramebufferTexture1D",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > +   if (!get_texture_for_framebuffer(ctx, texture, false, caller, &texObj))
> >        return;
> > +
> > +   if (texObj) {
> > +      if (!check_textarget(ctx, dims, texObj->Target, textarget, caller))
> > +         return;
> > +
> > +      if ((dims == 3) && !check_zoffset(ctx, texObj->Target, zoffset, caller))
> > +         return;
> > +
> >     }
> 
> There should be an empty line here.
> 
> > +   if (!check_level(ctx, textarget, level, caller))
> > +      return;
> >  
> >     _mesa_framebuffer_texture(ctx, fb, attachment, texObj, textarget, level,
> > -                             0, layered, "glFramebufferTexture1D");
> > +                             zoffset, false, caller);
> >  }
> >  
> > -
> >  void GLAPIENTRY
> > -_mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
> > +_mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
> >                             GLenum textarget, GLuint texture, GLint level)
> >  {
> > -   GET_CURRENT_CONTEXT(ctx);
> > -   struct gl_framebuffer *fb;
> > -   struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_FALSE;
> > -
> > -   if (texture != 0) {
> > -      GLboolean error;
> > -
> > -      switch (textarget) {
> > -      case GL_TEXTURE_2D:
> > -         error = GL_FALSE;
> > -         break;
> > -      case GL_TEXTURE_RECTANGLE:
> > -         error = _mesa_is_gles(ctx)
> > -            || !ctx->Extensions.NV_texture_rectangle;
> > -         break;
> > -      case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
> > -      case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
> > -      case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
> > -      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
> > -      case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
> > -      case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
> > -         error = !ctx->Extensions.ARB_texture_cube_map;
> > -         break;
> > -      case GL_TEXTURE_2D_ARRAY:
> > -         error = (_mesa_is_gles(ctx) && ctx->Version < 30)
> > -            || !ctx->Extensions.EXT_texture_array;
> > -         break;
> > -      case GL_TEXTURE_2D_MULTISAMPLE:
> > -      case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
> > -         error = _mesa_is_gles(ctx)
> > -            || !ctx->Extensions.ARB_texture_multisample;
> > -         break;
> > -      default:
> > -         error = GL_TRUE;
> > -      }
> > -
> > -      if (error) {
> > -         _mesa_error(ctx, GL_INVALID_OPERATION,
> > -                     "glFramebufferTexture2D(invalid texture target %s)",
> > -                     _mesa_lookup_enum_by_nr(textarget));
> > -         return;
> > -      }
> > -   }
> > +   framebuffer_texture_with_dims(1, target, attachment, textarget, texture,
> > +                                 level, 0, "glFramebufferTexture1D");
> > +}
> >  
> > -   /* Get the framebuffer object */
> > -   fb = get_framebuffer_target(ctx, target);
> > -   if (!fb) {
> > -      _mesa_error(ctx, GL_INVALID_ENUM,
> > -                  "glFramebufferTexture2D(invalid target %s)",
> > -                  _mesa_lookup_enum_by_nr(target));
> > -      return;
> > -   }
> >  
> > -   /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, textarget, level, 0,
> > -                                    &layered, "glFramebufferTexture2D",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > -      return;
> > -   }
> > -
> > -   _mesa_framebuffer_texture(ctx, fb, attachment, texObj, textarget, level,
> > -                             0, layered, "glFramebufferTexture2D");
> > +void GLAPIENTRY
> > +_mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
> > +                           GLenum textarget, GLuint texture, GLint level)
> > +{
> > +   framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
> > +                                 level, 0, "glFramebufferTexture2D");
> >  }
> >  
> >  
> > @@ -2768,37 +2807,8 @@ _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
> >                             GLenum textarget, GLuint texture,
> >                             GLint level, GLint zoffset)
> >  {
> > -   GET_CURRENT_CONTEXT(ctx);
> > -   struct gl_framebuffer *fb;
> > -   struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_FALSE;
> > -
> > -   if ((texture != 0) && (textarget != GL_TEXTURE_3D)) {
> > -      _mesa_error(ctx, GL_INVALID_OPERATION,
> > -                  "glFramebufferTexture3D(invalid texture target %s)",
> > -                  _mesa_lookup_enum_by_nr(textarget));
> > -      return;
> > -   }
> > -
> > -   /* Get the framebuffer object */
> > -   fb = get_framebuffer_target(ctx, target);
> > -   if (!fb) {
> > -      _mesa_error(ctx, GL_INVALID_ENUM,
> > -                  "glFramebufferTexture3D(invalid target %s)",
> > -                  _mesa_lookup_enum_by_nr(target));
> > -      return;
> > -   }
> > -
> > -   /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, textarget, level, zoffset,
> > -                                    &layered, "glFramebufferTexture3D",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > -      return;
> > -   }
> > -
> > -   _mesa_framebuffer_texture(ctx, fb, attachment, texObj, textarget, level,
> > -                             zoffset, layered, "glFramebufferTexture3D");
> > +   framebuffer_texture_with_dims(3, target, attachment, textarget, texture,
> > +                                 level, zoffset, "glFramebufferTexture3D");
> >  }
> >  
> >  
> > @@ -2809,7 +2819,8 @@ _mesa_FramebufferTextureLayer(GLenum target, GLenum attachment,
> >     GET_CURRENT_CONTEXT(ctx);
> >     struct gl_framebuffer *fb;
> >     struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_FALSE;
> > +
> > +   const char *func = "glFramebufferTextureLayer";
> >  
> >     /* Get the framebuffer object */
> >     fb = get_framebuffer_target(ctx, target);
> > @@ -2821,15 +2832,22 @@ _mesa_FramebufferTextureLayer(GLenum target, GLenum attachment,
> >     }
> >  
> >     /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, 0, level, layer,
> > -                                    &layered, "glFramebufferTextureLayer",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > +   if (!get_texture_for_framebuffer(ctx, texture, false, func, &texObj))
> >        return;
> > +
> > +   if (texObj) {
> > +      if (!check_texture_target(ctx, texObj->Target, func))
> > +         return;
> > +
> > +      if (!check_zoffset(ctx, texObj->Target, layer, func))
> > +         return;
> > +
> > +      if (!check_level(ctx, texObj->Target, level, func))
> > +         return;
> >     }
> >  
> >     _mesa_framebuffer_texture(ctx, fb, attachment, texObj, 0, level,
> > -                             layer, layered, "glFramebufferTextureLayer");
> > +                             layer, false, func);
> >  }
> >  
> >  void GLAPIENTRY
> > @@ -2839,26 +2857,31 @@ _mesa_NamedFramebufferTextureLayer(GLuint framebuffer, GLenum attachment,
> >     GET_CURRENT_CONTEXT(ctx);
> >     struct gl_framebuffer *fb;
> >     struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_FALSE;
> > +
> > +   const char *func = "glNamedFramebufferTextureLayer";
> >  
> >     /* Get the framebuffer object */
> > -   fb = _mesa_lookup_framebuffer_err(ctx, framebuffer,
> > -                                     "glNamedFramebufferTextureLayer");
> > +   fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, func);
> >     if (!fb)
> >        return;
> >  
> >     /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, 0, level, layer,
> > -                                    &layered,
> > -                                    "glNamedFramebufferTextureLayer",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > +   if (!get_texture_for_framebuffer(ctx, texture, false, func, &texObj))
> >        return;
> > +
> > +   if (texObj) {
> > +      if (!check_texture_target(ctx, texObj->Target, func))
> > +         return;
> > +
> > +      if (!check_zoffset(ctx, texObj->Target, layer, func))
> > +         return;
> > +
> > +      if (!check_level(ctx, texObj->Target, level, func))
> > +         return;
> >     }
> >  
> >     _mesa_framebuffer_texture(ctx, fb, attachment, texObj, 0, level,
> > -                             layer, layered,
> > -                             "glNamedFramebufferTextureLayer");
> > +                             layer, false, func);
> >  }
> >  
> >  
> > @@ -2869,7 +2892,9 @@ _mesa_FramebufferTexture(GLenum target, GLenum attachment,
> >     GET_CURRENT_CONTEXT(ctx);
> >     struct gl_framebuffer *fb;
> >     struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_TRUE;
> > +   bool layered;
> > +
> > +   const char *func = "FramebufferTexture";
> >  
> >     if (!_mesa_has_geometry_shaders(ctx)) {
> >        _mesa_error(ctx, GL_INVALID_OPERATION,
> > @@ -2887,15 +2912,19 @@ _mesa_FramebufferTexture(GLenum target, GLenum attachment,
> >     }
> >  
> >     /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, 0, level, 0,
> > -                                    &layered, "glFramebufferTexture",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > +   if (!get_texture_for_framebuffer(ctx, texture, true, func, &texObj))
> >        return;
> > +
> > +   if (texObj) {
> > +      if (!check_layered_texture_target(ctx, texObj->Target, func, &layered))
> > +         return;
> > +
> > +      if (!check_level(ctx, texObj->Target, level, func))
> > +         return;
> >     }
> >  
> >     _mesa_framebuffer_texture(ctx, fb, attachment, texObj, 0, level,
> > -                             0, layered, "glFramebufferTexture");
> > +                             0, layered, func);
> >  }
> >  
> >  void GLAPIENTRY
> > @@ -2905,7 +2934,9 @@ _mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment,
> >     GET_CURRENT_CONTEXT(ctx);
> >     struct gl_framebuffer *fb;
> >     struct gl_texture_object *texObj;
> > -   GLboolean layered = GL_TRUE;
> > +   bool layered;
> > +
> > +   const char *func = "glNamedFramebufferTexture";
> >  
> >     if (!_mesa_has_geometry_shaders(ctx)) {
> >        _mesa_error(ctx, GL_INVALID_OPERATION,
> > @@ -2914,21 +2945,25 @@ _mesa_NamedFramebufferTexture(GLuint framebuffer, GLenum attachment,
> >     }
> >  
> >     /* Get the framebuffer object */
> > -   fb = _mesa_lookup_framebuffer_err(ctx, framebuffer,
> > -                                     "glNamedFramebufferTexture");
> > +   fb = _mesa_lookup_framebuffer_err(ctx, framebuffer, func);
> >     if (!fb)
> >        return;
> >  
> >     /* Get the texture object */
> > -   if (!get_texture_for_framebuffer(ctx, texture, 0, level, 0,
> > -                                    &layered, "glNamedFramebufferTexture",
> > -                                    &texObj)) {
> > -      /* Error already recorded */
> > +   if (!get_texture_for_framebuffer(ctx, texture, true, func, &texObj))
> >        return;
> > +
> > +   if (texObj) {
> > +      if (!check_layered_texture_target(ctx, texObj->Target, func,
> > +                                        &layered))
> > +         return;
> > +
> > +      if (!check_level(ctx, texObj->Target, level, func))
> > +         return;
> >     }
> >  
> >     _mesa_framebuffer_texture(ctx, fb, attachment, texObj, 0, level,
> > -                             0, layered, "glNamedFramebufferTexture");
> > +                             0, layered, func);
> >  }
> >  
> >  
> > diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
> > index 7487f02..96d39a7 100644
> > --- a/src/mesa/main/fbobject.h
> > +++ b/src/mesa/main/fbobject.h
> > @@ -119,7 +119,7 @@ extern void
> >  _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
> >                            GLenum attachment,
> >                            struct gl_texture_object *texObj, GLenum textarget,
> > -                          GLint level, GLuint zoffset, GLboolean layered,
> > +                          GLint level, GLuint zoffset, bool layered,
> >                            const char *caller);
> >  
> >  
> > 
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 



More information about the mesa-dev mailing list