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