Mesa (master): zink: use shader keys for samplemask

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 8 17:46:58 UTC 2020


Module: Mesa
Branch: master
Commit: 0a4004e5fab0aef3ccec102656d7abef303ae5d8
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=0a4004e5fab0aef3ccec102656d7abef303ae5d8

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Mon Dec  7 13:41:03 2020 -0500

zink: use shader keys for samplemask

Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7801>

---

 src/gallium/drivers/zink/zink_compiler.c | 23 ++++++++++++++++++++++-
 src/gallium/drivers/zink/zink_context.c  |  6 +++++-
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 10d817cb919..83973c5270f 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -222,9 +222,27 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
 {
    VkShaderModule mod = VK_NULL_HANDLE;
    void *streamout = NULL;
+   nir_shader *nir = zs->nir;
+   /* TODO: use a separate mem ctx here for ralloc */
    if (zs->streamout.so_info_slots && (zs->nir->info.stage != MESA_SHADER_VERTEX || !zs->has_geometry_shader))
       streamout = &zs->streamout;
-   struct spirv_shader *spirv = nir_to_spirv(zs->nir, streamout, shader_slot_map, shader_slots_reserved);
+   if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) {
+      nir = nir_shader_clone(NULL, nir);
+      if (!zink_fs_key(key)->samples &&
+          nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) {
+         /* VK will always use gl_SampleMask[] values even if sample count is 0,
+          * so we need to skip this write here to mimic GL's behavior of ignoring it
+          */
+         nir_foreach_shader_out_variable(var, nir) {
+            if (var->data.location == FRAG_RESULT_SAMPLE_MASK)
+               var->data.mode = nir_var_shader_temp;
+         }
+         nir_fixup_deref_modes(nir);
+         NIR_PASS_V(nir, nir_remove_dead_variables, nir_var_shader_temp, NULL);
+         optimize_nir(nir);
+      }
+   }
+   struct spirv_shader *spirv = nir_to_spirv(nir, streamout, shader_slot_map, shader_slots_reserved);
    assert(spirv);
 
    if (zink_debug & ZINK_DEBUG_SPIRV) {
@@ -247,6 +265,9 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
    if (vkCreateShaderModule(screen->dev, &smci, NULL, &mod) != VK_SUCCESS)
       mod = VK_NULL_HANDLE;
 
+   if (zs->nir->info.stage == MESA_SHADER_FRAGMENT)
+      ralloc_free(nir);
+
    /* TODO: determine if there's any reason to cache spirv output? */
    free(spirv->words);
    free(spirv);
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 85ef6dda3e2..69b4846478f 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -769,7 +769,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;
 



More information about the mesa-commit mailing list