iris: Fix tiled memcpy for cubes...and for array slices
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 14 Aug 2018 23:44:07 +0000 (16:44 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:08 +0000 (10:26 -0800)
tiled_memcpy_map was not offsetting map->ptr based on the slice,
while unmap was.  also, we were doing offsetting wrong for cubes.

src/gallium/drivers/iris/iris_resource.c

index a1c703d7c72e9cc18ae7196daaae6a7bafb964a1..6423dea9be7c7a8f23b5871100084288be902f3f 100644 (file)
@@ -652,7 +652,7 @@ iris_unmap_tiled_memcpy(struct iris_transfer *map)
          unsigned x1, x2, y1, y2;
          tile_extents(surf, &box, xfer->level, &x1, &x2, &y1, &y2);
 
-         void *ptr = map->ptr + box.z * xfer->layer_stride;
+         void *ptr = map->ptr + s * xfer->layer_stride;
 
          isl_memcpy_linear_to_tiled(x1, x2, y1, y2, dst, ptr,
                                     surf->row_pitch_B, xfer->stride,
@@ -698,9 +698,16 @@ iris_map_tiled_memcpy(struct iris_transfer *map)
          unsigned x1, x2, y1, y2;
          tile_extents(surf, &box, xfer->level, &x1, &x2, &y1, &y2);
 
-         isl_memcpy_tiled_to_linear(x1, x2, y1, y2, map->ptr, src,
-                                    xfer->stride, surf->row_pitch_B,
-                                    has_swizzling, surf->tiling, ISL_MEMCPY);
+         /* When transferring cubes, box.depth is counted in cubes, but
+          * box.z is counted in faces.  We want to transfer only the
+          * specified face, but for all array elements.  So, use 's'
+          * (the zero-based slice count) rather than box.z.
+          */
+         void *ptr = map->ptr + s * xfer->layer_stride;
+
+         isl_memcpy_tiled_to_linear(x1, x2, y1, y2, ptr, src, xfer->stride,
+                                    surf->row_pitch_B, has_swizzling,
+                                    surf->tiling, ISL_MEMCPY);
          box.z++;
       }
    }