radv: allow VK_REMAINING_ARRAY_LAYERS with VkImageSubresourceLayers
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 28 Jul 2023 07:20:11 +0000 (09:20 +0200)
committerMarge Bot <emma+marge@anholt.net>
Thu, 10 Aug 2023 03:05:02 +0000 (03:05 +0000)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24392>

src/amd/vulkan/meta/radv_meta_blit.c
src/amd/vulkan/meta/radv_meta_copy.c
src/amd/vulkan/meta/radv_meta_etc_decode.c
src/amd/vulkan/meta/radv_meta_resolve.c
src/amd/vulkan/meta/radv_meta_resolve_cs.c
src/amd/vulkan/meta/radv_meta_resolve_fs.c

index cd76632..3a874b3 100644 (file)
@@ -427,7 +427,7 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
       dst_end = region->dstOffsets[1].z;
    } else {
       dst_start = dst_res->baseArrayLayer;
-      dst_end = dst_start + dst_res->layerCount;
+      dst_end = dst_start + vk_image_subresource_layer_count(&dst_image->vk, dst_res);
    }
 
    unsigned src_start, src_end;
@@ -437,7 +437,7 @@ blit_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
       src_end = region->srcOffsets[1].z;
    } else {
       src_start = src_res->baseArrayLayer;
-      src_end = src_start + src_res->layerCount;
+      src_end = src_start + vk_image_subresource_layer_count(&src_image->vk, src_res);
    }
 
    bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);
index f4c3a29..4867b8f 100644 (file)
@@ -142,7 +142,7 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
                                 .baseMipLevel = region->imageSubresource.mipLevel,
                                 .levelCount = 1,
                                 .baseArrayLayer = region->imageSubresource.baseArrayLayer,
-                                .layerCount = region->imageSubresource.layerCount,
+                                .layerCount = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource),
                              });
          img_bsurf.disable_compression = true;
 
@@ -164,7 +164,7 @@ copy_buffer_to_image(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
       img_bsurf.layer = img_offset_el.z;
    /* Loop through each 3D or array slice */
    unsigned num_slices_3d = img_extent_el.depth;
-   unsigned num_slices_array = region->imageSubresource.layerCount;
+   unsigned num_slices_array = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource);
    unsigned slice_3d = 0;
    unsigned slice_array = 0;
    while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
@@ -291,7 +291,7 @@ copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
                                 .baseMipLevel = region->imageSubresource.mipLevel,
                                 .levelCount = 1,
                                 .baseArrayLayer = region->imageSubresource.baseArrayLayer,
-                                .layerCount = region->imageSubresource.layerCount,
+                                .layerCount = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource),
                              });
          img_info.disable_compression = true;
 
@@ -312,7 +312,7 @@ copy_image_to_buffer(struct radv_cmd_buffer *cmd_buffer, struct radv_buffer *buf
       img_info.layer = img_offset_el.z;
    /* Loop through each 3D or array slice */
    unsigned num_slices_3d = img_extent_el.depth;
-   unsigned num_slices_array = region->imageSubresource.layerCount;
+   unsigned num_slices_array = vk_image_subresource_layer_count(&image->vk, &region->imageSubresource);
    unsigned slice_3d = 0;
    unsigned slice_array = 0;
    while (slice_3d < num_slices_3d && slice_array < num_slices_array) {
@@ -384,15 +384,16 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
 
          u_foreach_bit (i, region->dstSubresource.aspectMask) {
             unsigned aspect_mask = 1u << i;
-            radv_expand_depth_stencil(cmd_buffer, dst_image,
-                                      &(VkImageSubresourceRange){
-                                         .aspectMask = aspect_mask,
-                                         .baseMipLevel = region->dstSubresource.mipLevel,
-                                         .levelCount = 1,
-                                         .baseArrayLayer = region->dstSubresource.baseArrayLayer,
-                                         .layerCount = region->dstSubresource.layerCount,
-                                      },
-                                      NULL);
+            radv_expand_depth_stencil(
+               cmd_buffer, dst_image,
+               &(VkImageSubresourceRange){
+                  .aspectMask = aspect_mask,
+                  .baseMipLevel = region->dstSubresource.mipLevel,
+                  .levelCount = 1,
+                  .baseArrayLayer = region->dstSubresource.baseArrayLayer,
+                  .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
+               },
+               NULL);
          }
 
          radv_describe_barrier_end(cmd_buffer);
@@ -445,7 +446,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
                                 .baseMipLevel = region->dstSubresource.mipLevel,
                                 .levelCount = 1,
                                 .baseArrayLayer = region->dstSubresource.baseArrayLayer,
-                                .layerCount = region->dstSubresource.layerCount,
+                                .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
                              });
          b_dst.format = b_src.format;
          b_dst.disable_compression = true;
@@ -482,7 +483,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
          .height = img_extent_el.height,
       };
 
-      unsigned num_slices = region->srcSubresource.layerCount;
+      unsigned num_slices = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
 
       if (src_image->vk.image_type == VK_IMAGE_TYPE_3D) {
          b_src.layer = src_offset_el.z;
@@ -527,7 +528,7 @@ copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *src_image, VkI
             .baseMipLevel = region->dstSubresource.mipLevel,
             .levelCount = 1,
             .baseArrayLayer = region->dstSubresource.baseArrayLayer,
-            .layerCount = region->dstSubresource.layerCount,
+            .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
          };
 
          uint32_t htile_value = radv_get_htile_initial_value(cmd_buffer->device, dst_image);
index c4d1ec4..c770620 100644 (file)
@@ -632,7 +632,9 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
                      RADV_META_SUSPEND_PREDICATING);
 
    uint32_t base_slice = radv_meta_get_iview_layer(image, subresource, &offset);
-   uint32_t slice_count = image->vk.image_type == VK_IMAGE_TYPE_3D ? extent.depth : subresource->layerCount;
+   uint32_t slice_count = image->vk.image_type == VK_IMAGE_TYPE_3D
+                             ? extent.depth
+                             : vk_image_subresource_layer_count(&image->vk, subresource);
 
    extent = vk_image_sanitize_extent(&image->vk, extent);
    offset = vk_image_sanitize_offset(&image->vk, offset);
@@ -640,22 +642,23 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
    VkFormat load_format =
       vk_format_get_blocksize(image->vk.format) == 16 ? VK_FORMAT_R32G32B32A32_UINT : VK_FORMAT_R32G32_UINT;
    struct radv_image_view src_iview;
-   radv_image_view_init(&src_iview, cmd_buffer->device,
-                        &(VkImageViewCreateInfo){
-                           .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
-                           .image = radv_image_to_handle(image),
-                           .viewType = radv_meta_get_view_type(image),
-                           .format = load_format,
-                           .subresourceRange =
-                              {
-                                 .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                                 .baseMipLevel = subresource->mipLevel,
-                                 .levelCount = 1,
-                                 .baseArrayLayer = 0,
-                                 .layerCount = subresource->baseArrayLayer + subresource->layerCount,
-                              },
-                        },
-                        0, NULL);
+   radv_image_view_init(
+      &src_iview, cmd_buffer->device,
+      &(VkImageViewCreateInfo){
+         .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+         .image = radv_image_to_handle(image),
+         .viewType = radv_meta_get_view_type(image),
+         .format = load_format,
+         .subresourceRange =
+            {
+               .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+               .baseMipLevel = subresource->mipLevel,
+               .levelCount = 1,
+               .baseArrayLayer = 0,
+               .layerCount = subresource->baseArrayLayer + vk_image_subresource_layer_count(&image->vk, subresource),
+            },
+      },
+      0, NULL);
 
    VkFormat store_format;
    switch (image->vk.format) {
@@ -675,22 +678,23 @@ radv_meta_decode_etc(struct radv_cmd_buffer *cmd_buffer, struct radv_image *imag
       store_format = VK_FORMAT_R8G8B8A8_UNORM;
    }
    struct radv_image_view dst_iview;
-   radv_image_view_init(&dst_iview, cmd_buffer->device,
-                        &(VkImageViewCreateInfo){
-                           .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
-                           .image = radv_image_to_handle(image),
-                           .viewType = radv_meta_get_view_type(image),
-                           .format = store_format,
-                           .subresourceRange =
-                              {
-                                 .aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT,
-                                 .baseMipLevel = subresource->mipLevel,
-                                 .levelCount = 1,
-                                 .baseArrayLayer = 0,
-                                 .layerCount = subresource->baseArrayLayer + subresource->layerCount,
-                              },
-                        },
-                        0, NULL);
+   radv_image_view_init(
+      &dst_iview, cmd_buffer->device,
+      &(VkImageViewCreateInfo){
+         .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+         .image = radv_image_to_handle(image),
+         .viewType = radv_meta_get_view_type(image),
+         .format = store_format,
+         .subresourceRange =
+            {
+               .aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT,
+               .baseMipLevel = subresource->mipLevel,
+               .levelCount = 1,
+               .baseArrayLayer = 0,
+               .layerCount = subresource->baseArrayLayer + vk_image_subresource_layer_count(&image->vk, subresource),
+            },
+      },
+      0, NULL);
 
    decode_etc(cmd_buffer, &src_iview, &dst_iview, &(VkOffset3D){offset.x, offset.y, base_slice},
               &(VkExtent3D){extent.width, extent.height, slice_count});
index 990e615..6414074 100644 (file)
@@ -350,7 +350,8 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
     */
    assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
    assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
-   assert(region->srcSubresource.layerCount == region->dstSubresource.layerCount);
+   assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
+          vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
 
    const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, &region->srcSubresource, &region->srcOffset);
 
@@ -381,7 +382,7 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
          .baseMipLevel = region->dstSubresource.mipLevel,
          .levelCount = 1,
          .baseArrayLayer = dst_base_layer,
-         .layerCount = region->dstSubresource.layerCount,
+         .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
       };
 
       cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_image, &range, 0xffffffff);
@@ -402,7 +403,9 @@ radv_meta_resolve_hardware_image(struct radv_cmd_buffer *cmd_buffer, struct radv
 
    radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, &resolve_area);
 
-   for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
+   const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
+
+   for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
 
       VkResult ret = build_resolve_pipeline(device, fs_key);
       if (ret != VK_SUCCESS) {
@@ -836,15 +839,13 @@ radv_decompress_resolve_src(struct radv_cmd_buffer *cmd_buffer, struct radv_imag
       .oldLayout = src_image_layout,
       .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
       .image = radv_image_to_handle(src_image),
-      .subresourceRange =
-         (VkImageSubresourceRange){
-            .aspectMask = region->srcSubresource.aspectMask,
-            .baseMipLevel = region->srcSubresource.mipLevel,
-            .levelCount = 1,
-            .baseArrayLayer = src_base_layer,
-            .layerCount = region->srcSubresource.layerCount,
-         },
-   };
+      .subresourceRange = (VkImageSubresourceRange){
+         .aspectMask = region->srcSubresource.aspectMask,
+         .baseMipLevel = region->srcSubresource.mipLevel,
+         .levelCount = 1,
+         .baseArrayLayer = src_base_layer,
+         .layerCount = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource),
+      }};
 
    VkSampleLocationsInfoEXT sample_loc_info;
    if (src_image->vk.create_flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT) {
index 50081a2..8aa6cde 100644 (file)
@@ -599,7 +599,7 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
                              .baseMipLevel = region->dstSubresource.mipLevel,
                              .levelCount = 1,
                              .baseArrayLayer = region->dstSubresource.baseArrayLayer,
-                             .layerCount = region->dstSubresource.layerCount,
+                             .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
                           });
    }
 
@@ -608,7 +608,8 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
 
    assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
    assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
-   assert(region->srcSubresource.layerCount == region->dstSubresource.layerCount);
+   assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
+          vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
 
    const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, &region->srcSubresource, &region->srcOffset);
 
@@ -617,8 +618,9 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
    const struct VkExtent3D extent = vk_image_sanitize_extent(&src_image->vk, region->extent);
    const struct VkOffset3D srcOffset = vk_image_sanitize_offset(&src_image->vk, region->srcOffset);
    const struct VkOffset3D dstOffset = vk_image_sanitize_offset(&dst_image->vk, region->dstOffset);
+   const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
 
-   for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
+   for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
 
       struct radv_image_view src_iview;
       radv_image_view_init(&src_iview, cmd_buffer->device,
@@ -676,7 +678,7 @@ radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer, struct radv_
          .baseMipLevel = region->dstSubresource.mipLevel,
          .levelCount = 1,
          .baseArrayLayer = dst_base_layer,
-         .layerCount = region->dstSubresource.layerCount,
+         .layerCount = vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource),
       };
 
       cmd_buffer->state.flush_bits |= radv_init_dcc(cmd_buffer, dst_image, &range, 0xffffffff);
index 59f64df..b649d65 100644 (file)
@@ -726,7 +726,8 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv
 
    assert(region->srcSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
    assert(region->dstSubresource.aspectMask == VK_IMAGE_ASPECT_COLOR_BIT);
-   assert(region->srcSubresource.layerCount == region->dstSubresource.layerCount);
+   assert(vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource) ==
+          vk_image_subresource_layer_count(&dst_image->vk, &region->dstSubresource));
 
    const uint32_t src_base_layer = radv_meta_get_iview_layer(src_image, &region->srcSubresource, &region->srcOffset);
 
@@ -751,7 +752,9 @@ radv_meta_resolve_fragment_image(struct radv_cmd_buffer *cmd_buffer, struct radv
 
    radv_CmdSetScissor(radv_cmd_buffer_to_handle(cmd_buffer), 0, 1, &resolve_area);
 
-   for (uint32_t layer = 0; layer < region->srcSubresource.layerCount; ++layer) {
+   const unsigned src_layer_count = vk_image_subresource_layer_count(&src_image->vk, &region->srcSubresource);
+
+   for (uint32_t layer = 0; layer < src_layer_count; ++layer) {
 
       struct radv_image_view src_iview;
       radv_image_view_init(&src_iview, cmd_buffer->device,