Mesa (main): anv: Add a get_format_plane helper and use it in image setup

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Aug 9 16:19:12 UTC 2021


Module: Mesa
Branch: main
Commit: 4df2078e7299edc9c6a8cd281d5310d93b70fd70
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4df2078e7299edc9c6a8cd281d5310d93b70fd70

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri Jul 30 06:46:29 2021 -0500

anv: Add a get_format_plane helper and use it in image setup

Unlike anv_get_format_aspect, this takes a plane number which is
relative to the set of aspects on the format.  There are a number of
cases where we already have the plane and so re-fetching it is useless.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12141>

---

 src/intel/vulkan/anv_formats.c | 20 ++++++++++++++------
 src/intel/vulkan/anv_image.c   |  4 ++--
 src/intel/vulkan/anv_private.h |  5 +++++
 3 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c
index 911460d2313..5485d79dd49 100644
--- a/src/intel/vulkan/anv_formats.c
+++ b/src/intel/vulkan/anv_formats.c
@@ -468,9 +468,9 @@ anv_format_has_npot_plane(const struct anv_format *anv_format) {
  * _cannot_ check for compatibility).
  */
 struct anv_format_plane
-anv_get_format_aspect(const struct intel_device_info *devinfo,
-                      VkFormat vk_format,
-                      VkImageAspectFlagBits aspect, VkImageTiling tiling)
+anv_get_format_plane(const struct intel_device_info *devinfo,
+                     VkFormat vk_format, uint32_t plane,
+                     VkImageTiling tiling)
 {
    const struct anv_format *format = anv_get_format(vk_format);
    const struct anv_format_plane unsupported = {
@@ -480,7 +480,7 @@ anv_get_format_aspect(const struct intel_device_info *devinfo,
    if (format == NULL)
       return unsupported;
 
-   uint32_t plane = anv_image_aspect_to_plane(vk_format_aspects(vk_format), aspect);
+   assert(plane < format->n_planes);
    struct anv_format_plane plane_format = format->planes[plane];
    if (plane_format.isl_format == ISL_FORMAT_UNSUPPORTED)
       return unsupported;
@@ -491,8 +491,6 @@ anv_get_format_aspect(const struct intel_device_info *devinfo,
    if (vk_format_is_depth_or_stencil(vk_format))
       return plane_format;
 
-   assert((aspect & ~VK_IMAGE_ASPECT_ANY_COLOR_BIT_ANV) == 0);
-
    const struct isl_format_layout *isl_layout =
       isl_format_get_layout(plane_format.isl_format);
 
@@ -533,6 +531,16 @@ anv_get_format_aspect(const struct intel_device_info *devinfo,
    return plane_format;
 }
 
+struct anv_format_plane
+anv_get_format_aspect(const struct intel_device_info *devinfo,
+                      VkFormat vk_format,
+                      VkImageAspectFlagBits aspect, VkImageTiling tiling)
+{
+   const uint32_t plane =
+      anv_image_aspect_to_plane(vk_format_aspects(vk_format), aspect);
+   return anv_get_format_plane(devinfo, vk_format, plane, tiling);
+}
+
 // Format capabilities
 
 VkFormatFeatureFlags
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index 0d0d3e60e38..bd8e674c1f9 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -1035,7 +1035,7 @@ add_all_surfaces_implicit_layout(
       VkImageAspectFlagBits aspect = 1 << b;
       uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
       const  struct anv_format_plane plane_format =
-         anv_get_format_aspect(devinfo, image->vk_format, aspect, image->tiling);
+         anv_get_format_plane(devinfo, image->vk_format, plane, image->tiling);
 
       VkImageUsageFlags vk_usage = image->usage;
       if (aspect == VK_IMAGE_ASPECT_STENCIL_BIT)
@@ -1156,7 +1156,7 @@ add_all_surfaces_explicit_layout(
       const VkImageAspectFlagBits aspect = 1 << b;
       const uint32_t plane = anv_image_aspect_to_plane(image->aspects, aspect);
       const struct anv_format_plane format_plane =
-         anv_get_format_aspect(devinfo, image->vk_format, aspect, image->tiling);
+         anv_get_format_plane(devinfo, image->vk_format, plane, image->tiling);
       const VkSubresourceLayout *primary_layout = &drm_info->pPlaneLayouts[plane];
 
       result = add_primary_surface(device, image, plane,
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 7db2bfdd4de..8e7909c7356 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -3838,6 +3838,11 @@ anv_get_format_planes(VkFormat vk_format)
    return format != NULL ? format->n_planes : 0;
 }
 
+struct anv_format_plane
+anv_get_format_plane(const struct intel_device_info *devinfo,
+                     VkFormat vk_format, uint32_t plane,
+                     VkImageTiling tiling);
+
 struct anv_format_plane
 anv_get_format_aspect(const struct intel_device_info *devinfo,
                       VkFormat vk_format,



More information about the mesa-commit mailing list