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 */