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