mesa: code movement in teximage.c

To get rid of a forward declaration.
This commit is contained in:
Brian Paul 2012-08-21 20:22:27 -06:00
parent bdff1dfb39
commit fe2cc65fbb
1 changed files with 198 additions and 204 deletions

View File

@ -1633,6 +1633,29 @@ _mesa_es_error_check_format_and_type(GLenum format, GLenum type,
/**
* Return expected size of a compressed texture.
*/
static GLuint
compressed_tex_size(GLsizei width, GLsizei height, GLsizei depth,
GLenum glformat)
{
gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
return _mesa_format_image_size(mesaFormat, width, height, depth);
}
/*
* Return compressed texture block size, in pixels.
*/
static void
get_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh)
{
gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
_mesa_get_format_block_size(mesaFormat, bw, bh);
}
/** /**
* Special value returned by error some texture error checking functions when * Special value returned by error some texture error checking functions when
* an error is detected and the proxy texture image's width/height/depth/format * an error is detected and the proxy texture image's width/height/depth/format
@ -1889,12 +1912,186 @@ texture_error_check( struct gl_context *ctx,
} }
/**
* Error checking for glCompressedTexImage[123]D().
* \param reason returns reason for error, if any
* \return error code or GL_NO_ERROR or PROXY_ERROR.
*/
static GLenum static GLenum
compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
GLenum target, GLint level, GLenum target, GLint level,
GLenum internalFormat, GLsizei width, GLenum internalFormat, GLsizei width,
GLsizei height, GLsizei depth, GLint border, GLsizei height, GLsizei depth, GLint border,
GLsizei imageSize); GLsizei imageSize)
{
const GLenum proxyTarget = get_proxy_target(target);
const GLint maxLevels = _mesa_max_texture_levels(ctx, target);
GLint expectedSize;
GLenum choose_format;
GLenum choose_type;
GLenum proxy_format;
GLenum error = GL_NO_ERROR;
char *reason = ""; /* no error */
if (!target_can_be_compressed(ctx, target, internalFormat)) {
reason = "target";
error = GL_INVALID_ENUM;
goto error;
}
/* This will detect any invalid internalFormat value */
if (!_mesa_is_compressed_format(ctx, internalFormat)) {
reason = "internalFormat";
error = GL_INVALID_ENUM;
goto error;
}
switch (internalFormat) {
#if FEATURE_ES
case GL_PALETTE4_RGB8_OES:
case GL_PALETTE4_RGBA8_OES:
case GL_PALETTE4_R5_G6_B5_OES:
case GL_PALETTE4_RGBA4_OES:
case GL_PALETTE4_RGB5_A1_OES:
case GL_PALETTE8_RGB8_OES:
case GL_PALETTE8_RGBA8_OES:
case GL_PALETTE8_R5_G6_B5_OES:
case GL_PALETTE8_RGBA4_OES:
case GL_PALETTE8_RGB5_A1_OES:
_mesa_cpal_compressed_format_type(internalFormat, &choose_format,
&choose_type);
proxy_format = choose_format;
/* check level (note that level should be zero or less!) */
if (level > 0 || level < -maxLevels) {
reason = "level";
error = GL_INVALID_VALUE;
goto error;
}
if (dimensions != 2) {
reason = "compressed paletted textures must be 2D";
error = GL_INVALID_OPERATION;
goto error;
}
/* Figure out the expected texture size (in bytes). This will be
* checked against the actual size later.
*/
expectedSize = _mesa_cpal_compressed_size(level, internalFormat,
width, height);
/* This is for the benefit of the TestProxyTexImage below. It expects
* level to be non-negative. OES_compressed_paletted_texture uses a
* weird mechanism where the level specified to glCompressedTexImage2D
* is -(n-1) number of levels in the texture, and the data specifies the
* complete mipmap stack. This is done to ensure the palette is the
* same for all levels.
*/
level = -level;
break;
#endif
default:
choose_format = GL_NONE;
choose_type = GL_NONE;
proxy_format = internalFormat;
/* check level */
if (level < 0 || level >= maxLevels) {
reason = "level";
error = GL_INVALID_VALUE;
goto error;
}
/* Figure out the expected texture size (in bytes). This will be
* checked against the actual size later.
*/
expectedSize = compressed_tex_size(width, height, depth, internalFormat);
break;
}
/* This should really never fail */
if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
reason = "internalFormat";
error = GL_INVALID_ENUM;
goto error;
}
/* No compressed formats support borders at this time */
if (border != 0) {
reason = "border != 0";
error = GL_INVALID_VALUE;
goto error;
}
/* For cube map, width must equal height */
if (_mesa_is_cube_face(target) && width != height) {
reason = "width != height";
error = GL_INVALID_VALUE;
goto error;
}
/* check image size against compression block size */
{
gl_format texFormat =
ctx->Driver.ChooseTextureFormat(ctx, proxy_format,
choose_format, choose_type);
GLuint bw, bh;
_mesa_get_format_block_size(texFormat, &bw, &bh);
if ((width > bw && width % bw > 0) ||
(height > bh && height % bh > 0)) {
/*
* Per GL_ARB_texture_compression: GL_INVALID_OPERATION is
* generated [...] if any parameter combinations are not
* supported by the specific compressed internal format.
*/
reason = "invalid width or height for compression format";
error = GL_INVALID_OPERATION;
goto error;
}
}
/* check image sizes */
if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
proxy_format, choose_format,
choose_type,
width, height, depth, border)) {
/* See error comment above */
if (target == proxyTarget) {
return PROXY_ERROR;
}
reason = "invalid width, height or format";
error = GL_INVALID_OPERATION;
goto error;
}
/* check image size in bytes */
if (expectedSize != imageSize) {
/* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...]
* if <imageSize> is not consistent with the format, dimensions, and
* contents of the specified image.
*/
reason = "imageSize inconsistant with width/height/format";
error = GL_INVALID_VALUE;
goto error;
}
if (!mutable_tex_object(ctx, target)) {
reason = "immutable texture";
error = GL_INVALID_OPERATION;
goto error;
}
return GL_NO_ERROR;
error:
_mesa_error(ctx, error, "glCompressedTexImage%dD(%s)", dimensions, reason);
return error;
}
/** /**
* Test glTexSubImage[123]D() parameters for errors. * Test glTexSubImage[123]D() parameters for errors.
@ -3325,209 +3522,6 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,
/**********************************************************************/ /**********************************************************************/
/**
* Return expected size of a compressed texture.
*/
static GLuint
compressed_tex_size(GLsizei width, GLsizei height, GLsizei depth,
GLenum glformat)
{
gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
return _mesa_format_image_size(mesaFormat, width, height, depth);
}
/*
* Return compressed texture block size, in pixels.
*/
static void
get_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh)
{
gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat);
_mesa_get_format_block_size(mesaFormat, bw, bh);
}
/**
* Error checking for glCompressedTexImage[123]D().
* \param reason returns reason for error, if any
* \return error code or GL_NO_ERROR or PROXY_ERROR.
*/
static GLenum
compressed_texture_error_check(struct gl_context *ctx, GLint dimensions,
GLenum target, GLint level,
GLenum internalFormat, GLsizei width,
GLsizei height, GLsizei depth, GLint border,
GLsizei imageSize)
{
const GLenum proxyTarget = get_proxy_target(target);
const GLint maxLevels = _mesa_max_texture_levels(ctx, target);
GLint expectedSize;
GLenum choose_format;
GLenum choose_type;
GLenum proxy_format;
GLenum error = GL_NO_ERROR;
char *reason = ""; /* no error */
if (!target_can_be_compressed(ctx, target, internalFormat)) {
reason = "target";
error = GL_INVALID_ENUM;
goto error;
}
/* This will detect any invalid internalFormat value */
if (!_mesa_is_compressed_format(ctx, internalFormat)) {
reason = "internalFormat";
error = GL_INVALID_ENUM;
goto error;
}
switch (internalFormat) {
#if FEATURE_ES
case GL_PALETTE4_RGB8_OES:
case GL_PALETTE4_RGBA8_OES:
case GL_PALETTE4_R5_G6_B5_OES:
case GL_PALETTE4_RGBA4_OES:
case GL_PALETTE4_RGB5_A1_OES:
case GL_PALETTE8_RGB8_OES:
case GL_PALETTE8_RGBA8_OES:
case GL_PALETTE8_R5_G6_B5_OES:
case GL_PALETTE8_RGBA4_OES:
case GL_PALETTE8_RGB5_A1_OES:
_mesa_cpal_compressed_format_type(internalFormat, &choose_format,
&choose_type);
proxy_format = choose_format;
/* check level (note that level should be zero or less!) */
if (level > 0 || level < -maxLevels) {
reason = "level";
error = GL_INVALID_VALUE;
goto error;
}
if (dimensions != 2) {
reason = "compressed paletted textures must be 2D";
error = GL_INVALID_OPERATION;
goto error;
}
/* Figure out the expected texture size (in bytes). This will be
* checked against the actual size later.
*/
expectedSize = _mesa_cpal_compressed_size(level, internalFormat,
width, height);
/* This is for the benefit of the TestProxyTexImage below. It expects
* level to be non-negative. OES_compressed_paletted_texture uses a
* weird mechanism where the level specified to glCompressedTexImage2D
* is -(n-1) number of levels in the texture, and the data specifies the
* complete mipmap stack. This is done to ensure the palette is the
* same for all levels.
*/
level = -level;
break;
#endif
default:
choose_format = GL_NONE;
choose_type = GL_NONE;
proxy_format = internalFormat;
/* check level */
if (level < 0 || level >= maxLevels) {
reason = "level";
error = GL_INVALID_VALUE;
goto error;
}
/* Figure out the expected texture size (in bytes). This will be
* checked against the actual size later.
*/
expectedSize = compressed_tex_size(width, height, depth, internalFormat);
break;
}
/* This should really never fail */
if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
reason = "internalFormat";
error = GL_INVALID_ENUM;
goto error;
}
/* No compressed formats support borders at this time */
if (border != 0) {
reason = "border != 0";
error = GL_INVALID_VALUE;
goto error;
}
/* For cube map, width must equal height */
if (_mesa_is_cube_face(target) && width != height) {
reason = "width != height";
error = GL_INVALID_VALUE;
goto error;
}
/* check image size against compression block size */
{
gl_format texFormat =
ctx->Driver.ChooseTextureFormat(ctx, proxy_format,
choose_format, choose_type);
GLuint bw, bh;
_mesa_get_format_block_size(texFormat, &bw, &bh);
if ((width > bw && width % bw > 0) ||
(height > bh && height % bh > 0)) {
/*
* Per GL_ARB_texture_compression: GL_INVALID_OPERATION is
* generated [...] if any parameter combinations are not
* supported by the specific compressed internal format.
*/
reason = "invalid width or height for compression format";
error = GL_INVALID_OPERATION;
goto error;
}
}
/* check image sizes */
if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level,
proxy_format, choose_format,
choose_type,
width, height, depth, border)) {
/* See error comment above */
if (target == proxyTarget) {
return PROXY_ERROR;
}
reason = "invalid width, height or format";
error = GL_INVALID_OPERATION;
goto error;
}
/* check image size in bytes */
if (expectedSize != imageSize) {
/* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...]
* if <imageSize> is not consistent with the format, dimensions, and
* contents of the specified image.
*/
reason = "imageSize inconsistant with width/height/format";
error = GL_INVALID_VALUE;
goto error;
}
if (!mutable_tex_object(ctx, target)) {
reason = "immutable texture";
error = GL_INVALID_OPERATION;
goto error;
}
return GL_NO_ERROR;
error:
_mesa_error(ctx, error, "glCompressedTexImage%dD(%s)", dimensions, reason);
return error;
}
/** /**
* Error checking for glCompressedTexSubImage[123]D(). * Error checking for glCompressedTexSubImage[123]D().
* \warning There are some bad assumptions here about the size of compressed * \warning There are some bad assumptions here about the size of compressed