Mesa (staging/21.3): anv: Stop doing too much per-sample shading

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Dec 12 22:36:42 UTC 2021


Module: Mesa
Branch: staging/21.3
Commit: 26c1fea098765ca035e5fe5a685fc0f36c062529
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=26c1fea098765ca035e5fe5a685fc0f36c062529

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Thu Dec  2 14:42:16 2021 -0600

anv: Stop doing too much per-sample shading

We were setting anv_pipeline::sample_shading_enable based on
sampleShadingEnable without looking at minSampleShading.  We would then
pass this value into nir_lower_wpos_center which would add sample_pos to
frag_coord.  Then the back-end compiler picks up on the existence of
sample_pos and forces persample dispatch.  This leads to doing
per-sample dispatch whenever sampleShadingEnable = VK_TRUE regardless of
the value of minSampleShading.  This is almost certainly costing us
perf somewhere.

Cc: mesa-stable at lists.freedesktop.org
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14022>
(cherry picked from commit 1f559930b6b7a633d93cd4e9cc4965b3f5e7c607)

---

 .pick_status.json               |  2 +-
 src/intel/vulkan/anv_pipeline.c | 41 +++++++++++++++++++----------------------
 2 files changed, 20 insertions(+), 23 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 6b2a3f5434c..8d78939481f 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -148,7 +148,7 @@
         "description": "anv: Stop doing too much per-sample shading",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index 1b5a53544e5..e03218ce9e2 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -497,6 +497,13 @@ pipeline_has_coarse_pixel(const struct anv_graphics_pipeline *pipeline,
    return true;
 }
 
+static bool
+is_sample_shading(const VkPipelineMultisampleStateCreateInfo *ms_info)
+{
+   return ms_info->sampleShadingEnable &&
+      (ms_info->minSampleShading * ms_info->rasterizationSamples) > 1;
+}
+
 static void
 populate_wm_prog_key(const struct anv_graphics_pipeline *pipeline,
                      VkPipelineShaderStageCreateFlags flags,
@@ -545,15 +552,8 @@ populate_wm_prog_key(const struct anv_graphics_pipeline *pipeline,
    key->alpha_test_replicate_alpha = false;
 
    if (ms_info) {
-      /* We should probably pull this out of the shader, but it's fairly
-       * harmless to compute it and then let dead-code take care of it.
-       */
-      if (ms_info->rasterizationSamples > 1) {
-         key->persample_interp = ms_info->sampleShadingEnable &&
-            (ms_info->minSampleShading * ms_info->rasterizationSamples) > 1;
-         key->multisample_fbo = true;
-      }
-
+      key->persample_interp = is_sample_shading(ms_info);
+      key->multisample_fbo = ms_info->rasterizationSamples > 1;
       key->frag_coord_adds_sample_pos = key->persample_interp;
    }
 
@@ -2403,10 +2403,16 @@ anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
                            PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT);
    pipeline->depth_clip_enable = clip_info ? clip_info->depthClipEnable : !pipeline->depth_clamp_enable;
 
-   pipeline->sample_shading_enable =
-      !pCreateInfo->pRasterizationState->rasterizerDiscardEnable &&
-      pCreateInfo->pMultisampleState &&
-      pCreateInfo->pMultisampleState->sampleShadingEnable;
+   /* If rasterization is not enabled, ms_info must be ignored. */
+   const bool raster_enabled =
+      !pCreateInfo->pRasterizationState->rasterizerDiscardEnable ||
+      (pipeline->dynamic_states &
+       ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE);
+
+   const VkPipelineMultisampleStateCreateInfo *ms_info =
+      raster_enabled ? pCreateInfo->pMultisampleState : NULL;
+
+   pipeline->sample_shading_enable = ms_info && is_sample_shading(ms_info);
 
    result = anv_pipeline_compile_graphics(pipeline, cache, pCreateInfo);
    if (result != VK_SUCCESS) {
@@ -2488,15 +2494,6 @@ anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
          pipeline->topology = vk_to_intel_primitive_type[ia_info->topology];
    }
 
-   /* If rasterization is not enabled, ms_info must be ignored. */
-   const bool raster_enabled =
-      !pCreateInfo->pRasterizationState->rasterizerDiscardEnable ||
-      (pipeline->dynamic_states &
-       ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE);
-
-   const VkPipelineMultisampleStateCreateInfo *ms_info =
-      raster_enabled ? pCreateInfo->pMultisampleState : NULL;
-
    const VkPipelineRasterizationLineStateCreateInfoEXT *line_info =
       vk_find_struct_const(pCreateInfo->pRasterizationState->pNext,
                            PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT);



More information about the mesa-commit mailing list