From 60d0a0a8ce3effd060fa3cf8058a6330bc0daa39 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 14 Jan 2022 10:58:29 -0500 Subject: [PATCH] zink: always pass shader info to ntv Acked-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c | 4 ++-- src/gallium/drivers/zink/zink_compiler.c | 4 ++-- src/gallium/drivers/zink/zink_compiler.h | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c index 7f5df8cc165..82da39359af 100644 --- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c +++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c @@ -3781,7 +3781,7 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_ } - if (sinfo) + if (sinfo->last_vertex) emit_so_info(&ctx, sinfo, max_output + 1); /* we have to reverse iterate to match what's done in zink_compiler.c */ @@ -3941,7 +3941,7 @@ nir_to_spirv(struct nir_shader *s, const struct zink_shader_info *sinfo, uint32_ emit_cf_list(&ctx, &entry->body); /* vertex/tess shader emits copied xfb outputs at the end of the shader */ - if (sinfo && (ctx.stage == MESA_SHADER_VERTEX || ctx.stage == MESA_SHADER_TESS_EVAL)) + if (sinfo->last_vertex && (ctx.stage == MESA_SHADER_VERTEX || ctx.stage == MESA_SHADER_TESS_EVAL)) emit_so_outputs(&ctx, sinfo); spirv_builder_return(&ctx.builder); // doesn't belong here, but whatevz diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 906c8eee507..2f28c450888 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -1086,7 +1086,7 @@ VkShaderModule zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shader *base_nir, const struct zink_shader_key *key) { VkShaderModule mod = VK_NULL_HANDLE; - void *sinfo = NULL; + struct zink_shader_info *sinfo = &zs->sinfo; nir_shader *nir = nir_shader_clone(NULL, base_nir); bool need_optimize = false; bool inlined_uniforms = false; @@ -1129,7 +1129,7 @@ zink_shader_compile(struct zink_screen *screen, struct zink_shader *zs, nir_shad case MESA_SHADER_GEOMETRY: if (zink_vs_key_base(key)->last_vertex_stage) { if (zs->sinfo.have_xfb) - sinfo = &zs->sinfo; + sinfo->last_vertex = true; if (!zink_vs_key_base(key)->clip_halfz) { NIR_PASS_V(nir, nir_lower_clip_halfz); diff --git a/src/gallium/drivers/zink/zink_compiler.h b/src/gallium/drivers/zink/zink_compiler.h index 9f859e13ffe..62a831ead78 100644 --- a/src/gallium/drivers/zink/zink_compiler.h +++ b/src/gallium/drivers/zink/zink_compiler.h @@ -54,6 +54,7 @@ struct tgsi_token; struct zink_shader_info { struct pipe_stream_output_info so_info; unsigned so_info_slots[PIPE_MAX_SO_OUTPUTS]; + bool last_vertex; bool have_xfb; };