[Mesa-dev] [PATCH] anv/formats: handle correctly multisamples in gen7

Juan A. Suarez Romero jasuarez at igalia.com
Wed Feb 15 18:09:26 UTC 2017


According to Ivybridge PRM, Volume 4 Part 1 p73, signed integer formats
cannot be multisampled.

Also in the same PRM p63, any format with greater than 64 bits per
element cannot be multisampled.

This fixes the following Vulkan CTS tests in Haswell:

dEQP-VK.memory.requirements.image.regular_tiling_optimal
dEQP-VK.memory.requirements.image.transient_tiling_optimal

It also fixes crashes in the following Vulkan CTS tests in Haswell (becoming now
skip):

dEQP-VK.glsl.texture_functions.query.texturesamples.isampler2dms_fragment
dEQP-VK.glsl.texture_functions.query.texturesamples.isampler2dms_vertex
dEQP-VK.glsl.texture_functions.query.texturesamples.isampler2dmsarray_fragment
dEQP-VK.glsl.texture_functions.query.texturesamples.isampler2dmsarray_vertex
dEQP-VK.pipeline.multisample.sampled_image.64x64_1.r16g16_sint.samples_4
dEQP-VK.pipeline.multisample.sampled_image.64x64_1.r16g16_sint.samples_8
dEQP-VK.pipeline.multisample.sampled_image.64x64_1.r32g32b32a32_sfloat.samples_4
dEQP-VK.pipeline.multisample.sampled_image.64x64_1.r32g32b32a32_sfloat.samples_8
dEQP-VK.pipeline.multisample.sampled_image.64x64_4.r16g16_sint.samples_4
dEQP-VK.pipeline.multisample.sampled_image.64x64_4.r16g16_sint.samples_8
dEQP-VK.pipeline.multisample.sampled_image.64x64_4.r32g32b32a32_sfloat.samples_4
dEQP-VK.pipeline.multisample.sampled_image.64x64_4.r32g32b32a32_sfloat.samples_8
dEQP-VK.pipeline.multisample.sampled_image.79x31_1.r16g16_sint.samples_4
dEQP-VK.pipeline.multisample.sampled_image.79x31_1.r16g16_sint.samples_8
dEQP-VK.pipeline.multisample.sampled_image.79x31_1.r32g32b32a32_sfloat.samples_4
dEQP-VK.pipeline.multisample.sampled_image.79x31_1.r32g32b32a32_sfloat.samples_8
dEQP-VK.pipeline.multisample.sampled_image.79x31_4.r16g16_sint.samples_4
dEQP-VK.pipeline.multisample.sampled_image.79x31_4.r16g16_sint.samples_8
dEQP-VK.pipeline.multisample.sampled_image.79x31_4.r32g32b32a32_sfloat.samples_4
dEQP-VK.pipeline.multisample.sampled_image.79x31_4.r32g32b32a32_sfloat.samples_8

Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
---
 src/intel/vulkan/anv_device.c  |  4 ++--
 src/intel/vulkan/anv_formats.c | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index d1a6cc8..a8ab8c3 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -622,12 +622,12 @@ void anv_GetPhysicalDeviceProperties(
       .maxFramebufferWidth                      = (1 << 14),
       .maxFramebufferHeight                     = (1 << 14),
       .maxFramebufferLayers                     = (1 << 11),
-      .framebufferColorSampleCounts             = sample_counts,
+      .framebufferColorSampleCounts             = devinfo->gen == 7 ? VK_SAMPLE_COUNT_1_BIT : sample_counts,
       .framebufferDepthSampleCounts             = sample_counts,
       .framebufferStencilSampleCounts           = sample_counts,
       .framebufferNoAttachmentsSampleCounts     = sample_counts,
       .maxColorAttachments                      = MAX_RTS,
-      .sampledImageColorSampleCounts            = sample_counts,
+      .sampledImageColorSampleCounts            = devinfo->gen == 7 ? VK_SAMPLE_COUNT_1_BIT : sample_counts,
       .sampledImageIntegerSampleCounts          = VK_SAMPLE_COUNT_1_BIT,
       .sampledImageDepthSampleCounts            = sample_counts,
       .sampledImageStencilSampleCounts          = sample_counts,
diff --git a/src/intel/vulkan/anv_formats.c b/src/intel/vulkan/anv_formats.c
index 6005791..3eac931 100644
--- a/src/intel/vulkan/anv_formats.c
+++ b/src/intel/vulkan/anv_formats.c
@@ -561,6 +561,38 @@ anv_get_image_format_properties(
       sampleCounts = isl_device_get_sample_counts(&physical_device->isl_dev);
    }
 
+   /*
+    * From the Ivybridge PRM, Volume 4 Part 1 p73, SURFACE_STATE, Number of
+    * Multisamples:
+    *
+    *    - This field must be set to MULTISAMPLECOUNT_1 for SINT MSRTs when
+    *      all RT channels are not written.
+    *
+    * And errata from the Ivybridge PRM, Volume 4 Part 1 p77,
+    * RENDER_SURFACE_STATE, MCS Enable:
+    *
+    *   This field must be set to 0 [MULTISAMPLECOUNT_1] for all SINT MSRTs
+    *   when all RT channels are not written.
+    *
+    * Note that the above SINT restrictions apply only to *MSRTs* (that is,
+    * *multisampled* render targets). The restrictions seem to permit an MCS
+    * if the render target is singlesampled.
+    *
+    * 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, if Number
+    *    of Multisamples is MULTISAMPLECOUNT_8, any compressed texture format
+    *    (BC*), and any YCRCB* format.
+    */
+   if (physical_device->info.gen < 8 &&
+       (isl_format_has_sint_channel(anv_formats[info->format].isl_format) ||
+        isl_format_get_layout(anv_formats[info->format].isl_format)->bpb > 64)) {
+      sampleCounts = VK_SAMPLE_COUNT_1_BIT;
+   }
+
    if (info->usage & (VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
                       VK_IMAGE_USAGE_TRANSFER_DST_BIT)) {
       /* Accept transfers on anything we can sample from or renderer to. */
-- 
2.9.3



More information about the mesa-dev mailing list