Mesa (master): zink: pull xfb info from tess shader when applicable

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 22 13:56:10 UTC 2020


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Dec 17 21:26:34 2020 -0500

zink: pull xfb info from tess shader when applicable

if it's the last vertex stage then it does the xfb

Reviewed-by: Erik Faye-Lund <kusmabite at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8152>

---

 src/gallium/drivers/zink/zink_compiler.c | 10 +++++++++-
 src/gallium/drivers/zink/zink_compiler.h |  1 +
 src/gallium/drivers/zink/zink_program.c  |  1 +
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c
index 2a825eb9fae..004f4ce9ff1 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -331,8 +331,16 @@ 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->streamout.so_info_slots && (zs->nir->info.stage != MESA_SHADER_VERTEX || !zs->has_geometry_shader))
+   if (zs->has_geometry_shader) {
+      if (zs->nir->info.stage == MESA_SHADER_GEOMETRY)
+         streamout = &zs->streamout;
+   } else if (zs->has_tess_shader) {
+      if (zs->nir->info.stage == MESA_SHADER_TESS_EVAL)
+         streamout = &zs->streamout;
+   } else
       streamout = &zs->streamout;
+   if (!zs->streamout.so_info_slots)
+       streamout = NULL;
    if (zs->nir->info.stage == MESA_SHADER_FRAGMENT) {
       nir = nir_shader_clone(NULL, nir);
       if (!zink_fs_key(key)->samples &&
diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h
index 07a31f51efc..47e6bcfcb0d 100644
--- a/src/gallium/drivers/zink/zink_compiler.h
+++ b/src/gallium/drivers/zink/zink_compiler.h
@@ -72,6 +72,7 @@ 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
 };
 
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index f62f3317590..db0e83c1be3 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -304,6 +304,7 @@ update_shader_modules(struct zink_context *ctx, struct zink_shader *stages[ZINK_
       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 */



More information about the mesa-commit mailing list