From 9aa08221fa6653002dec2a07641d58d3c7fa227a Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Mon, 13 Jul 2020 17:32:13 -0400 Subject: [PATCH] zink: fill in params for fs shader keys and flag shader for rebuild we need to check for rebuild any time fb samples becomes 0 in order to remove any writes to gl_SampleMask Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_context.c | 6 +++++- src/gallium/drivers/zink/zink_program.c | 7 +++++++ src/gallium/drivers/zink/zink_shader_keys.h | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index ab3884522ca..24b8cdeccd1 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -737,7 +737,11 @@ zink_set_framebuffer_state(struct pipe_context *pctx, zink_framebuffer_reference(screen, &ctx->framebuffer, fb); zink_render_pass_reference(screen, &ctx->gfx_pipeline_state.render_pass, fb->rp); - ctx->gfx_pipeline_state.rast_samples = util_framebuffer_get_num_samples(state); + uint8_t rast_samples = util_framebuffer_get_num_samples(state); + /* in vulkan, gl_SampleMask needs to be explicitly ignored for sampleCount == 1 */ + if ((ctx->gfx_pipeline_state.rast_samples > 1) != (rast_samples > 1)) + ctx->dirty_shader_stages |= 1 << PIPE_SHADER_FRAGMENT; + ctx->gfx_pipeline_state.rast_samples = rast_samples; ctx->gfx_pipeline_state.num_attachments = state->nr_cbufs; ctx->gfx_pipeline_state.hash = 0; diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c index 47330d22efa..ebe0c1ab7ad 100644 --- a/src/gallium/drivers/zink/zink_program.c +++ b/src/gallium/drivers/zink/zink_program.c @@ -180,6 +180,13 @@ shader_key_fs_gen(struct zink_context *ctx, struct zink_shader *zs, struct zink_ fs_key->shader_id = zs->shader_id; //fs_key->flat_shade = ctx->rast_state->base.flatshade; + + /* if gl_SampleMask[] is written to, we have to ensure that we get a shader with the same sample count: + * in GL, rast_samples==1 means ignore gl_SampleMask[] + * in VK, gl_SampleMask[] is never ignored + */ + if (zs->nir->info.outputs_written & (1 << FRAG_RESULT_SAMPLE_MASK)) + fs_key->samples = !!ctx->fb_state.samples; } typedef void (*zink_shader_key_gen)(struct zink_context *ctx, struct zink_shader *zs, struct zink_shader_key *key); diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h index 0556f61ecbf..203537dd227 100644 --- a/src/gallium/drivers/zink/zink_shader_keys.h +++ b/src/gallium/drivers/zink/zink_shader_keys.h @@ -29,6 +29,7 @@ struct zink_fs_key { unsigned shader_id; //bool flat_shade; + bool samples; }; /* a shader key is used for swapping out shader modules based on pipeline states,