From 695fe3897dc450a8b97f8cd11cf94e9bfd93cfb7 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Sat, 24 Jul 2021 12:52:41 -0400 Subject: [PATCH] asahi: Implement cube map tiling transfers Signed-off-by: Alyssa Rosenzweig Part-of: --- src/gallium/drivers/asahi/agx_pipe.c | 37 +++++++++++++++------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 4c4e7610022..ec15e470a5e 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -319,12 +319,14 @@ agx_transfer_map(struct pipe_context *pctx, assert(box->depth == 1); if ((usage & PIPE_MAP_READ) && BITSET_TEST(rsrc->data_valid, level)) { - agx_detile( - ((uint8_t *) bo->ptr.cpu) + rsrc->slices[level].offset, - transfer->map, - u_minify(resource->width0, level), bytes_per_pixel * 8, - transfer->base.stride / bytes_per_pixel, - box->x, box->y, box->x + box->width, box->y + box->height); + for (unsigned z = 0; z < box->depth; ++z) { + uint8_t *map = agx_rsrc_offset(rsrc, level, box->z + z); + + agx_detile(map, transfer->map, + u_minify(resource->width0, level), bytes_per_pixel * 8, + transfer->base.stride / bytes_per_pixel, + box->x, box->y, box->x + box->width, box->y + box->height); + } } return transfer->map; @@ -364,19 +366,20 @@ agx_transfer_unmap(struct pipe_context *pctx, /* Tiling will occur in software from a staging cpu buffer */ if ((transfer->usage & PIPE_MAP_WRITE) && rsrc->modifier == DRM_FORMAT_MOD_APPLE_64X64_MORTON_ORDER) { - struct agx_bo *bo = rsrc->bo; assert(trans->map != NULL); - assert(transfer->box.depth == 1); - agx_tile( - ((uint8_t *) bo->ptr.cpu) + rsrc->slices[transfer->level].offset, - trans->map, - u_minify(transfer->resource->width0, transfer->level), - bytes_per_pixel * 8, - transfer->stride / bytes_per_pixel, - transfer->box.x, transfer->box.y, - transfer->box.x + transfer->box.width, - transfer->box.y + transfer->box.height); + for (unsigned z = 0; z < transfer->box.depth; ++z) { + uint8_t *map = agx_rsrc_offset(rsrc, transfer->level, + transfer->box.z + z); + + agx_tile(map, trans->map, + u_minify(transfer->resource->width0, transfer->level), + bytes_per_pixel * 8, + transfer->stride / bytes_per_pixel, + transfer->box.x, transfer->box.y, + transfer->box.x + transfer->box.width, + transfer->box.y + transfer->box.height); + } } /* Free the transfer */