Module: Mesa Branch: main Commit: 0e33dba6256f0da5882a55081616004d3f5dc1e2 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=0e33dba6256f0da5882a55081616004d3f5dc1e2
Author: Faith Ekstrand <faith.ekstr...@collabora.com> Date: Thu Jan 11 18:17:31 2024 -0600 nvk: Move SET_HYBRID_ANTI_ALIAS_CONTROL to draw time Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27025> --- src/nouveau/vulkan/nvk_cmd_draw.c | 15 +++++++++++++-- src/nouveau/vulkan/nvk_graphics_pipeline.c | 24 +++++++----------------- src/nouveau/vulkan/nvk_pipeline.h | 2 ++ 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index bde6429f597..d2851e48c81 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -1428,13 +1428,13 @@ nvk_flush_ms_state(struct nvk_cmd_buffer *cmd) &cmd->vk.dynamic_graphics_state; if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_MS_RASTERIZATION_SAMPLES)) { + struct nv_push *p = nvk_cmd_buffer_push(cmd, 4); + /* When we don't have any attachments, we can't know the sample count * from the render pass so we need to emit SET_ANTI_ALIAS here. See the * comment in nvk_BeginRendering() for more details. */ if (render->samples == 0) { - struct nv_push *p = nvk_cmd_buffer_push(cmd, 2); - /* Multisample information MAY be missing (rasterizationSamples == 0) * if rasterizer discard is enabled. However, this isn't valid in * the hardware so always use at least one sample. @@ -1449,6 +1449,17 @@ nvk_flush_ms_state(struct nvk_cmd_buffer *cmd) assert(dyn->ms.rasterization_samples == 0 || dyn->ms.rasterization_samples == render->samples); } + + const struct nvk_graphics_pipeline *pipeline = cmd->state.gfx.pipeline; + uint32_t min_samples = ceilf(dyn->ms.rasterization_samples * + pipeline->min_sample_shading); + min_samples = util_next_power_of_two(MAX2(1, min_samples)); + + P_IMMD(p, NV9097, SET_HYBRID_ANTI_ALIAS_CONTROL, { + .passes = min_samples, + .centroid = min_samples > 1 ? CENTROID_PER_PASS + : CENTROID_PER_FRAGMENT, + }); } if (BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_MS_ALPHA_TO_COVERAGE_ENABLE) || diff --git a/src/nouveau/vulkan/nvk_graphics_pipeline.c b/src/nouveau/vulkan/nvk_graphics_pipeline.c index 61b489bb01a..019ecd56ca7 100644 --- a/src/nouveau/vulkan/nvk_graphics_pipeline.c +++ b/src/nouveau/vulkan/nvk_graphics_pipeline.c @@ -46,22 +46,6 @@ nvk_populate_fs_key(struct nak_fs_key *key, key->force_sample_shading = true; } -static void -emit_pipeline_ms_state(struct nv_push *p, - const struct vk_multisample_state *ms, - bool force_max_samples) -{ - const float min_sample_shading = force_max_samples ? 1 : - (ms->sample_shading_enable ? CLAMP(ms->min_sample_shading, 0, 1) : 0); - uint32_t min_samples = ceilf(ms->rasterization_samples * min_sample_shading); - min_samples = util_next_power_of_two(MAX2(1, min_samples)); - - P_IMMD(p, NV9097, SET_HYBRID_ANTI_ALIAS_CONTROL, { - .passes = min_samples, - .centroid = min_samples > 1 ? CENTROID_PER_PASS : CENTROID_PER_FRAGMENT, - }); -} - static void emit_pipeline_ct_write_state(struct nv_push *p, const struct vk_color_blend_state *cb, @@ -435,11 +419,17 @@ nvk_graphics_pipeline_create(struct nvk_device *dev, emit_pipeline_xfb_state(&push, &last_geom->info.vtg.xfb); - if (state.ms) emit_pipeline_ms_state(&push, state.ms, force_max_samples); emit_pipeline_ct_write_state(&push, state.cb, state.rp); pipeline->push_dw_count = nv_push_dw_count(&push); + if (force_max_samples) + pipeline->min_sample_shading = 1; + else if (state.ms != NULL && state.ms->sample_shading_enable) + pipeline->min_sample_shading = CLAMP(state.ms->min_sample_shading, 0, 1); + else + pipeline->min_sample_shading = 0; + pipeline->dynamic.vi = &pipeline->_dynamic_vi; pipeline->dynamic.ms.sample_locations = &pipeline->_dynamic_sl; vk_dynamic_graphics_state_fill(&pipeline->dynamic, &state); diff --git a/src/nouveau/vulkan/nvk_pipeline.h b/src/nouveau/vulkan/nvk_pipeline.h index b7a33249ddb..a68b353a9c8 100644 --- a/src/nouveau/vulkan/nvk_pipeline.h +++ b/src/nouveau/vulkan/nvk_pipeline.h @@ -57,6 +57,8 @@ struct nvk_graphics_pipeline { uint32_t push_data[192]; uint32_t push_dw_count; + float min_sample_shading; + struct vk_vertex_input_state _dynamic_vi; struct vk_sample_locations_state _dynamic_sl; struct vk_dynamic_graphics_state dynamic;