[Mesa-dev] [PATCH 3/5] intel/isl: Add a formats_are_ccs_e_compatible helper

Chad Versace chadversary at chromium.org
Thu Feb 2 18:15:54 UTC 2017


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 <chadversary at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list