nir/lower_blend: Fix nir_blend_logicop() for 8/16-bit integer formats

src and dst can be integer types, and doing an f2f on such types
messes up with the original value. Make sure we keep the original type
when {up,down}sizing the src, dst and out values.

Fixes: f3de2bd6c2 ("nir: Add blend lowering pass")
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28839>
(cherry picked from commit 34ffa4cd10)
This commit is contained in:
Boris Brezillon 2024-04-20 19:10:10 +02:00 committed by Eric Engestrom
parent 8a04af36f2
commit a6d4353291
2 changed files with 8 additions and 5 deletions

View file

@ -544,7 +544,7 @@
"description": "nir/lower_blend: Fix nir_blend_logicop() for 8/16-bit integer formats",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "f3de2bd6c2dd4c6b4bdbd63e7e5d47f326d2f494",
"notes": null

View file

@ -319,9 +319,12 @@ nir_blend_logicop(
if (util_format_is_float(format) || util_format_is_srgb(format))
return src;
nir_alu_type type =
util_format_is_pure_integer(format) ? nir_type_uint : nir_type_float;
if (bit_size != 32) {
src = nir_f2f32(b, src);
dst = nir_f2f32(b, dst);
src = nir_convert_to_bit_size(b, src, type, 32);
dst = nir_convert_to_bit_size(b, dst, type, 32);
}
assert(src->num_components <= 4);
@ -358,8 +361,8 @@ nir_blend_logicop(
assert(util_format_is_pure_integer(format));
}
if (bit_size == 16)
out = nir_f2f16(b, out);
if (bit_size != 32)
out = nir_convert_to_bit_size(b, out, type, bit_size);
return out;
}