From 100e57cba9d2d5d41e02ea24859d77056ba9dc64 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 1 Feb 2024 10:48:47 -0500 Subject: [PATCH] zink: run sparse lowering after all optimization passes some passes (e.g., opt_shrink_vector) operate on the assumption that sparse tex ops have a certain number of components and then remove components and unset the sparse flag if they can optimize out the sparse usage zink's sparse ops do not have the standard number of components, which causes such passes to make incorrect assumptions and tag them as not being sparse, which breaks everything fix #10540 Fixes: 0d652c0c8db ("zink: shrink vectors during optimization") Part-of: (cherry picked from commit 2085d6043804c316939ac47d6b334007872655b7) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_compiler.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 853ccb97596..1c7a192c14b 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -24,7 +24,7 @@ "description": "zink: run sparse lowering after all optimization passes", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "0d652c0c8db33ff80d16f30b2d2e8f4413946338", "notes": null diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index d586cb9037a..5c3c1f1ed7d 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -4021,6 +4021,7 @@ zink_shader_compile(struct zink_screen *screen, bool can_shobj, struct zink_shad zs->can_inline = false; } else if (need_optimize) optimize_nir(nir, zs, true); + NIR_PASS_V(nir, lower_sparse); struct zink_shader_object obj = compile_module(screen, zs, nir, can_shobj, pg); ralloc_free(nir); @@ -5399,7 +5400,6 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir) NIR_PASS_V(nir, lower_basevertex); NIR_PASS_V(nir, lower_baseinstance); - NIR_PASS_V(nir, lower_sparse); NIR_PASS_V(nir, split_bitfields); NIR_PASS_V(nir, nir_lower_frexp); /* TODO: Use the spirv instructions for this. */