Mesa (main): anv: force primitive shading rate write in last geometry stage
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Feb 2 17:39:54 UTC 2022
Module: Mesa
Branch: main
Commit: 16763e8b8e0c536a1f4a7fc234a176092e67ef2a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=16763e8b8e0c536a1f4a7fc234a176092e67ef2a
Author: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Date: Wed Feb 17 14:39:08 2021 +0200
anv: force primitive shading rate write in last geometry stage
v2: Use new helper to check if stage supports variable shading rate
setting
v3: Update comment & iterate backward (Caio)
Apply only to relevant platforms (Lionel)
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
Reviewed-by: Caio Oliveira <caio.oliveira at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13739>
---
src/intel/vulkan/anv_pipeline.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/src/intel/vulkan/anv_pipeline.c b/src/intel/vulkan/anv_pipeline.c
index 799f990ec39..218981df818 100644
--- a/src/intel/vulkan/anv_pipeline.c
+++ b/src/intel/vulkan/anv_pipeline.c
@@ -1772,6 +1772,35 @@ anv_pipeline_compile_graphics(struct anv_graphics_pipeline *pipeline,
prev_stage = &stages[s];
}
+ /* In the case the platform can write the primitive variable shading rate,
+ * figure out the last geometry stage that should write the primitive
+ * shading rate, and ensure it is marked as used there. The backend will
+ * write a default value if the shader doesn't actually write it.
+ *
+ * We iterate backwards in the stage and stop on the first shader that can
+ * set the value.
+ */
+ const struct intel_device_info *devinfo = &pipeline->base.device->info;
+ if (devinfo->has_coarse_pixel_primitive_and_cb &&
+ stages[MESA_SHADER_FRAGMENT].entrypoint &&
+ stages[MESA_SHADER_FRAGMENT].key.wm.coarse_pixel) {
+ struct anv_pipeline_stage *last_psr = NULL;
+
+ for (unsigned i = 0; i < ARRAY_SIZE(shader_order); i++) {
+ gl_shader_stage s = shader_order[ARRAY_SIZE(shader_order) - i - 1];
+
+ if (!stages[s].entrypoint ||
+ !gl_shader_stage_can_set_fragment_shading_rate(s))
+ continue;
+
+ last_psr = &stages[s];
+ break;
+ }
+
+ assert(last_psr);
+ last_psr->nir->info.outputs_written |= VARYING_BIT_PRIMITIVE_SHADING_RATE;
+ }
+
prev_stage = NULL;
for (unsigned i = 0; i < ARRAY_SIZE(shader_order); i++) {
gl_shader_stage s = shader_order[i];
More information about the mesa-commit
mailing list