<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On Feb 20, 2017 4:47 AM, "Lionel Landwerlin" <<a href="mailto:lionel.g.landwerlin@intel.com">lionel.g.landwerlin@intel.com</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">On 18/02/17 00:03, Jason Ekstrand wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
This just enables basic MSAA compression (no fast clears) for all<br>
multisampled surfaces.  This improves the framerate of the Sascha<br>
"multisampling" demo by 76% on my Sky Lake laptop.  Running Talos on<br>
medium settings with 8x MSAA, this improves the framerate in the<br>
benchmark by 80%.<br>
---<br>
  src/intel/vulkan/TODO              |  2 +-<br>
  src/intel/vulkan/anv_blorp.c       |  3 ++-<br>
  src/intel/vulkan/anv_image.c       |  8 ++++++++<br>
  src/intel/vulkan/anv_pipeline.<wbr>c    | 14 ++++++++++++++<br>
  src/intel/vulkan/genX_cmd_buff<wbr>er.c |  5 +++++<br>
  5 files changed, 30 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/TODO b/src/intel/vulkan/TODO<br>
index f8b73a1..daab39f 100644<br>
--- a/src/intel/vulkan/TODO<br>
+++ b/src/intel/vulkan/TODO<br>
@@ -9,7 +9,7 @@ Missing Features:<br>
    Performance:<br>
   - Multi-{sampled/gen8,LOD} HiZ<br>
- - Compressed multisample support<br>
+ - MSAA fast clears<br>
   - Pushing pieces of UBOs?<br>
   - Enable guardband clipping<br>
   - Use soft-pin to avoid relocations<br>
diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c<br>
index 4e7078b..902d9af 100644<br>
--- a/src/intel/vulkan/anv_blorp.c<br>
+++ b/src/intel/vulkan/anv_blorp.c<br>
@@ -1397,7 +1397,8 @@ ccs_resolve_attachment(struct anv_cmd_buffer *cmd_buffer,<br>
     struct anv_attachment_state *att_state =<br>
        &cmd_buffer->state.attachments<wbr>[att];<br>
  -   if (att_state->aux_usage == ISL_AUX_USAGE_NONE)<br>
+   if (att_state->aux_usage == ISL_AUX_USAGE_NONE ||<br>
+       att_state->aux_usage == ISL_AUX_USAGE_MCS)<br>
        return; /* Nothing to resolve */<br>
       assert(att_state->aux_usage == ISL_AUX_USAGE_CCS_E ||<br>
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c<br>
index 7eb0f8f..cc47a50 100644<br>
--- a/src/intel/vulkan/anv_image.c<br>
+++ b/src/intel/vulkan/anv_image.c<br>
@@ -238,6 +238,14 @@ make_surface(const struct anv_device *dev,<br>
              }<br>
           }<br>
        }<br>
+   } else if (aspect == VK_IMAGE_ASPECT_COLOR_BIT && vk_info->samples > 1) {<br>
+      assert(image->aux_surface.isl.<wbr>size == 0);<br>
+      assert(!(vk_info->usage & VK_IMAGE_USAGE_STORAGE_BIT));<br>
+      ok = isl_surf_get_mcs_surf(&dev->is<wbr>l_dev, &anv_surf->isl,<br>
+                                 &image->aux_surface.isl);<br>
+      assert(ok);<br>
</blockquote>
<br></div>
Overall looks good to me, but I think you should drop the assert here.<br>
Looking at the internal documentation I found a 8k width constraint at 16x msaa (look at SURFACE_STATE's width field, only applies SKL+).<br>
So I guess we fallback to not use the MCS in that case.</blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Good catch.  Unfortunately, this means it's going to take just a little more work for is to support compression.  Part of what makes this patch so simple is the assumption that we can just turn it on all the time.  If that isn't a valid assumption them we may need to make some compiler changes.  I'll have to run some experiments on sky lake.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="elided-text">
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      add_surface(image, &image->aux_surface);<br>
+      image->aux_usage = ISL_AUX_USAGE_MCS;<br>
     }<br>
       return VK_SUCCESS;<br>
diff --git a/src/intel/vulkan/anv_pipelin<wbr>e.c b/src/intel/vulkan/anv_pipelin<wbr>e.c<br>
index 4410103..3301679 100644<br>
--- a/src/intel/vulkan/anv_pipelin<wbr>e.c<br>
+++ b/src/intel/vulkan/anv_pipelin<wbr>e.c<br>
@@ -228,6 +228,20 @@ static void<br>
  populate_sampler_prog_key(cons<wbr>t struct gen_device_info *devinfo,<br>
                            struct brw_sampler_prog_key_data *key)<br>
  {<br>
+   /* All multisampled textures are compressed. */<br>
+   key->compressed_multisample_l<wbr>ayout_mask = ~0;<br>
+<br>
+   /* SkyLake added support for 16x MSAA.  With this came a new message for<br>
+    * reading from a 16x MSAA surface with compression.  The new message was<br>
+    * needed because now the MCS data is 64 bits instead of 32 or lower as is<br>
+    * the case for 8x, 4x, and 2x.  The key->msaa_16 bit-field controls which<br>
+    * message we use.  Fortunately, the 16x message works for 8x, 4x, and 2x<br>
+    * so we can just use it unconditionally.  This may not be quite as<br>
+    * efficient but it saves us from recompiling.<br>
+    */<br>
+   if (devinfo->gen >= 9)<br>
+      key->msaa_16 = ~0;<br>
+<br>
     /* XXX: Handle texture swizzle on HSW- */<br>
     for (int i = 0; i < MAX_SAMPLERS; i++) {<br>
        /* Assume color sampler, no swizzling. (Works for BDW+) */<br>
diff --git a/src/intel/vulkan/genX_cmd_bu<wbr>ffer.c b/src/intel/vulkan/genX_cmd_bu<wbr>ffer.c<br>
index 40a72f4..5d8c3ea 100644<br>
--- a/src/intel/vulkan/genX_cmd_bu<wbr>ffer.c<br>
+++ b/src/intel/vulkan/genX_cmd_bu<wbr>ffer.c<br>
@@ -222,6 +222,11 @@ color_attachment_compute_aux_u<wbr>sage(struct anv_device *device,<br>
        att_state->input_aux_usage = ISL_AUX_USAGE_NONE;<br>
        att_state->fast_clear = false;<br>
        return;<br>
+   } else if (iview->image->aux_usage == ISL_AUX_USAGE_MCS) {<br>
+      att_state->aux_usage = ISL_AUX_USAGE_MCS;<br>
+      att_state->input_aux_usage = ISL_AUX_USAGE_MCS;<br>
+      att_state->fast_clear = false;<br>
+      return;<br>
     }<br>
       assert(iview->image->aux_surf<wbr>ace.isl.usage & ISL_SURF_USAGE_CCS_BIT);<br>
</blockquote>
<br>
<br>
</div></blockquote></div><br></div></div></div>