nir/builder: Add a helper for grabbing multiple channels from an ssa def

This is similar to nir_channel except that it lets you grab more than one
channel by providing a mask.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
Jason Ekstrand
2016-05-02 16:29:05 -07:00
parent fc58cb543f
commit 87a41e862b
2 changed files with 15 additions and 3 deletions

View File

@@ -324,6 +324,20 @@ nir_channel(nir_builder *b, nir_ssa_def *def, unsigned c)
return nir_swizzle(b, def, swizzle, 1, false);
}
static inline nir_ssa_def *
nir_channels(nir_builder *b, nir_ssa_def *def, unsigned mask)
{
unsigned num_channels = 0, swizzle[4] = { 0, 0, 0, 0 };
for (unsigned i = 0; i < 4; i++) {
if ((mask & (1 << i)) == 0)
continue;
swizzle[num_channels++] = i;
}
return nir_swizzle(b, def, swizzle, num_channels, false);
}
/**
* Turns a nir_src into a nir_ssa_def * so it can be passed to
* nir_build_alu()-based builder calls.