[Mesa-dev] [PATCH 1/3] mesa: handle 2D texture arrays in get_tex_rgba_compressed()

Brian Paul brianp at vmware.com
Wed Jul 17 08:00:59 PDT 2013


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.1 branch.
---
 src/mesa/main/texgetimage.c |   52 ++++++++++++++++++++-----------------------
 1 file changed, 24 insertions(+), 28 deletions(-)

diff --git a/src/mesa/main/texgetimage.c b/src/mesa/main/texgetimage.c
index 4c672e3..7050f10 100644
--- a/src/mesa/main/texgetimage.c
+++ b/src/mesa/main/texgetimage.c
@@ -233,8 +233,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
@@ -244,20 +244,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");
@@ -294,15 +296,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);
@@ -616,18 +622,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)) {
-- 
1.7.10.4



More information about the mesa-dev mailing list