From 9669b48b4a41c96b8547d1a57dd8b5dead340ad0 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Fri, 1 Sep 2023 15:28:27 +0200 Subject: [PATCH] tu/clear_blit: Allow VK_REMAINING_ARRAY_LAYERS as layerCount Part-of: --- src/freedreno/vulkan/tu_clear_blit.cc | 31 ++++++++++++++++++--------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/freedreno/vulkan/tu_clear_blit.cc b/src/freedreno/vulkan/tu_clear_blit.cc index 5b5a5f39085..dd237abe484 100644 --- a/src/freedreno/vulkan/tu_clear_blit.cc +++ b/src/freedreno/vulkan/tu_clear_blit.cc @@ -1812,9 +1812,10 @@ tu6_blit_image(struct tu_cmd_buffer *cmd, src1_z = info->srcOffsets[0].z; } - if (info->dstSubresource.layerCount > 1) { + if (vk_image_subresource_layer_count(&dst_image->vk, &info->dstSubresource) > 1) { assert(layers <= 1); - layers = info->dstSubresource.layerCount; + layers = vk_image_subresource_layer_count(&dst_image->vk, + &info->dstSubresource); } /* BC1_RGB_* formats need to have their last components overriden with 1 @@ -1972,7 +1973,9 @@ tu_copy_buffer_to_image(struct tu_cmd_buffer *cmd, const VkBufferImageCopy2 *info) { struct tu_cs *cs = &cmd->cs; - uint32_t layers = MAX2(info->imageExtent.depth, info->imageSubresource.layerCount); + uint32_t layers = MAX2(info->imageExtent.depth, + vk_image_subresource_layer_count(&dst_image->vk, + &info->imageSubresource)); enum pipe_format src_format = copy_format(dst_image->vk.format, info->imageSubresource.aspectMask); enum pipe_format dst_format = @@ -2058,7 +2061,9 @@ tu_copy_image_to_buffer(struct tu_cmd_buffer *cmd, const VkBufferImageCopy2 *info) { struct tu_cs *cs = &cmd->cs; - uint32_t layers = MAX2(info->imageExtent.depth, info->imageSubresource.layerCount); + uint32_t layers = MAX2(info->imageExtent.depth, + vk_image_subresource_layer_count(&src_image->vk, + &info->imageSubresource)); enum pipe_format dst_format = copy_format(src_image->vk.format, info->imageSubresource.aspectMask); enum pipe_format src_format = @@ -2175,7 +2180,9 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, VkOffset3D src_offset = info->srcOffset; VkOffset3D dst_offset = info->dstOffset; VkExtent3D extent = info->extent; - uint32_t layers_to_copy = MAX2(info->extent.depth, info->srcSubresource.layerCount); + uint32_t layers_to_copy = MAX2(info->extent.depth, + vk_image_subresource_layer_count(&src_image->vk, + &info->srcSubresource)); /* From the Vulkan 1.2.140 spec, section 19.3 "Copying Data Between * Images": @@ -2253,6 +2260,9 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, staging_layout.tile_mode = TILE6_LINEAR; staging_layout.ubwc = false; + uint32_t layer_count = + vk_image_subresource_layer_count(&src_image->vk, + &info->srcSubresource); fdl6_layout(&staging_layout, src_format, src_image->layout[0].nr_samples, @@ -2260,7 +2270,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, extent.height, extent.depth, 1, - info->srcSubresource.layerCount, + layer_count, extent.depth > 1, NULL); @@ -2281,7 +2291,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, .base_miplevel = 0, .level_count = 1, .base_array_layer = 0, - .layer_count = info->srcSubresource.layerCount, + .layer_count = layer_count, .swiz = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W }, .format = tu_format_for_aspect(src_format, VK_IMAGE_ASPECT_COLOR_BIT), .type = FDL_VIEW_TYPE_2D, @@ -2311,7 +2321,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, .base_miplevel = 0, .level_count = 1, .base_array_layer = 0, - .layer_count = info->srcSubresource.layerCount, + .layer_count = layer_count, .swiz = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W }, .format = tu_format_for_aspect(dst_format, VK_IMAGE_ASPECT_COLOR_BIT), .type = FDL_VIEW_TYPE_2D, @@ -2516,9 +2526,10 @@ tu_CmdResolveImage2KHR(VkCommandBuffer commandBuffer, for (uint32_t i = 0; i < pResolveImageInfo->regionCount; ++i) { const VkImageResolve2 *info = &pResolveImageInfo->pRegions[i]; - uint32_t layers = MAX2(info->extent.depth, info->dstSubresource.layerCount); + uint32_t layers = MAX2(info->extent.depth, + vk_image_subresource_layer_count(&dst_image->vk, + &info->dstSubresource)); - assert(info->srcSubresource.layerCount == info->dstSubresource.layerCount); /* TODO: aspect masks possible ? */ coords(ops, cs, info->dstOffset, info->srcOffset, info->extent);