From 5e1c705bd1093552b2d6f2028e3ef3b4a924b318 Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Fri, 22 Aug 2025 19:16:31 -0400 Subject: [PATCH] nvk/copy: Split out nvk_remap_extract_aspect Reviewed-by: Faith Ekstrand Part-of: --- src/nouveau/vulkan/nvk_cmd_copy.c | 117 ++++++++++++++++-------------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_copy.c b/src/nouveau/vulkan/nvk_cmd_copy.c index 1cc94510c49..c60229d0942 100644 --- a/src/nouveau/vulkan/nvk_cmd_copy.c +++ b/src/nouveau/vulkan/nvk_cmd_copy.c @@ -537,6 +537,63 @@ nvk_CmdCopyBufferToImage2(VkCommandBuffer commandBuffer, } } +static void +nvk_remap_extract_aspect(struct nouveau_copy *copy, + struct nouveau_copy *copy2, + enum pipe_format p_format, + const VkImageAspectFlagBits aspects) +{ + switch (p_format) { + case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: + if (aspects == VK_IMAGE_ASPECT_DEPTH_BIT) { + copy->remap.comp_size = 4; + copy->remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_X; + copy->remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; + copy->remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; + copy->remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; + } else { + assert(aspects == VK_IMAGE_ASPECT_STENCIL_BIT); + copy2->extent_el = copy->extent_el; + + copy->remap.comp_size = 2; + copy->remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_Z; + copy->remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; + copy->remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; + copy->remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; + + copy2->remap.comp_size = 1; + copy2->remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_X; + copy2->remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; + copy2->remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; + copy2->remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; + } + break; + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + if (aspects == VK_IMAGE_ASPECT_DEPTH_BIT) { + copy->remap.comp_size = 1; + copy->remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_X; + copy->remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Y; + copy->remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Z; + copy->remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; + } else { + assert(aspects == VK_IMAGE_ASPECT_STENCIL_BIT); + copy->remap.comp_size = 1; + copy->remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_W; + copy->remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; + copy->remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; + copy->remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; + } + break; + case PIPE_FORMAT_Z16_UNORM_S8_UINT: + case PIPE_FORMAT_S8_UINT_Z24_UNORM: + UNREACHABLE("Unsupported packed depth/stencil format"); + break; + default: + copy->remap = nouveau_copy_remap_format(p_format); + break; + } +} + VKAPI_ATTR void VKAPI_CALL nvk_CmdCopyImageToBuffer2(VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2 *pCopyImageToBufferInfo) @@ -574,59 +631,13 @@ nvk_CmdCopyImageToBuffer2(VkCommandBuffer commandBuffer, }; struct nouveau_copy copy2 = { 0 }; - switch (format.p_format) { - case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: - if (aspects == VK_IMAGE_ASPECT_DEPTH_BIT) { - copy.remap.comp_size = 4; - copy.remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_X; - copy.remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; - copy.remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; - copy.remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; - } else { - assert(aspects == VK_IMAGE_ASPECT_STENCIL_BIT); - copy2.dst = copy.dst; - copy2.extent_el = copy.extent_el; - copy.dst = copy2.src = - nouveau_copy_rect_image(src, &src->stencil_copy_temp, - region->imageOffset, - ®ion->imageSubresource); - - copy.remap.comp_size = 2; - copy.remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_Z; - copy.remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; - copy.remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; - copy.remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; - - copy2.remap.comp_size = 1; - copy2.remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_X; - copy2.remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; - copy2.remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; - copy2.remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; - } - break; - case PIPE_FORMAT_Z24_UNORM_S8_UINT: - if (aspects == VK_IMAGE_ASPECT_DEPTH_BIT) { - copy.remap.comp_size = 1; - copy.remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_X; - copy.remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_SRC_Y; - copy.remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_SRC_Z; - copy.remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; - } else { - assert(aspects == VK_IMAGE_ASPECT_STENCIL_BIT); - copy.remap.comp_size = 1; - copy.remap.dst[0] = NV90B5_SET_REMAP_COMPONENTS_DST_X_SRC_W; - copy.remap.dst[1] = NV90B5_SET_REMAP_COMPONENTS_DST_Y_NO_WRITE; - copy.remap.dst[2] = NV90B5_SET_REMAP_COMPONENTS_DST_Z_NO_WRITE; - copy.remap.dst[3] = NV90B5_SET_REMAP_COMPONENTS_DST_W_NO_WRITE; - } - break; - case PIPE_FORMAT_Z16_UNORM_S8_UINT: - case PIPE_FORMAT_S8_UINT_Z24_UNORM: - UNREACHABLE("Unsupported packed depth/stencil format"); - break; - default: - copy.remap = nouveau_copy_remap_format(format.p_format); - break; + nvk_remap_extract_aspect(©, ©2, format.p_format, aspects); + if (copy2.extent_el.width > 0) { + copy2.dst = copy.dst; + copy.dst = copy2.src = + nouveau_copy_rect_image(src, &src->stencil_copy_temp, + region->imageOffset, + ®ion->imageSubresource); } nouveau_copy_rect(cmd, ©);