From 652387c9fbf7e7b60431594cfbb4f2bc434cf13c Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Sun, 4 Aug 2024 13:38:49 +0200 Subject: [PATCH] zink: lower 8/16 bit alu ops vk spirv doesn't allow Cc: mesa-stable Acked-by: Mike Blumenkrantz Reviewed-by: Georg Lehmann Part-of: (cherry picked from commit b2225b9437b8c1b0d0431f7cbd768ba7dd2f8728) --- .pick_status.json | 2 +- src/gallium/drivers/zink/zink_compiler.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index 25d84e58245..e1d7f7a4239 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -934,7 +934,7 @@ "description": "zink: lower 8/16 bit alu ops vk spirv doesn't allow", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 45ded77b156..aee15ad4c98 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -5795,6 +5795,27 @@ lower_vec816_alu(const nir_instr *instr, const void *cb_data) return 4; } +static unsigned +zink_lower_bit_size_cb(const nir_instr *instr, void *data) +{ + switch (instr->type) { + case nir_instr_type_alu: { + nir_alu_instr *alu = nir_instr_as_alu(instr); + switch (alu->op) { + case nir_op_bit_count: + case nir_op_find_lsb: + case nir_op_ifind_msb: + case nir_op_ufind_msb: + return alu->src[0].src.ssa->bit_size == 32 ? 0 : 32; + default: + return 0; + } + } + default: + return 0; + } +} + static bool fix_vertex_input_locations_instr(nir_builder *b, nir_intrinsic_instr *intr, void *data) { @@ -6236,6 +6257,7 @@ zink_shader_init(struct zink_screen *screen, struct zink_shader *zs) .cb_data = screen, }; NIR_PASS_V(nir, nir_lower_mem_access_bit_sizes, &lower_mem_access_options); + NIR_PASS_V(nir, nir_lower_bit_size, zink_lower_bit_size_cb, NULL); NIR_PASS_V(nir, alias_scratch_memory); NIR_PASS_V(nir, nir_lower_alu_width, lower_vec816_alu, NULL); NIR_PASS_V(nir, nir_lower_alu_vec8_16_srcs);