diff options
author | Mike Blumenkrantz <michael.blumenkrantz@gmail.com> | 2024-02-01 10:48:35 -0500 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2024-02-02 16:54:02 +0000 |
commit | 66b0263ceaa88ed2c961ca130b1a529f12cec512 (patch) | |
tree | b35430e727fbb76ec651ad479eaee077f7ac10f6 | |
parent | 751c5689f0b397d99bb114a2a003c28c22f9615c (diff) |
zink: move sparse lowering up in file
no functional changes
Fixes: 0d652c0c8db ("zink: shrink vectors during optimization")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27414>
(cherry picked from commit 6a8cd7a64fbf8a91d99a4c3f08a13b53ce5c72d6)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/gallium/drivers/zink/zink_compiler.c | 164 |
2 files changed, 83 insertions, 83 deletions
diff --git a/.pick_status.json b/.pick_status.json index 576a7764d35..853ccb97596 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -34,7 +34,7 @@ "description": "zink: move sparse lowering up in file", "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 a3ca93dc4bf..d586cb9037a 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -3547,6 +3547,88 @@ invert_point_coord(nir_shader *nir) } static bool +is_residency_code(nir_def *src) +{ + nir_instr *parent = src->parent_instr; + while (1) { + if (parent->type == nir_instr_type_intrinsic) { + ASSERTED nir_intrinsic_instr *intr = nir_instr_as_intrinsic(parent); + assert(intr->intrinsic == nir_intrinsic_is_sparse_texels_resident); + return false; + } + if (parent->type == nir_instr_type_tex) + return true; + assert(parent->type == nir_instr_type_alu); + nir_alu_instr *alu = nir_instr_as_alu(parent); + parent = alu->src[0].src.ssa->parent_instr; + } +} + +static bool +lower_sparse_instr(nir_builder *b, nir_intrinsic_instr *instr, void *data) +{ + if (instr->intrinsic == nir_intrinsic_sparse_residency_code_and) { + b->cursor = nir_before_instr(&instr->instr); + nir_def *src0; + if (is_residency_code(instr->src[0].ssa)) + src0 = nir_is_sparse_texels_resident(b, 1, instr->src[0].ssa); + else + src0 = instr->src[0].ssa; + nir_def *src1; + if (is_residency_code(instr->src[1].ssa)) + src1 = nir_is_sparse_texels_resident(b, 1, instr->src[1].ssa); + else + src1 = instr->src[1].ssa; + nir_def *def = nir_iand(b, src0, src1); + nir_def_rewrite_uses_after(&instr->def, def, &instr->instr); + nir_instr_remove(&instr->instr); + return true; + } + if (instr->intrinsic != nir_intrinsic_is_sparse_texels_resident) + return false; + + /* vulkan vec can only be a vec4, but this is (maybe) vec5, + * so just rewrite as the first component since ntv is going to use a different + * method for storing the residency value anyway + */ + b->cursor = nir_before_instr(&instr->instr); + nir_instr *parent = instr->src[0].ssa->parent_instr; + if (is_residency_code(instr->src[0].ssa)) { + assert(parent->type == nir_instr_type_alu); + nir_alu_instr *alu = nir_instr_as_alu(parent); + nir_def_rewrite_uses_after(instr->src[0].ssa, nir_channel(b, alu->src[0].src.ssa, 0), parent); + nir_instr_remove(parent); + } else { + nir_def *src; + if (parent->type == nir_instr_type_intrinsic) { + nir_intrinsic_instr *intr = nir_instr_as_intrinsic(parent); + assert(intr->intrinsic == nir_intrinsic_is_sparse_texels_resident); + src = intr->src[0].ssa; + } else { + assert(parent->type == nir_instr_type_alu); + nir_alu_instr *alu = nir_instr_as_alu(parent); + src = alu->src[0].src.ssa; + } + if (instr->def.bit_size != 32) { + if (instr->def.bit_size == 1) + src = nir_ieq_imm(b, src, 1); + else + src = nir_u2uN(b, src, instr->def.bit_size); + } + nir_def_rewrite_uses(&instr->def, src); + nir_instr_remove(&instr->instr); + } + return true; +} + +static bool +lower_sparse(nir_shader *shader) +{ + return nir_shader_intrinsics_pass(shader, lower_sparse_instr, + nir_metadata_dominance, NULL); +} + +static bool add_derefs_instr(nir_builder *b, nir_intrinsic_instr *intr, void *data) { bool is_load = false; @@ -4574,88 +4656,6 @@ scan_nir(struct zink_screen *screen, nir_shader *shader, struct zink_shader *zs) } static bool -is_residency_code(nir_def *src) -{ - nir_instr *parent = src->parent_instr; - while (1) { - if (parent->type == nir_instr_type_intrinsic) { - ASSERTED nir_intrinsic_instr *intr = nir_instr_as_intrinsic(parent); - assert(intr->intrinsic == nir_intrinsic_is_sparse_texels_resident); - return false; - } - if (parent->type == nir_instr_type_tex) - return true; - assert(parent->type == nir_instr_type_alu); - nir_alu_instr *alu = nir_instr_as_alu(parent); - parent = alu->src[0].src.ssa->parent_instr; - } -} - -static bool -lower_sparse_instr(nir_builder *b, nir_intrinsic_instr *instr, void *data) -{ - if (instr->intrinsic == nir_intrinsic_sparse_residency_code_and) { - b->cursor = nir_before_instr(&instr->instr); - nir_def *src0; - if (is_residency_code(instr->src[0].ssa)) - src0 = nir_is_sparse_texels_resident(b, 1, instr->src[0].ssa); - else - src0 = instr->src[0].ssa; - nir_def *src1; - if (is_residency_code(instr->src[1].ssa)) - src1 = nir_is_sparse_texels_resident(b, 1, instr->src[1].ssa); - else - src1 = instr->src[1].ssa; - nir_def *def = nir_iand(b, src0, src1); - nir_def_rewrite_uses_after(&instr->def, def, &instr->instr); - nir_instr_remove(&instr->instr); - return true; - } - if (instr->intrinsic != nir_intrinsic_is_sparse_texels_resident) - return false; - - /* vulkan vec can only be a vec4, but this is (maybe) vec5, - * so just rewrite as the first component since ntv is going to use a different - * method for storing the residency value anyway - */ - b->cursor = nir_before_instr(&instr->instr); - nir_instr *parent = instr->src[0].ssa->parent_instr; - if (is_residency_code(instr->src[0].ssa)) { - assert(parent->type == nir_instr_type_alu); - nir_alu_instr *alu = nir_instr_as_alu(parent); - nir_def_rewrite_uses_after(instr->src[0].ssa, nir_channel(b, alu->src[0].src.ssa, 0), parent); - nir_instr_remove(parent); - } else { - nir_def *src; - if (parent->type == nir_instr_type_intrinsic) { - nir_intrinsic_instr *intr = nir_instr_as_intrinsic(parent); - assert(intr->intrinsic == nir_intrinsic_is_sparse_texels_resident); - src = intr->src[0].ssa; - } else { - assert(parent->type == nir_instr_type_alu); - nir_alu_instr *alu = nir_instr_as_alu(parent); - src = alu->src[0].src.ssa; - } - if (instr->def.bit_size != 32) { - if (instr->def.bit_size == 1) - src = nir_ieq_imm(b, src, 1); - else - src = nir_u2uN(b, src, instr->def.bit_size); - } - nir_def_rewrite_uses(&instr->def, src); - nir_instr_remove(&instr->instr); - } - return true; -} - -static bool -lower_sparse(nir_shader *shader) -{ - return nir_shader_intrinsics_pass(shader, lower_sparse_instr, - nir_metadata_dominance, NULL); -} - -static bool match_tex_dests_instr(nir_builder *b, nir_instr *in, void *data) { if (in->type != nir_instr_type_tex) |