mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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:
parent
6142e3c07c
commit
7e6a9d9c4b
3 changed files with 41 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue