mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 13:20:14 +01:00
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 <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14022>
This commit is contained in:
parent
5197809302
commit
1f559930b6
1 changed files with 19 additions and 21 deletions
|
|
@ -497,6 +497,13 @@ pipeline_has_coarse_pixel(const struct anv_graphics_pipeline *pipeline,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
is_sample_shading(const VkPipelineMultisampleStateCreateInfo *ms_info)
|
||||||
|
{
|
||||||
|
return ms_info->sampleShadingEnable &&
|
||||||
|
(ms_info->minSampleShading * ms_info->rasterizationSamples) > 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
populate_wm_prog_key(const struct anv_graphics_pipeline *pipeline,
|
populate_wm_prog_key(const struct anv_graphics_pipeline *pipeline,
|
||||||
VkPipelineShaderStageCreateFlags flags,
|
VkPipelineShaderStageCreateFlags flags,
|
||||||
|
|
@ -542,14 +549,8 @@ populate_wm_prog_key(const struct anv_graphics_pipeline *pipeline,
|
||||||
key->alpha_test_replicate_alpha = false;
|
key->alpha_test_replicate_alpha = false;
|
||||||
|
|
||||||
if (ms_info) {
|
if (ms_info) {
|
||||||
/* We should probably pull this out of the shader, but it's fairly
|
key->persample_interp = is_sample_shading(ms_info);
|
||||||
* harmless to compute it and then let dead-code take care of it.
|
key->multisample_fbo = ms_info->rasterizationSamples > 1;
|
||||||
*/
|
|
||||||
if (ms_info->rasterizationSamples > 1) {
|
|
||||||
key->persample_interp = ms_info->sampleShadingEnable &&
|
|
||||||
(ms_info->minSampleShading * ms_info->rasterizationSamples) > 1;
|
|
||||||
key->multisample_fbo = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
key->coarse_pixel =
|
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_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT);
|
||||||
pipeline->depth_clip_enable = clip_info ? clip_info->depthClipEnable : !pipeline->depth_clamp_enable;
|
pipeline->depth_clip_enable = clip_info ? clip_info->depthClipEnable : !pipeline->depth_clamp_enable;
|
||||||
|
|
||||||
pipeline->sample_shading_enable =
|
/* If rasterization is not enabled, ms_info must be ignored. */
|
||||||
!pCreateInfo->pRasterizationState->rasterizerDiscardEnable &&
|
const bool raster_enabled =
|
||||||
pCreateInfo->pMultisampleState &&
|
!pCreateInfo->pRasterizationState->rasterizerDiscardEnable ||
|
||||||
pCreateInfo->pMultisampleState->sampleShadingEnable;
|
(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);
|
result = anv_pipeline_compile_graphics(pipeline, cache, pCreateInfo);
|
||||||
if (result != VK_SUCCESS) {
|
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];
|
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 =
|
const VkPipelineRasterizationLineStateCreateInfoEXT *line_info =
|
||||||
vk_find_struct_const(pCreateInfo->pRasterizationState->pNext,
|
vk_find_struct_const(pCreateInfo->pRasterizationState->pNext,
|
||||||
PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT);
|
PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue