On Wed 01 Feb 2017, Jason Ekstrand wrote: > --- > 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 2705595..5e2d796 100644 > --- a/src/intel/isl/isl_format.c > +++ b/src/intel/isl/isl_format.c > @@ -497,6 +497,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, format1)) > + 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. > + */
I would rephrase the comment to say "depends on the bit-size of each channel". "layout" implies ordering, which is irrelevant iiuc. Despite the nit, this patch is Reviewed-by: Chad Versace <chadvers...@chromium.org> > + 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 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev