mesa: Define helper function to get the number of texture layers.

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.

Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Francisco Jerez 2013-12-07 23:35:04 +01:00
parent bfcf78c110
commit d9b0b4e960
2 changed files with 93 additions and 0 deletions

View file

@ -1087,6 +1087,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.

View file

@ -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);