From 34ffa4cd1072d09104fcdbc12e5b2beada1ae45f Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Sat, 20 Apr 2024 19:10:10 +0200 Subject: [PATCH] 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: f3de2bd6c2dd ("nir: Add blend lowering pass") Signed-off-by: Boris Brezillon Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_lower_blend.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/compiler/nir/nir_lower_blend.c b/src/compiler/nir/nir_lower_blend.c index b169317747d..60c7b9e5abc 100644 --- a/src/compiler/nir/nir_lower_blend.c +++ b/src/compiler/nir/nir_lower_blend.c @@ -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; }