[Mesa-dev] [PATCH v2] mesa: Define helper function to get the number of texture layers.
Brian Paul
brianp at vmware.com
Wed Dec 11 10:27:04 PST 2013
On 12/11/2013 11:14 AM, 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.
>
> v2: Fix constness of texobj argument, use assert and return reasonable
> default rather than calling unreachable() in default switch case.
> ---
> src/mesa/main/teximage.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++
> src/mesa/main/teximage.h | 6 ++++
> 2 files changed, 93 insertions(+)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 7ec3e20..cf8def1 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -1089,6 +1089,93 @@ _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:
> + assert(!"Invalid texture target.");
> + return GL_FALSE;
> + }
> +}
> +
> +
> +/**
> + * 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(const struct gl_texture_object *texObj, GLint level)
> +{
> + 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;
> + }
> +
> + 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:
> + assert(!"Invalid texture target.");
> + return 0;
> + }
> +}
> +
> +
> +/**
> * 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..3e7d821 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(const struct gl_texture_object *texObj, GLint level);
> +
> extern GLsizei
> _mesa_get_tex_max_num_levels(GLenum target, GLsizei width, GLsizei height,
> GLsizei depth);
>
Reviewed-by: Brian Paul <brianp at vmware.com>
Thanks!
More information about the mesa-dev
mailing list