Module: Mesa Branch: 9.1 Commit: 81f0b980d00cd960c9e29d354333cb791cb54abd URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=81f0b980d00cd960c9e29d354333cb791cb54abd
Author: Brian Paul <[email protected]> Date: Mon Jul 15 10:23:49 2013 -0600 mesa: handle 2D texture arrays in get_tex_rgba_compressed() If we call glGetTexImage() for a compressed 2D texture array we need to loop over all the slices. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=66850 NOTE: This is a candidate for the 9.x branches. Cc: [email protected] Reviewed-by: José Fonseca <[email protected]> (cherry picked from commit 2931bcb0d245c356ea9c467e792fd176790f9cfc) --- src/mesa/main/texgetimage.c | 52 +++++++++++++++++++----------------------- 1 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c index 74b09ef..9c50c99 100644 --- a/src/mesa/main/texgetimage.c +++ b/src/mesa/main/texgetimage.c @@ -234,8 +234,8 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions, const GLuint width = texImage->Width; const GLuint height = texImage->Height; const GLuint depth = texImage->Depth; - GLfloat *tempImage, *srcRow; - GLuint row; + GLfloat *tempImage, *tempSlice, *srcRow; + GLuint row, slice; /* Decompress into temp float buffer, then pack into user buffer */ tempImage = malloc(width * height * depth @@ -245,20 +245,22 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions, return; } - /* Decompress the texture image - results in 'tempImage' */ - { + /* Decompress the texture image slices - results in 'tempImage' */ + for (slice = 0; slice < depth; slice++) { GLubyte *srcMap; GLint srcRowStride; - ctx->Driver.MapTextureImage(ctx, texImage, 0, + tempSlice = tempImage + slice * 4 * width * height; + + ctx->Driver.MapTextureImage(ctx, texImage, slice, 0, 0, width, height, GL_MAP_READ_BIT, &srcMap, &srcRowStride); if (srcMap) { _mesa_decompress_image(texFormat, width, height, - srcMap, srcRowStride, tempImage); + srcMap, srcRowStride, tempSlice); - ctx->Driver.UnmapTextureImage(ctx, texImage, 0); + ctx->Driver.UnmapTextureImage(ctx, texImage, slice); } else { _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGetTexImage"); @@ -295,15 +297,19 @@ get_tex_rgba_compressed(struct gl_context *ctx, GLuint dimensions, rebaseFormat); } - srcRow = tempImage; - for (row = 0; row < height; row++) { - void *dest = _mesa_image_address(dimensions, &ctx->Pack, pixels, - width, height, format, type, - 0, row, 0); - - _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) srcRow, - format, type, dest, &ctx->Pack, transferOps); - srcRow += width * 4; + tempSlice = tempImage; + for (slice = 0; slice < depth; slice++) { + srcRow = tempSlice; + for (row = 0; row < height; row++) { + void *dest = _mesa_image_address(dimensions, &ctx->Pack, pixels, + width, height, format, type, + slice, row, 0); + + _mesa_pack_rgba_span_float(ctx, width, (GLfloat (*)[4]) srcRow, + format, type, dest, &ctx->Pack, transferOps); + srcRow += 4 * width; + } + tempSlice += 4 * width * height; } free(tempImage); @@ -617,18 +623,8 @@ _mesa_get_teximage(struct gl_context *ctx, GLenum format, GLenum type, GLvoid *pixels, struct gl_texture_image *texImage) { - GLuint dimensions; - - switch (texImage->TexObject->Target) { - case GL_TEXTURE_1D: - dimensions = 1; - break; - case GL_TEXTURE_3D: - dimensions = 3; - break; - default: - dimensions = 2; - } + const GLuint dimensions = + _mesa_get_texture_dimensions(texImage->TexObject->Target); /* map dest buffer, if PBO */ if (_mesa_is_bufferobj(ctx->Pack.BufferObj)) { _______________________________________________ mesa-commit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-commit
