meta/GetTexSubImage: Account for GL_PACK_SKIP_IMAGES on compressed textures
authorEduardo Lima Mitev <elima@igalia.com>
Mon, 14 Nov 2016 23:25:14 +0000 (15:25 -0800)
committerEduardo Lima Mitev <elima@igalia.com>
Tue, 15 Nov 2016 11:26:13 +0000 (12:26 +0100)
This option was being ignored when packing compressed 3D and cube textures.

Fixes CTS test (on gen8+):
* GL45-CTS.gtf32.GL3Tests.packed_pixels.packed_pixels_pixelstore

v2: Drop API checks.
v3 (Ken): Just apply the existing code in more cases.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/common/meta.c

index 5ab1e6ca285052431cc3ea9f74325e8fda288abd..99c85cff17b314d1ac0ae65dcce001600cd45578 100644 (file)
@@ -3243,8 +3243,20 @@ _mesa_meta_GetTexSubImage(struct gl_context *ctx,
 
       for (slice = 0; slice < depth; slice++) {
          void *dst;
-         if (texImage->TexObject->Target == GL_TEXTURE_2D_ARRAY
-             || texImage->TexObject->Target == GL_TEXTURE_CUBE_MAP_ARRAY) {
+         /* Section 8.11.4 (Texture Image Queries) of the GL 4.5 spec says:
+          *
+          *    "For three-dimensional, two-dimensional array, cube map array,
+          *     and cube map textures pixel storage operations are applied as
+          *     if the image were two-dimensional, except that the additional
+          *     pixel storage state values PACK_IMAGE_HEIGHT and
+          *     PACK_SKIP_IMAGES are applied. The correspondence of texels to
+          *     memory locations is as defined for TexImage3D in section 8.5."
+          */
+         switch (texImage->TexObject->Target) {
+         case GL_TEXTURE_3D:
+         case GL_TEXTURE_2D_ARRAY:
+         case GL_TEXTURE_CUBE_MAP:
+         case GL_TEXTURE_CUBE_MAP_ARRAY: {
             /* Setup pixel packing.  SkipPixels and SkipRows will be applied
              * in the decompress_texture_image() function's call to
              * glReadPixels but we need to compute the dest slice's address
@@ -3255,9 +3267,11 @@ _mesa_meta_GetTexSubImage(struct gl_context *ctx,
             packing.SkipRows = 0;
             dst = _mesa_image_address3d(&packing, pixels, width, height,
                                         format, type, slice, 0, 0);
+            break;
          }
-         else {
+         default:
             dst = pixels;
+            break;
          }
          result = decompress_texture_image(ctx, texImage, slice,
                                            xoffset, yoffset, width, height,