From 191a8e0778689f350a892b822bdeff41fbe7b97f Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 22 Mar 2021 15:16:06 -0400 Subject: [PATCH] zink: fix handling for image types in resource_copy_region hook different image types are supposed to use different members of this struct to indicate layer copies, and this can't necessarily be inferred by checking array_size Reviewed-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_context.c | 44 +++++++++++++++++++++---- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 379b1605271..c4bd6ad6d71 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2136,15 +2136,30 @@ zink_resource_copy_region(struct pipe_context *pctx, region.srcSubresource.aspectMask = src->aspect; region.srcSubresource.mipLevel = src_level; - region.srcSubresource.layerCount = 1; - if (src->base.array_size > 1) { + switch (src->base.target) { + case PIPE_TEXTURE_CUBE: + case PIPE_TEXTURE_CUBE_ARRAY: + case PIPE_TEXTURE_2D_ARRAY: + case PIPE_TEXTURE_1D_ARRAY: + /* these use layer */ region.srcSubresource.baseArrayLayer = src_box->z; region.srcSubresource.layerCount = src_box->depth; + region.srcOffset.z = 0; region.extent.depth = 1; - } else { - region.srcOffset.z = src_box->z; + break; + case PIPE_TEXTURE_3D: + /* this uses depth */ + region.srcSubresource.baseArrayLayer = 0; region.srcSubresource.layerCount = 1; + region.srcOffset.z = src_box->z; region.extent.depth = src_box->depth; + break; + default: + /* these must only copy one layer */ + region.srcSubresource.baseArrayLayer = 0; + region.srcSubresource.layerCount = 1; + region.srcOffset.z = 0; + region.extent.depth = 1; } region.srcOffset.x = src_box->x; @@ -2152,12 +2167,27 @@ zink_resource_copy_region(struct pipe_context *pctx, region.dstSubresource.aspectMask = dst->aspect; region.dstSubresource.mipLevel = dst_level; - if (dst->base.array_size > 1) { + switch (dst->base.target) { + case PIPE_TEXTURE_CUBE: + case PIPE_TEXTURE_CUBE_ARRAY: + case PIPE_TEXTURE_2D_ARRAY: + case PIPE_TEXTURE_1D_ARRAY: + /* these use layer */ region.dstSubresource.baseArrayLayer = dstz; region.dstSubresource.layerCount = src_box->depth; - } else { - region.dstOffset.z = dstz; + region.dstOffset.z = 0; + break; + case PIPE_TEXTURE_3D: + /* this uses depth */ + region.dstSubresource.baseArrayLayer = 0; region.dstSubresource.layerCount = 1; + region.dstOffset.z = dstz; + break; + default: + /* these must only copy one layer */ + region.dstSubresource.baseArrayLayer = 0; + region.dstSubresource.layerCount = 1; + region.dstOffset.z = 0; } region.dstOffset.x = dstx;