return nir_f2i32(b, nir_fround_even(b, nir_fmul(b, f, factor)));
}
+/* Converts a vector of floats to a vector of half-floats packed in the low 16
+ * bits.
+ */
+static inline nir_ssa_def *
+nir_format_float_to_half(nir_builder *b, nir_ssa_def *f)
+{
+ nir_ssa_def *zero = nir_imm_float(b, 0);
+ nir_ssa_def *f16comps[4];
+ for (unsigned i = 0; i < f->num_components; i++)
+ f16comps[i] = nir_pack_half_2x16_split(b, nir_channel(b, f, i), zero);
+ return nir_vec(b, f16comps, f->num_components);
+}
+
static inline nir_ssa_def *
nir_format_linear_to_srgb(nir_builder *b, nir_ssa_def *c)
{
break;
case ISL_SFLOAT:
- if (image.bits[0] == 16) {
- nir_ssa_def *f16comps[4];
- for (unsigned i = 0; i < image.chans; i++) {
- f16comps[i] = nir_pack_half_2x16_split(b, nir_channel(b, color, i),
- nir_imm_float(b, 0));
- }
- color = nir_vec(b, f16comps, image.chans);
- }
+ if (image.bits[0] == 16)
+ color = nir_format_float_to_half(b, color);
break;
case ISL_UINT: