From e37c2d923a4f240ed8403e08143172a5c0ab3ef3 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 29 Jul 2021 16:35:26 -0500 Subject: [PATCH] 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 Part-of: --- 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 e08e729..c4828e9 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 e293bbb..5636bdf 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) \ -- 2.7.4