Mesa (main): anv: Rework our aspect/plane helpers

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


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Thu Jul 29 16:35:26 2021 -0500

anv: Rework our aspect/plane helpers

The new versions should have identical output, just a simpler (and
probably faster) implementation and more/better asserts.

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_image.c   | 19 ++---------------
 src/intel/vulkan/anv_private.h | 48 +++++++++++++++++++++++++-----------------
 2 files changed, 31 insertions(+), 36 deletions(-)

diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index e08e7297d1f..c4828e9ca75 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -2644,23 +2644,8 @@ anv_image_fill_surface_state(struct anv_device *device,
 static uint32_t
 anv_image_aspect_get_planes(VkImageAspectFlags aspect_mask)
 {
-   uint32_t planes = 0;
-
-   if (aspect_mask & (VK_IMAGE_ASPECT_COLOR_BIT |
-                      VK_IMAGE_ASPECT_DEPTH_BIT |
-                      VK_IMAGE_ASPECT_STENCIL_BIT |
-                      VK_IMAGE_ASPECT_PLANE_0_BIT))
-      planes++;
-   if (aspect_mask & VK_IMAGE_ASPECT_PLANE_1_BIT)
-      planes++;
-   if (aspect_mask & VK_IMAGE_ASPECT_PLANE_2_BIT)
-      planes++;
-
-   if ((aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0 &&
-       (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) != 0)
-      planes++;
-
-   return planes;
+   anv_assert_valid_aspect_set(aspect_mask);
+   return util_bitcount(aspect_mask);
 }
 
 VkResult
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index e293bbbb67a..5636bdf94a7 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -3780,6 +3780,29 @@ struct anv_format {
    bool can_ycbcr;
 };
 
+static inline void
+anv_assert_valid_aspect_set(VkImageAspectFlags aspects)
+{
+   if (util_bitcount(aspects) == 1) {
+      assert(aspects & (VK_IMAGE_ASPECT_COLOR_BIT |
+                        VK_IMAGE_ASPECT_DEPTH_BIT |
+                        VK_IMAGE_ASPECT_STENCIL_BIT |
+                        VK_IMAGE_ASPECT_PLANE_0_BIT |
+                        VK_IMAGE_ASPECT_PLANE_1_BIT |
+                        VK_IMAGE_ASPECT_PLANE_2_BIT));
+   } else if (aspects & VK_IMAGE_ASPECT_PLANES_BITS_ANV) {
+      assert(aspects == VK_IMAGE_ASPECT_PLANE_0_BIT ||
+             aspects == (VK_IMAGE_ASPECT_PLANE_0_BIT |
+                         VK_IMAGE_ASPECT_PLANE_1_BIT) ||
+             aspects == (VK_IMAGE_ASPECT_PLANE_0_BIT |
+                         VK_IMAGE_ASPECT_PLANE_1_BIT |
+                         VK_IMAGE_ASPECT_PLANE_2_BIT));
+   } else {
+      assert(aspects == (VK_IMAGE_ASPECT_DEPTH_BIT |
+                         VK_IMAGE_ASPECT_STENCIL_BIT));
+   }
+}
+
 /**
  * Return the aspect's plane relative to all_aspects.  For an image, for
  * instance, all_aspects would be the set of aspects in the image.  For
@@ -3795,27 +3818,14 @@ static inline uint32_t
 anv_image_aspect_to_plane(VkImageAspectFlags all_aspects,
                           VkImageAspectFlagBits aspect)
 {
+   anv_assert_valid_aspect_set(all_aspects);
    assert(util_bitcount(aspect) == 1);
-   if (util_bitcount(all_aspects) == 1)
-      return 0;
+   assert(!(aspect & ~all_aspects));
 
-   switch (aspect) {
-   case VK_IMAGE_ASPECT_COLOR_BIT:
-   case VK_IMAGE_ASPECT_DEPTH_BIT:
-   case VK_IMAGE_ASPECT_PLANE_0_BIT:
-      return 0;
-   case VK_IMAGE_ASPECT_STENCIL_BIT:
-      if ((all_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) == 0)
-         return 0;
-      FALLTHROUGH;
-   case VK_IMAGE_ASPECT_PLANE_1_BIT:
-      return 1;
-   case VK_IMAGE_ASPECT_PLANE_2_BIT:
-      return 2;
-   default:
-      /* Purposefully assert with depth/stencil aspects. */
-      unreachable("invalid image aspect");
-   }
+   /* Because we always put image and view planes in aspect-bit-order, the
+    * plane index is the number of bits in all_aspects before aspect.
+    */
+   return util_bitcount(all_aspects & (aspect - 1));
 }
 
 #define anv_foreach_image_aspect_bit(b, image, aspects) \



More information about the mesa-commit mailing list