Mesa (main): zink: add Sample decorations to fragment shader inputs with sample shading
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Feb 9 14:29:46 UTC 2022
Module: Mesa
Branch: main
Commit: 63fa2ab978c991fdc56f98f221c46172bfcaa05a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=63fa2ab978c991fdc56f98f221c46172bfcaa05a
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Wed Feb 2 20:19:55 2022 -0500
zink: add Sample decorations to fragment shader inputs with sample shading
PIPE_CAP_FORCE_PERSAMPLE_INTERP is broken for the no-attachment case, so
this is the only option
fixes (lavapipe):
KHR-GL46.sample_shading.render*
dEQP-GLES31.functional.sample_shading.min_sample_shading*
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14852>
---
src/gallium/drivers/zink/zink_compiler.c | 5 +++++
src/gallium/drivers/zink/zink_shader_keys.h | 1 +
src/gallium/drivers/zink/zink_state.c | 4 ++++
3 files changed, 10 insertions(+)
diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 6fb257697dd..b16f55674f1 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -1087,6 +1087,11 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad
NIR_PASS_V(nir, nir_lower_texcoord_replace, zink_fs_key(key)->coord_replace_bits,
false, zink_fs_key(key)->coord_replace_yinvert);
}
+ if (zink_fs_key(key)->force_persample_interp) {
+ nir_foreach_shader_in_variable(var, nir)
+ var->data.sample = true;
+ nir->info.fs.uses_sample_qualifier = true;
+ }
if (nir->info.fs.uses_fbfetch_output) {
nir_variable *fbfetch = NULL;
NIR_PASS_V(nir, lower_fbfetch, &fbfetch);
diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h
index 318728e87d8..98e671d7434 100644
--- a/src/gallium/drivers/zink/zink_shader_keys.h
+++ b/src/gallium/drivers/zink/zink_shader_keys.h
@@ -60,6 +60,7 @@ struct zink_fs_key {
bool coord_replace_yinvert;
bool samples;
bool force_dual_color_blend;
+ bool force_persample_interp;
};
struct zink_shader_key_base {
diff --git a/src/gallium/drivers/zink/zink_state.c b/src/gallium/drivers/zink/zink_state.c
index 40feb9be18b..611c83ed6aa 100644
--- a/src/gallium/drivers/zink/zink_state.c
+++ b/src/gallium/drivers/zink/zink_state.c
@@ -680,6 +680,7 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso)
bool point_quad_rasterization = ctx->rast_state ? ctx->rast_state->base.point_quad_rasterization : false;
bool scissor = ctx->rast_state ? ctx->rast_state->base.scissor : false;
bool pv_last = ctx->rast_state ? ctx->rast_state->hw_state.pv_last : false;
+ bool force_persample_interp = ctx->rast_state ? ctx->rast_state->hw_state.force_persample_interp : false;
ctx->rast_state = cso;
if (ctx->rast_state) {
@@ -708,6 +709,9 @@ zink_bind_rasterizer_state(struct pipe_context *pctx, void *cso)
zink_set_fs_point_coord_key(ctx);
if (ctx->rast_state->base.scissor != scissor)
ctx->scissor_changed = true;
+
+ if (ctx->rast_state->base.force_persample_interp != force_persample_interp)
+ zink_set_fs_key(ctx)->force_persample_interp = ctx->rast_state->base.force_persample_interp;
}
}
More information about the mesa-commit
mailing list