summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/teximage.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2012-03-07 08:13:38 -0700
committerBrian Paul <[email protected]>2012-03-07 08:17:20 -0700
commit6c1dea54457c1d19b67794f188c40c74c23ba762 (patch)
tree2cd22758c792aee237be95dc537c15dfd5c980c5 /src/mesa/main/teximage.c
parent4f869e9cb5bdef818110d82668bd46eb6c7b5766 (diff)
mesa: handle array textures in strip_texture_border()
If the texture is a 1D array, don't remove the border pixel from the height. Similarly for 2D array textures and the depth direction. Simplify the function by assuming the border is always one pixel. Reviewed-by: Anuj Phogat <[email protected]>
Diffstat (limited to 'src/mesa/main/teximage.c')
-rw-r--r--src/mesa/main/teximage.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
index c0e5b9bec14..cf0a0cb2a67 100644
--- a/src/mesa/main/teximage.c
+++ b/src/mesa/main/teximage.c
@@ -2421,7 +2421,7 @@ _mesa_choose_texture_format(struct gl_context *ctx,
/**
* Adjust pixel unpack params and image dimensions to strip off the
- * texture border.
+ * one-pixel texture border.
*
* Gallium and intel don't support texture borders. They've seldem been used
* and seldom been implemented correctly anyway.
@@ -2429,34 +2429,37 @@ _mesa_choose_texture_format(struct gl_context *ctx,
* \param unpackNew returns the new pixel unpack parameters
*/
static void
-strip_texture_border(GLint *border,
+strip_texture_border(GLenum target,
GLint *width, GLint *height, GLint *depth,
const struct gl_pixelstore_attrib *unpack,
struct gl_pixelstore_attrib *unpackNew)
{
- assert(*border > 0); /* sanity check */
+ assert(width);
+ assert(height);
+ assert(depth);
*unpackNew = *unpack;
if (unpackNew->RowLength == 0)
unpackNew->RowLength = *width;
- if (depth && unpackNew->ImageHeight == 0)
+ if (unpackNew->ImageHeight == 0)
unpackNew->ImageHeight = *height;
- unpackNew->SkipPixels += *border;
- if (height)
- unpackNew->SkipRows += *border;
- if (depth)
- unpackNew->SkipImages += *border;
-
assert(*width >= 3);
- *width = *width - 2 * *border;
- if (height && *height >= 3)
- *height = *height - 2 * *border;
- if (depth && *depth >= 3)
- *depth = *depth - 2 * *border;
- *border = 0;
+ unpackNew->SkipPixels++; /* skip the border */
+ *width = *width - 2; /* reduce the width by two border pixels */
+
+ /* The min height of a texture with a border is 3 */
+ if (*height >= 3 && target != GL_TEXTURE_1D_ARRAY) {
+ unpackNew->SkipRows++; /* skip the border */
+ *height = *height - 2; /* reduce the height by two border pixels */
+ }
+
+ if (*depth >= 3 && target != GL_TEXTURE_2D_ARRAY) {
+ unpackNew->SkipImages++; /* skip the border */
+ *depth = *depth - 2; /* reduce the depth by two border pixels */
+ }
}
/**
@@ -2541,8 +2544,9 @@ teximage(struct gl_context *ctx, GLuint dims,
* rarely-tested software fallback rendering.
*/
if (border && ctx->Const.StripTextureBorder) {
- strip_texture_border(&border, &width, &height, &depth, unpack,
+ strip_texture_border(target, &width, &height, &depth, unpack,
&unpack_no_border);
+ border = 0;
unpack = &unpack_no_border;
}