Mesa (master): zink: move tess/geom shader info to vs shader key

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jan 29 15:46:06 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Sat Jan 23 10:42:48 2021 -0500

zink: move tess/geom shader info to vs shader key

now that there exists a shader key for vertex stages, we can stop modifying
the zink_shader values and instead use this as a more reliable method of detecting
the state

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

---

 src/gallium/drivers/zink/zink_compiler.c    | 17 +++--------------
 src/gallium/drivers/zink/zink_compiler.h    |  2 --
 src/gallium/drivers/zink/zink_program.c     | 16 +++++++++++++---
 src/gallium/drivers/zink/zink_shader_keys.h |  1 +
 4 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 69d611522eb..df47c6c0742 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -314,17 +314,6 @@ update_so_info(struct zink_shader *sh,
    }
 }
 
-static bool
-last_vertex_stage(struct zink_shader *zs)
-{
-   assert(zs->nir->info.stage != MESA_SHADER_FRAGMENT);
-   if (zs->has_geometry_shader)
-      return zs->nir->info.stage == MESA_SHADER_GEOMETRY;
-   if (zs->has_tess_shader)
-      return zs->nir->info.stage == MESA_SHADER_TESS_EVAL;
-   return true;
-}
-
 VkShaderModule
 zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct zink_shader_key *key,
                     unsigned char *shader_slot_map, unsigned char *shader_slots_reserved)
@@ -333,8 +322,8 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
    void *streamout = NULL;
    nir_shader *nir = zs->nir;
    /* TODO: use a separate mem ctx here for ralloc */
-   if (zs->nir->info.stage != MESA_SHADER_FRAGMENT) {
-      if (last_vertex_stage(zs)) {
+   if (zs->nir->info.stage < MESA_SHADER_FRAGMENT) {
+      if (zink_vs_key(key)->last_vertex_stage) {
          if (zs->streamout.so_info_slots)
             streamout = &zs->streamout;
 
@@ -343,7 +332,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, struct z
             NIR_PASS_V(nir, nir_lower_clip_halfz);
          }
       }
-   } else {
+   } else if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) {
       if (!zink_fs_key(key)->samples &&
           nir->info.outputs_written & BITFIELD64_BIT(FRAG_RESULT_SAMPLE_MASK)) {
          nir = nir_shader_clone(NULL, zs->nir);
diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h
index 66f02aba476..80629cafbcf 100644
--- a/src/gallium/drivers/zink/zink_compiler.h
+++ b/src/gallium/drivers/zink/zink_compiler.h
@@ -73,8 +73,6 @@ struct zink_shader {
    size_t num_bindings;
    struct set *programs;
 
-   bool has_tess_shader; // vertex shaders need to know if a tesseval shader exists
-   bool has_geometry_shader; // vertex shaders need to know if a geometry shader exists
    union {
       struct zink_shader *generated; // a generated shader that this shader "owns"
       bool is_generated; // if this is a driver-created shader (e.g., tcs)
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index 85ded82b0f0..57a6ddbba41 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -168,7 +168,6 @@ create_pipeline_layout(VkDevice dev, VkDescriptorSetLayout dsl)
    return layout;
 }
 
- 
 static void
 shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs,
                   struct zink_shader *shaders[ZINK_SHADER_COUNT], struct zink_shader_key *key)
@@ -178,6 +177,19 @@ shader_key_vs_gen(struct zink_context *ctx, struct zink_shader *zs,
 
    vs_key->shader_id = zs->shader_id;
    vs_key->clip_halfz = ctx->rast_state->base.clip_halfz;
+   switch (zs->nir->info.stage) {
+   case MESA_SHADER_VERTEX:
+      vs_key->last_vertex_stage = !shaders[PIPE_SHADER_TESS_EVAL] && !shaders[PIPE_SHADER_GEOMETRY];
+      break;
+   case MESA_SHADER_TESS_EVAL:
+      vs_key->last_vertex_stage = !shaders[PIPE_SHADER_GEOMETRY];
+      break;
+   case MESA_SHADER_GEOMETRY:
+      vs_key->last_vertex_stage = true;
+      break;
+   default:
+      unreachable("impossible case");
+   }
 }
 
 static void
@@ -332,8 +344,6 @@ update_shader_modules(struct zink_context *ctx, struct zink_shader *stages[ZINK_
       enum pipe_shader_type type = pipe_shader_type_from_mesa(i);
       if (dirty[i]) {
          struct zink_shader_module *zm;
-         dirty[i]->has_geometry_shader = dirty[MESA_SHADER_GEOMETRY] || stages[PIPE_SHADER_GEOMETRY];
-         dirty[i]->has_tess_shader = dirty[MESA_SHADER_TESS_EVAL] || stages[PIPE_SHADER_TESS_EVAL];
          zm = get_shader_module_for_stage(ctx, dirty[i], prog);
          zink_shader_module_reference(zink_screen(ctx->base.screen), &prog->modules[type], zm);
          /* we probably need a new pipeline when we switch shader modules */
diff --git a/src/gallium/drivers/zink/zink_shader_keys.h b/src/gallium/drivers/zink/zink_shader_keys.h
index 873a0e815e7..84bb7a40fd5 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_vs_key {
    unsigned shader_id;
    bool clip_halfz;
+   bool last_vertex_stage;
 };
 
 struct zink_fs_key {



More information about the mesa-commit mailing list