[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