Commit d3e046e7 authored by Emma Anholt's avatar Emma Anholt
Browse files

nir: Pull some of intel's image load/store format conversion to nir_format.h



I needed the same functions for v3d.  Note that the color value in the
Intel lowering has already been cut down to image.chans num_components.

v2: Drop the half float one, since it was a 1-liner after cleanup.
Reviewed-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
parent 19c7cba2
...@@ -282,6 +282,44 @@ nir_format_srgb_to_linear(nir_builder *b, nir_ssa_def *c) ...@@ -282,6 +282,44 @@ nir_format_srgb_to_linear(nir_builder *b, nir_ssa_def *c)
linear, curved)); linear, curved));
} }
/* Clamps a vector of uints so they don't extend beyond the given number of
* bits per channel.
*/
static inline nir_ssa_def *
nir_format_clamp_uint(nir_builder *b, nir_ssa_def *f, const unsigned *bits)
{
if (bits[0] == 32)
return f;
nir_const_value max;
for (unsigned i = 0; i < f->num_components; i++) {
assert(bits[i] < 32);
max.i32[i] = (1 << (bits[i] - 1)) - 1;
}
return nir_umin(b, f, nir_build_imm(b, f->num_components, 32, max));
}
/* Clamps a vector of sints so they don't extend beyond the given number of
* bits per channel.
*/
static inline nir_ssa_def *
nir_format_clamp_sint(nir_builder *b, nir_ssa_def *f, const unsigned *bits)
{
if (bits[0] == 32)
return f;
nir_const_value min, max;
for (unsigned i = 0; i < f->num_components; i++) {
assert(bits[i] < 32);
max.i32[i] = (1 << (bits[i] - 1)) - 1;
min.i32[i] = -(1 << (bits[i] - 1));
}
f = nir_imin(b, f, nir_build_imm(b, f->num_components, 32, max));
f = nir_imax(b, f, nir_build_imm(b, f->num_components, 32, min));
return f;
}
static inline nir_ssa_def * static inline nir_ssa_def *
nir_format_unpack_11f11f10f(nir_builder *b, nir_ssa_def *packed) nir_format_unpack_11f11f10f(nir_builder *b, nir_ssa_def *packed)
{ {
......
...@@ -555,27 +555,11 @@ convert_color_for_store(nir_builder *b, const struct gen_device_info *devinfo, ...@@ -555,27 +555,11 @@ convert_color_for_store(nir_builder *b, const struct gen_device_info *devinfo,
break; break;
case ISL_UINT: case ISL_UINT:
if (image.bits[0] < 32) { color = nir_format_clamp_uint(b, color, image.bits);
nir_const_value max;
for (unsigned i = 0; i < image.chans; i++) {
assert(image.bits[i] < 32);
max.u32[i] = (1u << image.bits[i]) - 1;
}
color = nir_umin(b, color, nir_build_imm(b, image.chans, 32, max));
}
break; break;
case ISL_SINT: case ISL_SINT:
if (image.bits[0] < 32) { color = nir_format_clamp_sint(b, color, image.bits);
nir_const_value min, max;
for (unsigned i = 0; i < image.chans; i++) {
assert(image.bits[i] < 32);
max.i32[i] = (1 << (image.bits[i] - 1)) - 1;
min.i32[i] = -(1 << (image.bits[i] - 1));
}
color = nir_imin(b, color, nir_build_imm(b, image.chans, 32, max));
color = nir_imax(b, color, nir_build_imm(b, image.chans, 32, min));
}
break; break;
default: default:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment