[Mesa-dev] [PATCH 1/2] mesa: Fix texture target validation for glFramebufferTexture()

Ian Romanick idr at freedesktop.org
Wed Nov 20 11:13:31 PST 2013


On 11/19/2013 11:02 PM, Paul Berry wrote:
> Previously we were using the code path for validating
> glFramebufferTextureLayer().  But glFramebufferTexture() allows
> additional texture types.
> 
> Fixes piglit tests:
> - spec/!OpenGL 3.2/layered-rendering/gl-layer-cube-map
> - spec/!OpenGL 3.2/layered-rendering/framebuffertexture
> 
> Cc: "10.0" <mesa-stable at lists.freedesktop.org>
> ---
>  src/mesa/main/fbobject.c | 50 ++++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 40 insertions(+), 10 deletions(-)
> 
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index 9dd7161..2feb4c3 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -2334,16 +2334,46 @@ framebuffer_texture(struct gl_context *ctx, const char *caller, GLenum target,

As an aside, it's confusing, but correct, that layered is set to true by
a caller without Layer in the name.

>        texObj = _mesa_lookup_texture(ctx, texture);
>        if (texObj != NULL) {
>           if (textarget == 0) {
> -            /* If textarget == 0 it means 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.
> -             */

So this comment was just wrong?  What does textarget == 0 mean?

> -            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);
> +            if (layered) {
> +               /* We're being called by glFramebufferTexture() and textarget
> +                * is not used.
> +                */
> +               switch (texObj->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;
> +               case GL_TEXTURE_1D:
> +               case GL_TEXTURE_2D:
> +               case GL_TEXTURE_RECTANGLE:
> +               case GL_TEXTURE_2D_MULTISAMPLE:
> +                  /* These texture types are valid to pass to
> +                   * glFramebufferTexture(), but since they aren't layered, it
> +                   * is equivalent to calling glFramebufferTexture{1D,2D}().
> +                   */
> +                  err = false;

If this is changed to

    err = !layered;

then...

> +                  layered = false;
> +                  textarget = texObj->Target;
> +                  break;
> +               default:
> +                  err = true;
> +                  break;
> +               }
> +            } else {
> +               /* 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.
> +                */
> +               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);

I think this could be handled by the switch-statement above.

If that happens, I'd also recommend dropping _EXT from some of the case
labels.

> +            }
>           }
>           else {
>              /* Make sure textarget is consistent with the texture's type */
> 



More information about the mesa-dev mailing list