[Mesa-dev] [PATCH 2/8] mesa: Refactor internalFormat / target checks to a separate function

Ian Romanick idr at freedesktop.org
Sun Jan 26 19:58:14 PST 2014


On 01/26/2014 09:40 AM, Pohjolainen, Topi wrote:
> On Fri, Jan 24, 2014 at 02:18:20PM -0800, Ian Romanick wrote:
>> From: Ian Romanick <ian.d.romanick at intel.com>
>>
>> We need almost identical code in the glTexStorage path.
>>
>> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
>> ---
>>  src/mesa/main/teximage.c | 110 ++++++++++++++++++++++++++++++-----------------
>>  src/mesa/main/teximage.h |   8 ++++
>>  2 files changed, 78 insertions(+), 40 deletions(-)
>>
>> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
>> index 0ebaeaa..1417582 100644
>> --- a/src/mesa/main/teximage.c
>> +++ b/src/mesa/main/teximage.c
>> @@ -1961,6 +1961,73 @@ compressed_tex_size(GLsizei width, GLsizei height, GLsizei depth,
>>     return _mesa_format_image_size(mesaFormat, width, height, depth);
>>  }
>>  
>> +/**
>> + * Verify that a texture format is valid with a particular target
>> + *
>> + * In particular, textures with base format of \c GL_DEPTH_COMPONENT or
>> + * \c GL_DEPTH_STENCIL are only valid with certiain, context dependent texture
> 
> s/certiain/certain/

Oops.  I'll fix that before pushing.

>> + * targets.
>> + *
>> + * \param ctx             GL context
>> + * \param target          Texture target
>> + * \param internalFormat  Internal format of the texture image
>> + * \param dimensions      Dimensionality at the caller.  This is \b not used
>> + *                        in the validation.  It is only used when logging
>> + *                        error messages.
>> + * \param caller          Base name of the calling function (e.g.,
>> + *                        "glTexImage" or "glTexStorage").
>> + *
>> + * \returns true if the combination is legal, false otherwise.
>> + */
>> +bool
>> +_mesa_legal_texture_base_format_for_target(struct gl_context *ctx,
>> +                                           GLenum target, GLenum internalFormat,
>> +                                           unsigned dimensions,
>> +                                           const char *caller)
>> +{
>> +   if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT
>> +       || _mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_STENCIL) {
>> +      /* Section 3.8.3 (Texture Image Specification) of the OpenGL 3.3 Core
>> +       * Profile spec says:
>> +       *
>> +       *     "Textures with a base internal format of DEPTH_COMPONENT or
>> +       *     DEPTH_STENCIL are supported by texture image specification
>> +       *     commands only if target is TEXTURE_1D, TEXTURE_2D,
>> +       *     TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_RECTANGLE,
>> +       *     TEXTURE_CUBE_MAP, PROXY_TEXTURE_1D, PROXY_TEXTURE_2D,
>> +       *     PROXY_TEXTURE_1D_ARRAY, PROXY_TEXTURE_2D_ARRAY,
>> +       *     PROXY_TEXTURE_RECTANGLE, or PROXY_TEXTURE_CUBE_MAP. Using these
>> +       *     formats in conjunction with any other target will result in an
>> +       *     INVALID_OPERATION error."
>> +       *
>> +       * Cubemaps are only supported with desktop OpenGL version >= 3.0,
>> +       * EXT_gpu_shader4, or, on OpenGL ES 2.0+, OES_depth_texture_cube_map.
>> +       */
>> +      if (target != GL_TEXTURE_1D &&
>> +          target != GL_PROXY_TEXTURE_1D &&
>> +          target != GL_TEXTURE_2D &&
>> +          target != GL_PROXY_TEXTURE_2D &&
>> +          target != GL_TEXTURE_1D_ARRAY &&
>> +          target != GL_PROXY_TEXTURE_1D_ARRAY &&
>> +          target != GL_TEXTURE_2D_ARRAY &&
>> +          target != GL_PROXY_TEXTURE_2D_ARRAY &&
>> +          target != GL_TEXTURE_RECTANGLE_ARB &&
>> +          target != GL_PROXY_TEXTURE_RECTANGLE_ARB &&
>> +         !((_mesa_is_cube_face(target) || target == GL_PROXY_TEXTURE_CUBE_MAP) &&
>> +           (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4
>> +            || (ctx->API == API_OPENGLES2 && ctx->Extensions.OES_depth_texture_cube_map))) &&
>> +          !((target == GL_TEXTURE_CUBE_MAP_ARRAY ||
>> +             target == GL_PROXY_TEXTURE_CUBE_MAP_ARRAY) &&
>> +            ctx->Extensions.ARB_texture_cube_map_array)) {
>> +         _mesa_error(ctx, GL_INVALID_OPERATION,
>> +                     "%s%dD(bad target for depth texture)",
>> +                     caller, dimensions);
>> +         return false;
>> +      }
>> +   }
>> +
>> +   return true;
>> +}
>>  
>>  /**
>>   * Test the glTexImage[123]D() parameters for errors.
>> @@ -2131,46 +2198,9 @@ texture_error_check( struct gl_context *ctx,
>>     }
>>  
>>     /* additional checks for depth textures */
>> -   if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT
>> -       || _mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_STENCIL) {
>> -      /* Section 3.8.3 (Texture Image Specification) of the OpenGL 3.3 Core
>> -       * Profile spec says:
>> -       *
>> -       *     "Textures with a base internal format of DEPTH_COMPONENT or
>> -       *     DEPTH_STENCIL are supported by texture image specification
>> -       *     commands only if target is TEXTURE_1D, TEXTURE_2D,
>> -       *     TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_RECTANGLE,
>> -       *     TEXTURE_CUBE_MAP, PROXY_TEXTURE_1D, PROXY_TEXTURE_2D,
>> -       *     PROXY_TEXTURE_1D_ARRAY, PROXY_TEXTURE_2D_ARRAY,
>> -       *     PROXY_TEXTURE_RECTANGLE, or PROXY_TEXTURE_CUBE_MAP. Using these
>> -       *     formats in conjunction with any other target will result in an
>> -       *     INVALID_OPERATION error."
>> -       *
>> -       * Cubemaps are only supported with desktop OpenGL version >= 3.0,
>> -       * EXT_gpu_shader4, or, on OpenGL ES 2.0+, OES_depth_texture_cube_map.
>> -       */
>> -      if (target != GL_TEXTURE_1D &&
>> -          target != GL_PROXY_TEXTURE_1D &&
>> -          target != GL_TEXTURE_2D &&
>> -          target != GL_PROXY_TEXTURE_2D &&
>> -          target != GL_TEXTURE_1D_ARRAY &&
>> -          target != GL_PROXY_TEXTURE_1D_ARRAY &&
>> -          target != GL_TEXTURE_2D_ARRAY &&
>> -          target != GL_PROXY_TEXTURE_2D_ARRAY &&
>> -          target != GL_TEXTURE_RECTANGLE_ARB &&
>> -          target != GL_PROXY_TEXTURE_RECTANGLE_ARB &&
>> -         !((_mesa_is_cube_face(target) || target == GL_PROXY_TEXTURE_CUBE_MAP) &&
>> -           (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4
>> -            || (ctx->API == API_OPENGLES2 && ctx->Extensions.OES_depth_texture_cube_map))) &&
>> -          !((target == GL_TEXTURE_CUBE_MAP_ARRAY ||
>> -             target == GL_PROXY_TEXTURE_CUBE_MAP_ARRAY) &&
>> -            ctx->Extensions.ARB_texture_cube_map_array)) {
>> -         _mesa_error(ctx, GL_INVALID_OPERATION,
>> -                     "glTexImage%dD(bad target for depth texture)",
>> -                     dimensions);
>> -         return GL_TRUE;
>> -      }
>> -   }
>> +   if (!_mesa_legal_texture_base_format_for_target(ctx, target, internalFormat,
>> +                                                   dimensions, "glTexImage"))
>> +      return GL_TRUE;
>>  
>>     /* additional checks for compressed textures */
>>     if (_mesa_is_compressed_format(ctx, internalFormat)) {
>> diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
>> index 80a0a57..bff6d7f 100644
>> --- a/src/mesa/main/teximage.h
>> +++ b/src/mesa/main/teximage.h
>> @@ -157,6 +157,14 @@ extern gl_format
>>  _mesa_validate_texbuffer_format(const struct gl_context *ctx,
>>                                  GLenum internalFormat);
>>  
>> +
>> +bool
>> +_mesa_legal_texture_base_format_for_target(struct gl_context *ctx,
>> +                                           GLenum target,
>> +                                           GLenum internalFormat,
>> +                                           unsigned dimensions,
>> +                                           const char *caller);
>> +
>>  /**
>>   * Lock a texture for updating.  See also _mesa_lock_context_textures().
>>   */
>> -- 
>> 1.8.1.4
>>
>> _______________________________________________
>> 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