intel/isl: Add a format_supports_multisampling helper
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 2 Sep 2016 01:57:01 +0000 (18:57 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 3 Oct 2016 21:53:01 +0000 (14:53 -0700)
Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Chad Versace <chadversary@chromium.org>
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
src/intel/isl/isl.h
src/intel/isl/isl_format.c
src/intel/isl/isl_gen6.c
src/intel/isl/isl_gen7.c
src/intel/isl/isl_gen8.c

index d2f0e16849510feae33c15ec8a8a3f465f5df327..29fb3d07f9abe4f6ec8277704068a35ddb698621 100644 (file)
@@ -1030,6 +1030,8 @@ bool isl_format_supports_vertex_fetch(const struct gen_device_info *devinfo,
                                       enum isl_format format);
 bool isl_format_supports_lossless_compression(const struct gen_device_info *devinfo,
                                               enum isl_format format);
+bool isl_format_supports_multisampling(const struct gen_device_info *devinfo,
+                                       enum isl_format format);
 
 bool isl_format_has_unorm_channel(enum isl_format fmt) ATTRIBUTE_CONST;
 bool isl_format_has_snorm_channel(enum isl_format fmt) ATTRIBUTE_CONST;
index 2804463b12781fc92ee0803645d5a81997deb376..81c01e0b8ca4cce86c1d1002cdc11a9871156680 100644 (file)
@@ -429,6 +429,34 @@ isl_format_supports_lossless_compression(const struct gen_device_info *devinfo,
    return format_gen(devinfo) >= format_info[format].lossless_compression;
 }
 
+bool
+isl_format_supports_multisampling(const struct gen_device_info *devinfo,
+                                  enum isl_format format)
+{
+   /* From the Sandybridge PRM, Volume 4 Part 1 p72, SURFACE_STATE, Surface
+    * Format:
+    *
+    *    If Number of Multisamples is set to a value other than
+    *    MULTISAMPLECOUNT_1, this field cannot be set to the following
+    *    formats:
+    *
+    *       - any format with greater than 64 bits per element
+    *       - any compressed texture format (BC*)
+    *       - any YCRCB* format
+    *
+    * The restriction on the format's size is removed on Broadwell.
+    */
+   if (devinfo->gen < 8 && isl_format_get_layout(format)->bpb > 64) {
+      return false;
+   } else if (isl_format_is_compressed(format)) {
+      return false;
+   } else if (isl_format_is_yuv(format)) {
+      return false;
+   } else {
+      return true;
+   }
+}
+
 static inline bool
 isl_format_has_channel_type(enum isl_format fmt, enum isl_base_type type)
 {
index 2c52e38fdbb66dc11d142165b5ec9ccb14217708..b30998d044dd696aa559b7823251f65a68eae0a6 100644 (file)
@@ -30,8 +30,6 @@ gen6_choose_msaa_layout(const struct isl_device *dev,
                   enum isl_tiling tiling,
                   enum isl_msaa_layout *msaa_layout)
 {
-   const struct isl_format_layout *fmtl = isl_format_get_layout(info->format);
-
    assert(ISL_DEV_GEN(dev) == 6);
    assert(info->samples >= 1);
 
@@ -40,22 +38,7 @@ gen6_choose_msaa_layout(const struct isl_device *dev,
       return false;
    }
 
-   /* From the Sandybridge PRM, Volume 4 Part 1 p72, SURFACE_STATE, Surface
-    * Format:
-    *
-    *    If Number of Multisamples is set to a value other than
-    *    MULTISAMPLECOUNT_1, this field cannot be set to the following
-    *    formats:
-    *
-    *       - any format with greater than 64 bits per element
-    *       - any compressed texture format (BC*)
-    *       - any YCRCB* format
-    */
-   if (fmtl->bpb > 64)
-      return false;
-   if (isl_format_is_compressed(info->format))
-      return false;
-   if (isl_format_is_yuv(info->format))
+   if (!isl_format_supports_multisampling(dev->info, info->format))
       return false;
 
    /* From the Sandybridge PRM, Volume 4 Part 1 p85, SURFACE_STATE, Number of
index 4f1cc9d5f1ad2b6fa8afa51e7a96c4d8f29013e4..a2a9486211d6d763f2365771e3898ad510ff3880 100644 (file)
@@ -30,8 +30,6 @@ gen7_choose_msaa_layout(const struct isl_device *dev,
                         enum isl_tiling tiling,
                         enum isl_msaa_layout *msaa_layout)
 {
-   const struct isl_format_layout *fmtl = isl_format_get_layout(info->format);
-
    bool require_array = false;
    bool require_interleaved = false;
 
@@ -43,19 +41,7 @@ gen7_choose_msaa_layout(const struct isl_device *dev,
       return true;
    }
 
-   /* From the Ivybridge PRM, Volume 4 Part 1 p63, SURFACE_STATE, Surface
-    * Format:
-    *
-    *    If Number of Multisamples is set to a value other than
-    *    MULTISAMPLECOUNT_1, this field cannot be set to the following
-    *    formats: any format with greater than 64 bits per element, any
-    *    compressed texture format (BC*), and any YCRCB* format.
-    */
-   if (fmtl->bpb > 64)
-      return false;
-   if (isl_format_is_compressed(info->format))
-      return false;
-   if (isl_format_is_yuv(info->format))
+   if (!isl_format_supports_multisampling(dev->info, info->format))
       return false;
 
    /* From the Ivybridge PRM, Volume 4 Part 1 p73, SURFACE_STATE, Number of
index b456d701f09b280ca95cb829a19ee95c0af9f0a8..0049614a0f4b70aa5d81b96ffd243ed9fbf21f08 100644 (file)
@@ -79,9 +79,7 @@ gen8_choose_msaa_layout(const struct isl_device *dev,
    /* More obvious restrictions */
    if (isl_surf_usage_is_display(info->usage))
       return false;
-   if (isl_format_is_compressed(info->format))
-      return false;
-   if (isl_format_is_yuv(info->format))
+   if (!isl_format_supports_multisampling(dev->info, info->format))
       return false;
 
    if (isl_surf_usage_is_depth_or_stencil(info->usage) ||