Mesa (main): zink: keep a mask of stages present in a gfx program

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jul 7 03:30:53 UTC 2021


Module: Mesa
Branch: main
Commit: e551f2c55741ae9ff4f042f5d3f585db7fe113b4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=e551f2c55741ae9ff4f042f5d3f585db7fe113b4

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri May 14 18:15:42 2021 -0400

zink: keep a mask of stages present in a gfx program

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11740>

---

 src/gallium/drivers/zink/zink_program.c | 12 +++++++-----
 src/gallium/drivers/zink/zink_program.h |  2 ++
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index ecb2aa6ba0f..798b53488e6 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -427,20 +427,22 @@ zink_create_gfx_program(struct zink_context *ctx,
    pipe_reference_init(&prog->base.reference, 1);
 
    for (int i = 0; i < ZINK_SHADER_COUNT; ++i) {
-      if (stages[i] || prog->shaders[i])
+      if (stages[i]) {
          _mesa_hash_table_init(&prog->base.shader_cache[i], prog, keybox_hash, keybox_equals);
-      prog->shaders[i] = stages[i];
-      /* always force shader creation during init */
-      ctx->dirty_shader_stages |= BITFIELD_BIT(i);
+         prog->shaders[i] = stages[i];
+         prog->stages_present |= BITFIELD_BIT(i);
+      }
    }
    if (stages[PIPE_SHADER_TESS_EVAL] && !stages[PIPE_SHADER_TESS_CTRL]) {
       prog->shaders[PIPE_SHADER_TESS_EVAL]->generated =
       prog->shaders[PIPE_SHADER_TESS_CTRL] =
         zink_shader_tcs_create(ctx, stages[PIPE_SHADER_VERTEX]);
         _mesa_hash_table_init(&prog->base.shader_cache[PIPE_SHADER_TESS_CTRL], prog, keybox_hash, keybox_equals);
-      ctx->dirty_shader_stages |= BITFIELD_BIT(PIPE_SHADER_TESS_CTRL);
+      prog->stages_present |= BITFIELD_BIT(PIPE_SHADER_TESS_CTRL);
    }
 
+   /* always force shader creation during init */
+   ctx->dirty_shader_stages |= prog->stages_present;
    assign_io(prog, prog->shaders);
 
    update_shader_modules(ctx, prog->shaders, prog, false);
diff --git a/src/gallium/drivers/zink/zink_program.h b/src/gallium/drivers/zink/zink_program.h
index 707a93bebe1..7548b45f213 100644
--- a/src/gallium/drivers/zink/zink_program.h
+++ b/src/gallium/drivers/zink/zink_program.h
@@ -89,7 +89,9 @@ struct zink_program {
 struct zink_gfx_program {
    struct zink_program base;
 
+   uint32_t stages_present; //mask of stages present in this program
    struct nir_shader *nir[ZINK_SHADER_COUNT];
+
    struct zink_shader_module *modules[ZINK_SHADER_COUNT]; // compute stage doesn't belong here
 
    struct zink_shader_module *default_variants[ZINK_SHADER_COUNT][2]; //[default, no streamout]



More information about the mesa-commit mailing list