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