From ab4beaf3fb015fce743acac9efb933c110881bf5 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 1 Jul 2022 10:43:21 +0300 Subject: [PATCH] isl: add new helper for format component compatibility Signed-off-by: Lionel Landwerlin Cc: mesa-stable Reviewed-by: Nanley Chery Part-of: --- src/intel/isl/isl.h | 3 +++ src/intel/isl/isl_format.c | 29 ++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h index 238841c277b..715a089cb8c 100644 --- a/src/intel/isl/isl.h +++ b/src/intel/isl/isl.h @@ -1872,6 +1872,9 @@ bool isl_formats_are_ccs_e_compatible(const struct intel_device_info *devinfo, uint8_t isl_format_get_aux_map_encoding(enum isl_format format); uint8_t isl_get_render_compression_format(enum isl_format format); +bool isl_formats_have_same_bits_per_channel(enum isl_format format1, + enum isl_format format2); + bool isl_format_has_unorm_channel(enum isl_format fmt) ATTRIBUTE_CONST; bool isl_format_has_snorm_channel(enum isl_format fmt) ATTRIBUTE_CONST; bool isl_format_has_ufloat_channel(enum isl_format fmt) ATTRIBUTE_CONST; diff --git a/src/intel/isl/isl_format.c b/src/intel/isl/isl_format.c index bfaddf14250..198ecdc196f 100644 --- a/src/intel/isl/isl_format.c +++ b/src/intel/isl/isl_format.c @@ -948,6 +948,27 @@ isl_format_supports_multisampling(const struct intel_device_info *devinfo, } } +/** + * Returns true if the two formats are component size compatible meaning that + * each component from one format has the same number of bits as the other + * format. + * + * This is useful to check whether an image used with 2 different formats can + * be fast cleared with a non 0 clear color. + */ +bool +isl_formats_have_same_bits_per_channel(enum isl_format format1, + enum isl_format format2) +{ + const struct isl_format_layout *fmtl1 = isl_format_get_layout(format1); + const struct isl_format_layout *fmtl2 = isl_format_get_layout(format2); + + return fmtl1->channels.r.bits == fmtl2->channels.r.bits && + fmtl1->channels.g.bits == fmtl2->channels.g.bits && + fmtl1->channels.b.bits == fmtl2->channels.b.bits && + fmtl1->channels.a.bits == fmtl2->channels.a.bits; +} + /** * Returns true if the two formats are "CCS_E compatible" meaning that you can * render in one format with CCS_E enabled and then texture using the other @@ -976,16 +997,10 @@ isl_formats_are_ccs_e_compatible(const struct intel_device_info *devinfo, if (format2 == ISL_FORMAT_A8_UNORM) format2 = ISL_FORMAT_R8_UNORM; - const struct isl_format_layout *fmtl1 = isl_format_get_layout(format1); - const struct isl_format_layout *fmtl2 = isl_format_get_layout(format2); - /* The compression used by CCS is not dependent on the actual data encoding * of the format but only depends on the bit-layout of the channels. */ - return fmtl1->channels.r.bits == fmtl2->channels.r.bits && - fmtl1->channels.g.bits == fmtl2->channels.g.bits && - fmtl1->channels.b.bits == fmtl2->channels.b.bits && - fmtl1->channels.a.bits == fmtl2->channels.a.bits; + return isl_formats_have_same_bits_per_channel(format1, format2); } static bool