mesa: fix issues with texture border and array textures

For a 1D texture array, the border only applies to the width.  For a 2D
texture array the border applies to the width and height but not the depth.
Sucha cases were  not handled correctly in _mesa_init_teximage_fields().

Note: This is a candidate for stable branches

Signed-off-by: Anuj Phogat <anuj.phogat@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
(cherry picked from commit b5c409363c)
This commit is contained in:
Anuj Phogat 2012-02-15 15:40:51 -08:00 committed by Ian Romanick
parent 88cbc43d1f
commit 00a182d66e

View file

@ -1077,11 +1077,13 @@ _mesa_init_teximage_fields(struct gl_context *ctx,
GLint border, GLenum internalFormat,
gl_format format)
{
GLenum target;
ASSERT(img);
ASSERT(width >= 0);
ASSERT(height >= 0);
ASSERT(depth >= 0);
target = img->TexObject->Target;
img->_BaseFormat = _mesa_base_tex_format( ctx, internalFormat );
ASSERT(img->_BaseFormat > 0);
img->InternalFormat = internalFormat;
@ -1093,26 +1095,72 @@ _mesa_init_teximage_fields(struct gl_context *ctx,
img->Width2 = width - 2 * border; /* == 1 << img->WidthLog2; */
img->WidthLog2 = _mesa_logbase2(img->Width2);
if (height == 1) { /* 1-D texture */
img->Height2 = 1;
switch(target) {
case GL_TEXTURE_1D:
case GL_TEXTURE_BUFFER:
case GL_PROXY_TEXTURE_1D:
if (height == 0)
img->Height2 = 0;
else
img->Height2 = 1;
img->HeightLog2 = 0;
}
else {
if (depth == 0)
img->Depth2 = 0;
else
img->Depth2 = 1;
img->DepthLog2 = 0;
break;
case GL_TEXTURE_1D_ARRAY:
case GL_PROXY_TEXTURE_1D_ARRAY:
img->Height2 = height; /* no border */
img->HeightLog2 = 0; /* not used */
if (depth == 0)
img->Depth2 = 0;
else
img->Depth2 = 1;
img->DepthLog2 = 0;
break;
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE:
case GL_TEXTURE_CUBE_MAP:
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:
case GL_PROXY_TEXTURE_2D:
case GL_PROXY_TEXTURE_RECTANGLE:
case GL_PROXY_TEXTURE_CUBE_MAP:
img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
img->HeightLog2 = _mesa_logbase2(img->Height2);
}
if (depth == 1) { /* 2-D texture */
img->Depth2 = 1;
if (depth == 0)
img->Depth2 = 0;
else
img->Depth2 = 1;
img->DepthLog2 = 0;
}
else {
break;
case GL_TEXTURE_2D_ARRAY:
case GL_PROXY_TEXTURE_2D_ARRAY:
img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
img->HeightLog2 = _mesa_logbase2(img->Height2);
img->Depth2 = depth; /* no border */
img->DepthLog2 = 0; /* not used */
break;
case GL_TEXTURE_3D:
case GL_PROXY_TEXTURE_3D:
img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */
img->HeightLog2 = _mesa_logbase2(img->Height2);
img->Depth2 = depth - 2 * border; /* == 1 << img->DepthLog2; */
img->DepthLog2 = _mesa_logbase2(img->Depth2);
break;
default:
_mesa_problem(NULL, "invalid target 0x%x in _mesa_init_teximage_fields()",
target);
}
img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2);
img->TexFormat = format;
}