intel/isl: Add a formats_are_ccs_e_compatible helper

Reviewed-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
This commit is contained in:
Jason Ekstrand 2017-02-01 11:46:54 -08:00
parent 6142e3c07c
commit 7e6a9d9c4b
3 changed files with 41 additions and 0 deletions

View file

@ -2395,11 +2395,17 @@ blorp_copy(struct blorp_batch *batch,
}
if (params.src.aux_usage == ISL_AUX_USAGE_CCS_E) {
assert(isl_formats_are_ccs_e_compatible(batch->blorp->isl_dev->info,
src_surf->surf->format,
params.src.view.format));
params.src.clear_color =
bitcast_color_value_to_uint(params.src.clear_color, src_fmtl);
}
if (params.dst.aux_usage == ISL_AUX_USAGE_CCS_E) {
assert(isl_formats_are_ccs_e_compatible(batch->blorp->isl_dev->info,
dst_surf->surf->format,
params.dst.view.format));
params.dst.clear_color =
bitcast_color_value_to_uint(params.dst.clear_color, dst_fmtl);
}

View file

@ -1047,6 +1047,10 @@ bool isl_format_supports_ccs_e(const struct gen_device_info *devinfo,
bool isl_format_supports_multisampling(const struct gen_device_info *devinfo,
enum isl_format format);
bool isl_formats_are_ccs_e_compatible(const struct gen_device_info *devinfo,
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;

View file

@ -504,6 +504,37 @@ isl_format_supports_multisampling(const struct gen_device_info *devinfo,
}
}
/**
* 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
* format without needing a resolve.
*
* Note: Even if the formats are compatible, special care must be taken if a
* clear color is involved because the encoding of the clear color is heavily
* format-dependent.
*/
bool
isl_formats_are_ccs_e_compatible(const struct gen_device_info *devinfo,
enum isl_format format1,
enum isl_format format2)
{
/* They must support CCS_E */
if (!isl_format_supports_ccs_e(devinfo, format1) ||
!isl_format_supports_ccs_e(devinfo, format2))
return false;
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;
}
static inline bool
isl_format_has_channel_type(enum isl_format fmt, enum isl_base_type type)
{