nvk/copy: Split out nvk_remap_extract_aspect

Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36950>
This commit is contained in:
Mel Henning
2025-08-22 19:16:31 -04:00
committed by Faith Ekstrand
parent caced4e028
commit 5e1c705bd1
+64 -53
View File
@@ -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,
&region->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(&copy, &copy2, 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,
&region->imageSubresource);
}
nouveau_copy_rect(cmd, &copy);