From: Kenneth Graunke Date: Tue, 14 Aug 2018 23:44:07 +0000 (-0700) Subject: iris: Fix tiled memcpy for cubes...and for array slices X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=84832ab7d41ef6a29faf7442c59bac098ac050e3;p=mesa.git iris: Fix tiled memcpy for cubes...and for array slices tiled_memcpy_map was not offsetting map->ptr based on the slice, while unmap was. also, we were doing offsetting wrong for cubes. --- diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c index a1c703d7c72..6423dea9be7 100644 --- a/src/gallium/drivers/iris/iris_resource.c +++ b/src/gallium/drivers/iris/iris_resource.c @@ -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++; } }