From 47565d31e1446ba872f4d6473feea2caa406db84 Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Wed, 21 Jun 2023 13:59:50 -0400 Subject: [PATCH] intel: Add and use isl_drm_modifier_get_plane_count We're going to enable the DG2_RC_CCS modifier in anv. Add and use this function to prepare for the new plane count that comes with that modifier. iris is left alone for now because it supports more modifiers than isl_drm_modifier_get_score is aware of. Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/isl/isl.h | 6 ++++++ src/intel/isl/isl_drm.c | 29 +++++++++++++++++++++++++++++ src/intel/vulkan/anv_formats.c | 14 ++++++++------ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index a104d90..64819fc 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -2305,6 +2305,12 @@ uint32_t isl_drm_modifier_get_score(const struct intel_device_info *devinfo, uint64_t modifier); +/* Return the number of planes used by an image with the given parameters. */ +uint32_t +isl_drm_modifier_get_plane_count(const struct intel_device_info *devinfo, + uint64_t modifier, + uint32_t fmt_planes); + struct isl_extent2d ATTRIBUTE_CONST isl_get_interleaved_msaa_px_size_sa(uint32_t samples); diff --git a/src/intel/isl/isl_drm.c b/src/intel/isl/isl_drm.c index eb00c62..01afc36 100644 --- a/src/intel/isl/isl_drm.c +++ b/src/intel/isl/isl_drm.c @@ -221,3 +221,32 @@ isl_drm_modifier_get_score(const struct intel_device_info *devinfo, return 4; } } + +uint32_t +isl_drm_modifier_get_plane_count(const struct intel_device_info *devinfo, + uint64_t modifier, + uint32_t fmt_planes) +{ + /* This function could return the wrong value if the modifier is not + * supported by the device. + */ + assert(isl_drm_modifier_get_score(devinfo, modifier) > 0); + + /* Planar images don't support clear color. */ + if (isl_drm_modifier_get_info(modifier)->supports_clear_color) + assert(fmt_planes == 1); + + if (devinfo->has_flat_ccs) { + if (isl_drm_modifier_get_info(modifier)->supports_clear_color) + return 2 * fmt_planes; + else + return 1 * fmt_planes; + } else { + if (isl_drm_modifier_get_info(modifier)->supports_clear_color) + return 3 * fmt_planes; + else if (isl_drm_modifier_has_aux(modifier)) + return 2 * fmt_planes; + else + return 1 * fmt_planes; + } +} diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c index 4ad6c09..40b4f11 100644 --- a/src/intel/vulkan/anv_formats.c +++ b/src/intel/vulkan/anv_formats.c @@ -895,9 +895,10 @@ get_drm_format_modifier_properties_list(const struct anv_physical_device *physic if (!features) continue; - uint32_t planes = anv_format->n_planes; - if (isl_mod_info->aux_usage != ISL_AUX_USAGE_NONE) - ++planes; + const uint32_t planes = + isl_drm_modifier_get_plane_count(&physical_device->info, + isl_mod_info->modifier, + anv_format->n_planes); vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, out_props) { *out_props = (VkDrmFormatModifierPropertiesEXT) { @@ -928,9 +929,10 @@ get_drm_format_modifier_properties_list_2(const struct anv_physical_device *phys if (!features2) continue; - uint32_t planes = anv_format->n_planes; - if (isl_mod_info->aux_usage != ISL_AUX_USAGE_NONE) - ++planes; + const uint32_t planes = + isl_drm_modifier_get_plane_count(&physical_device->info, + isl_mod_info->modifier, + anv_format->n_planes); vk_outarray_append_typed(VkDrmFormatModifierProperties2EXT, &out, out_props) { *out_props = (VkDrmFormatModifierProperties2EXT) { -- 2.7.4