From 1f559930b6b7a633d93cd4e9cc4965b3f5e7c607 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 2 Dec 2021 14:42:16 -0600 Subject: [PATCH] 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@lists.freedesktop.org Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/anv_pipeline.c | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c index 0fbb15d..ba02871 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, @@ -542,14 +549,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->coarse_pixel = @@ -2414,10 +2415,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) { @@ -2499,15 +2506,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); -- 2.7.4