Module: Mesa Branch: main Commit: 63fa2ab978c991fdc56f98f221c46172bfcaa05a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=63fa2ab978c991fdc56f98f221c46172bfcaa05a
Author: Mike Blumenkrantz <[email protected]> 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 <[email protected]> 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; } }
