diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index a104d906923..64819fc1f22 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 eb00c62c197..01afc361199 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 4ad6c0963a5..40b4f1110bd 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) {