[Mesa-dev] [PATCH] mesa: Define helper function to get the number of texture layers.

Brian Paul brianp at vmware.com
Mon Dec 9 08:39:41 PST 2013


On 12/07/2013 06:17 PM, Francisco Jerez wrote:
> And to check if it can have layers at all.  This will be used by the
> implementation of ARB_shader_image_load_store.
> ---
>   src/mesa/main/teximage.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++
>   src/mesa/main/teximage.h |  6 ++++
>   2 files changed, 91 insertions(+)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 793c5d3..77697ea 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -1091,6 +1091,91 @@ _mesa_get_texture_dimensions(GLenum target)
>
>
>   /**
> + * Check if a texture target can have more than one layer.
> + */
> +GLboolean
> +_mesa_tex_target_is_layered(GLenum target)
> +{
> +   switch (target) {
> +   case GL_TEXTURE_1D:
> +   case GL_PROXY_TEXTURE_1D:
> +   case GL_TEXTURE_2D:
> +   case GL_PROXY_TEXTURE_2D:
> +   case GL_TEXTURE_RECTANGLE:
> +   case GL_PROXY_TEXTURE_RECTANGLE:
> +   case GL_TEXTURE_2D_MULTISAMPLE:
> +   case GL_PROXY_TEXTURE_2D_MULTISAMPLE:
> +   case GL_TEXTURE_BUFFER:
> +   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:
> +   case GL_TEXTURE_EXTERNAL_OES:
> +      return GL_FALSE;
> +
> +   case GL_TEXTURE_3D:
> +   case GL_PROXY_TEXTURE_3D:
> +   case GL_TEXTURE_CUBE_MAP:
> +   case GL_PROXY_TEXTURE_CUBE_MAP:
> +   case GL_TEXTURE_1D_ARRAY:
> +   case GL_PROXY_TEXTURE_1D_ARRAY:
> +   case GL_TEXTURE_2D_ARRAY:
> +   case GL_PROXY_TEXTURE_2D_ARRAY:
> +   case GL_TEXTURE_CUBE_MAP_ARRAY:
> +   case GL_PROXY_TEXTURE_CUBE_MAP_ARRAY:
> +   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
> +   case GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY:
> +      return GL_TRUE;
> +
> +   default:
> +      unreachable();

I think I'd like to see an assertion or _mesa_problem() call to catch 
unhandled cases if new texture targets are added in the future.


> +   }
> +}
> +
> +
> +/**
> + * Return the number of layers present in the given level of an array,
> + * cubemap or 3D texture.  If the texture is not layered return zero.
> + */
> +GLuint
> +_mesa_get_texture_layers(struct gl_texture_object *texObj, GLint level)

The pointer could be const-qualifed and level could be GLuint.

> +{
> +   assert(level >= 0 && level < MAX_TEXTURE_LEVELS);
> +
> +   switch (texObj->Target) {
> +   case GL_TEXTURE_1D:
> +   case GL_TEXTURE_2D:
> +   case GL_TEXTURE_RECTANGLE:
> +   case GL_TEXTURE_2D_MULTISAMPLE:
> +   case GL_TEXTURE_BUFFER:
> +   case GL_TEXTURE_EXTERNAL_OES:
> +      return 0;
> +
> +   case GL_TEXTURE_CUBE_MAP:
> +      return 6;
> +
> +   case GL_TEXTURE_1D_ARRAY: {
> +      struct gl_texture_image *img = texObj->Image[0][level];
> +      return (img ? img->Height : 0);

parens aren't really needed.

> +   }
> +
> +   case GL_TEXTURE_3D:
> +   case GL_TEXTURE_2D_ARRAY:
> +   case GL_TEXTURE_CUBE_MAP_ARRAY:
> +   case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: {
> +      struct gl_texture_image *img = texObj->Image[0][level];
> +      return (img ? img->Depth : 0);
> +   }
> +
> +   default:
> +      unreachable();

See above.


> +   }
> +}
> +
> +
> +/**
>    * Return the maximum number of mipmap levels for the given target
>    * and the dimensions.
>    * The dimensions are expected not to include the border.
> diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h
> index 792383d..fcee071 100644
> --- a/src/mesa/main/teximage.h
> +++ b/src/mesa/main/teximage.h
> @@ -138,6 +138,12 @@ _mesa_tex_target_to_face(GLenum target);
>   extern GLint
>   _mesa_get_texture_dimensions(GLenum target);
>
> +extern GLboolean
> +_mesa_tex_target_is_layered(GLenum target);
> +
> +extern GLuint
> +_mesa_get_texture_layers(struct gl_texture_object *texObj, GLint level);
> +
>   extern GLsizei
>   _mesa_get_tex_max_num_levels(GLenum target, GLsizei width, GLsizei height,
>                                GLsizei depth);
>



More information about the mesa-dev mailing list