Levels always uses a LUT currently. There's a
comment in the code that says runtime evaluation is todo for 32-bit float input.
The reason it eats so much memory with dithering enabled is that enabling dithering multiplies the LUT size by 256; see
line 179 and the subsequent
allocation on line 195.