From 565d65baafc218209c09e04ff8b25e1518854bca Mon Sep 17 00:00:00 2001 From: Sagar Ghuge Date: Mon, 16 Mar 2020 10:14:53 -0700 Subject: [PATCH] anv: Enable CCS for storage image formats v2: (Jason Ekstrand) - Restructure if condition. - Add early return. v3: (Felix) - Don't set aux_supported to false for storage image on XeHPG. v4: (Nanley) - Check image view format against fmt_list. - Add helper anv_get_isl_format_with_usage. Signed-off-by: Sagar Ghuge Reviewed-by: Nanley Chery Part-of: --- src/intel/vulkan/anv_formats.c | 3 +- src/intel/vulkan/anv_image.c | 99 +++++++++++++++++++++++----------- src/intel/vulkan/anv_private.h | 4 +- 3 files changed, 73 insertions(+), 33 deletions(-) diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index eabe7c0fb7b..a43e06c8443 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -1084,7 +1084,8 @@ anv_get_image_format_properties( if (isl_mod_info->aux_usage == ISL_AUX_USAGE_CCS_E && !anv_formats_ccs_e_compatible(devinfo, info->flags, info->format, - info->tiling, format_list_info)) { + info->tiling, info->usage, + format_list_info)) { goto unsupported; } } diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index cb4ef3b9b38..f8f7cd1a003 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -365,20 +365,38 @@ anv_image_plane_needs_shadow_surface(const struct intel_device_info *devinfo, return false; } -bool -anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo, - VkImageCreateFlags create_flags, - VkFormat vk_format, - VkImageTiling vk_tiling, - const VkImageFormatListCreateInfoKHR *fmt_list) +static enum isl_format +anv_get_isl_format_with_usage(const struct intel_device_info *devinfo, + VkFormat vk_format, + VkImageAspectFlagBits vk_aspect, + VkImageUsageFlags vk_usage, + VkImageTiling vk_tiling) { - enum isl_format format = - anv_get_isl_format(devinfo, vk_format, - VK_IMAGE_ASPECT_COLOR_BIT, vk_tiling); + assert(util_bitcount(vk_usage) == 1); + enum isl_format format = anv_get_isl_format(devinfo, vk_format, vk_aspect, + vk_tiling); + if ((vk_usage == VK_IMAGE_USAGE_STORAGE_BIT) && + isl_is_storage_image_format(format)) + format = isl_lower_storage_image_format(devinfo, format); + + return format; +} + +static bool +formats_ccs_e_compatible(const struct intel_device_info *devinfo, + VkImageCreateFlags create_flags, + enum isl_format format, VkImageTiling vk_tiling, + VkImageUsageFlags vk_usage, + const VkImageFormatListCreateInfoKHR *fmt_list) +{ if (!isl_format_supports_ccs_e(devinfo, format)) return false; + /* For images created without MUTABLE_FORMAT_BIT set, we know that they will + * always be used with the original format. In particular, they will always + * be used with a format that supports color compression. + */ if (!(create_flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)) return true; @@ -387,8 +405,9 @@ anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo, for (uint32_t i = 0; i < fmt_list->viewFormatCount; i++) { enum isl_format view_format = - anv_get_isl_format(devinfo, fmt_list->pViewFormats[i], - VK_IMAGE_ASPECT_COLOR_BIT, vk_tiling); + anv_get_isl_format_with_usage(devinfo, fmt_list->pViewFormats[i], + VK_IMAGE_ASPECT_COLOR_BIT, vk_usage, + vk_tiling); if (!isl_formats_are_ccs_e_compatible(devinfo, format, view_format)) return false; @@ -397,6 +416,42 @@ anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo, return true; } +bool +anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo, + VkImageCreateFlags create_flags, + VkFormat vk_format, VkImageTiling vk_tiling, + VkImageUsageFlags vk_usage, + const VkImageFormatListCreateInfoKHR *fmt_list) +{ + enum isl_format format = + anv_get_isl_format_with_usage(devinfo, vk_format, + VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_USAGE_SAMPLED_BIT, vk_tiling); + + if (!formats_ccs_e_compatible(devinfo, create_flags, format, vk_tiling, + VK_IMAGE_USAGE_SAMPLED_BIT, fmt_list)) + return false; + + if (vk_usage & VK_IMAGE_USAGE_STORAGE_BIT) { + if (devinfo->verx10 < 125) + return false; + + enum isl_format lower_format = + anv_get_isl_format_with_usage(devinfo, vk_format, + VK_IMAGE_ASPECT_COLOR_BIT, + VK_IMAGE_USAGE_STORAGE_BIT, vk_tiling); + + if (!isl_formats_are_ccs_e_compatible(devinfo, format, lower_format)) + return false; + + if (!formats_ccs_e_compatible(devinfo, create_flags, format, vk_tiling, + VK_IMAGE_USAGE_STORAGE_BIT, fmt_list)) + return false; + } + + return true; +} + /** * For color images that have an auxiliary surface, request allocation for an * additional buffer that mainly stores fast-clear values. Use of this buffer @@ -660,20 +715,9 @@ add_aux_surface_if_supported(struct anv_device *device, return VK_SUCCESS; /* Choose aux usage */ - if (!(image->vk.usage & VK_IMAGE_USAGE_STORAGE_BIT) && - anv_formats_ccs_e_compatible(&device->info, - image->vk.create_flags, - image->vk.format, - image->vk.tiling, - fmt_list)) { - /* For images created without MUTABLE_FORMAT_BIT set, we know that - * they will always be used with the original format. In particular, - * they will always be used with a format that supports color - * compression. If it's never used as a storage image, then it will - * only be used through the sampler or the as a render target. This - * means that it's safe to just leave compression on at all times for - * these formats. - */ + if (anv_formats_ccs_e_compatible(&device->info, image->vk.create_flags, + image->vk.format, image->vk.tiling, + image->vk.usage, fmt_list)) { image->planes[plane].aux_usage = ISL_AUX_USAGE_CCS_E; } else if (device->info.ver >= 12) { anv_perf_warn(VK_LOG_OBJS(&image->vk.base), @@ -2059,11 +2103,6 @@ anv_layout_to_aux_state(const struct intel_device_info * const devinfo, } } - if (usage & VK_IMAGE_USAGE_STORAGE_BIT) { - aux_supported = false; - clear_supported = false; - } - if (usage & (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) { diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 288368b875c..05ce612553e 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -3847,8 +3847,8 @@ anv_get_isl_format(const struct intel_device_info *devinfo, VkFormat vk_format, bool anv_formats_ccs_e_compatible(const struct intel_device_info *devinfo, VkImageCreateFlags create_flags, - VkFormat vk_format, - VkImageTiling vk_tiling, + VkFormat vk_format, VkImageTiling vk_tiling, + VkImageUsageFlags vk_usage, const VkImageFormatListCreateInfoKHR *fmt_list); extern VkFormat