anv/image: Rework YCbCr image aspects
The Vulkan 1.2.184 spec says: "When creating a VkImageView, if sampler Y′CBCR conversion is enabled in the sampler, the aspectMask of a subresourceRange used by the VkImageView must be VK_IMAGE_ASPECT_COLOR_BIT. When creating a VkImageView, if sampler Y′CBCR conversion is not enabled in the sampler and the image format is multi-planar, the image must have been created with VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, and the aspectMask of the VkImageView’s subresourceRange must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT." Previously, for YCbCr images, we were flipping this around. For single- plane views where VK_IMAGE_ASPECT_PLANE_N_BIT would be passed in by the app, we would store VK_IMAGE_ASPECT_COLOR_BIT. For multi-plane views where the client says VK_IMAGE_ASPECT_COLOR_BIT, we would store a all of the planes. (There was also an extra bit of remapping that would compact the planes in the non-existent case of a format with a non- contiguous set of planes.) The idea behind this was that for things like rendering or single-plane sampling, storage, or compute, we want it to look as much like a single-plane image as possible but we wanted the multi-plane case to be the awkward one. This commit changes it around so that iview->aspects is always exactly the subset of image->vk.aspects represented by the view. This is identical to how aspects work for depth/stencil so it gains us some consistency. This commit also changes anv_image_view::aspect_mask to aspects to force a full audit of the field. As can be seen, there are only a few uses of this field and they're all mostly fine: - A bunch of them are used to check for depth/stencil. That hasn't changed. - Most of the checks for color already used ANY_COLOR_BIT, only one needed fixing. - There's a check that both src/depth are color for MSAA resolves. However, we don't support MSAA on YCbCr so there's no point in checking for ANY_COLOR_BIT. There is a hidden usage of planes in anv_descriptor_set_write_image_view that's not as obvious. However, this function simply looks at anv_image_view::n_planes and blindly fills out the descriptor accordingly. As long as image views with a single plane continue to claim n_planes == 1, this will be fine. Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12141>
This commit is contained in:

committed by
Marge Bot

parent
32157f9059
commit
0a93c0364c
@@ -3781,22 +3781,31 @@ struct anv_format {
|
||||
};
|
||||
|
||||
/**
|
||||
* 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
|
||||
* an image view, all_aspects would be the subset of aspects represented
|
||||
* by that particular view.
|
||||
*
|
||||
* Return the aspect's _format_ plane, not its _memory_ plane (using the
|
||||
* vocabulary of VK_EXT_image_drm_format_modifier). As a consequence, \a
|
||||
* aspect_mask may contain VK_IMAGE_ASPECT_PLANE_*, but must not contain
|
||||
* VK_IMAGE_ASPECT_MEMORY_PLANE_* .
|
||||
*/
|
||||
static inline uint32_t
|
||||
anv_image_aspect_to_plane(VkImageAspectFlags image_aspects,
|
||||
VkImageAspectFlags aspect_mask)
|
||||
anv_image_aspect_to_plane(VkImageAspectFlags all_aspects,
|
||||
VkImageAspectFlagBits aspect)
|
||||
{
|
||||
switch (aspect_mask) {
|
||||
assert(util_bitcount(aspect) == 1);
|
||||
if (util_bitcount(all_aspects) == 1)
|
||||
return 0;
|
||||
|
||||
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 ((image_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) == 0)
|
||||
if ((all_aspects & VK_IMAGE_ASPECT_DEPTH_BIT) == 0)
|
||||
return 0;
|
||||
FALLTHROUGH;
|
||||
case VK_IMAGE_ASPECT_PLANE_1_BIT:
|
||||
@@ -4373,7 +4382,7 @@ struct anv_image_view {
|
||||
|
||||
const struct anv_image *image; /**< VkImageViewCreateInfo::image */
|
||||
|
||||
VkImageAspectFlags aspect_mask;
|
||||
VkImageAspectFlags aspects;
|
||||
VkFormat vk_format;
|
||||
VkExtent3D extent; /**< Extent of VkImageViewCreateInfo::baseMipLevel. */
|
||||
|
||||
|
Reference in New Issue
Block a user