summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-09-01 18:57:01 -0700
committerJason Ekstrand <[email protected]>2016-10-03 14:53:01 -0700
commit5637f3f1202b46ff02c80e743dd84752a040685a (patch)
tree44d2b312053204f14dc752ecb77ed13f9d5578e5 /src
parentb7a0f2e1f769314d88d902c8506250d18393d359 (diff)
intel/isl: Add a format_supports_multisampling helper
Signed-off-by: Jason Ekstrand <[email protected]> Reviewed-by: Chad Versace <[email protected]> Reviewed-by: Nanley Chery <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/isl/isl.h2
-rw-r--r--src/intel/isl/isl_format.c28
-rw-r--r--src/intel/isl/isl_gen6.c19
-rw-r--r--src/intel/isl/isl_gen7.c16
-rw-r--r--src/intel/isl/isl_gen8.c4
5 files changed, 33 insertions, 36 deletions
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
index d2f0e168495..29fb3d07f9a 100644
--- a/src/intel/isl/isl.h
+++ b/src/intel/isl/isl.h
@@ -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;
diff --git a/src/intel/isl/isl_format.c b/src/intel/isl/isl_format.c
index 2804463b127..81c01e0b8ca 100644
--- a/src/intel/isl/isl_format.c
+++ b/src/intel/isl/isl_format.c
@@ -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)
{
diff --git a/src/intel/isl/isl_gen6.c b/src/intel/isl/isl_gen6.c
index 2c52e38fdbb..b30998d044d 100644
--- a/src/intel/isl/isl_gen6.c
+++ b/src/intel/isl/isl_gen6.c
@@ -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
diff --git a/src/intel/isl/isl_gen7.c b/src/intel/isl/isl_gen7.c
index 4f1cc9d5f1a..a2a9486211d 100644
--- a/src/intel/isl/isl_gen7.c
+++ b/src/intel/isl/isl_gen7.c
@@ -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
diff --git a/src/intel/isl/isl_gen8.c b/src/intel/isl/isl_gen8.c
index b456d701f09..0049614a0f4 100644
--- a/src/intel/isl/isl_gen8.c
+++ b/src/intel/isl/isl_gen8.c
@@ -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) ||