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: 0d652c0c8d ("zink: shrink vectors during optimization")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27414>
(cherry picked from commit 2085d60438)
This commit is contained in:
Mike Blumenkrantz
2024-02-01 10:48:47 -05:00
committed by Eric Engestrom
parent 66b0263cea
commit 100e57cba9
2 changed files with 2 additions and 2 deletions

View File

@@ -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

View File

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