[Mesa-dev] [PATCH v2 2/5] intel/isl: Add a formats_are_ccs_e_compatible helper
Jason Ekstrand
jason at jlekstrand.net
Thu Feb 2 17:56:47 UTC 2017
Reviewed-by: Samuel Iglesias Gonsálvez <siglesias at igalia.com>
---
src/intel/blorp/blorp_blit.c | 6 ++++++
src/intel/isl/isl.h | 4 ++++
src/intel/isl/isl_format.c | 31 +++++++++++++++++++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/src/intel/blorp/blorp_blit.c b/src/intel/blorp/blorp_blit.c
index 8a944fb..b89a112 100644
--- a/src/intel/blorp/blorp_blit.c
+++ b/src/intel/blorp/blorp_blit.c
@@ -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);
}
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
index 47e4a1e..eff7218 100644
--- a/src/intel/isl/isl.h
+++ b/src/intel/isl/isl.h
@@ -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;
diff --git a/src/intel/isl/isl_format.c b/src/intel/isl/isl_format.c
index 00a9090..1cd941c 100644
--- a/src/intel/isl/isl_format.c
+++ b/src/intel/isl/isl_format.c
@@ -500,6 +500,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)
{
--
2.5.0.400.gff86faf
More information about the mesa-dev
mailing list