gallivm: add smallfloat to float conversion not relying on cpu denorm handling
authorRoland Scheidegger <sroland@vmware.com>
Thu, 20 Feb 2014 02:09:17 +0000 (03:09 +0100)
committerRoland Scheidegger <sroland@vmware.com>
Thu, 20 Feb 2014 17:41:42 +0000 (18:41 +0100)
commitb2b2a2c06c20f3ca592af6e96222deab67ea239c
treec9aa3cb32cbb94078779830dda2f26fc8ea33aee
parent0206f0b3d4923411036711d9e7b31e33cd793a4e
gallivm: add smallfloat to float conversion not relying on cpu denorm handling

The previous code relied on cpu denorm support for converting small float
formats (such r11g11b10_float and r16_float) to floats, otherwise denorms
are flushed to zero. We worked around that in llvmpipe blend code by
reenabling denorms, but this did nothing for texture sampling. Now it would
be possible to reenable it there too but I'm not really a fan of messing
with fpu flags (and it seems we can't actually do it reliably with llvm in
any case looking at some bug reports). (Not to mention if you actually have
a lot of denorms in there, you can expect some order-of-magnitude slowdown
with x86 cpus.)
So instead use code which adjusts exponents etc. directly hence not relying
on cpu denorm support for the rescaling mul.
(We still need the fpu flag handling as we can't do float-to-smallfloat
without using cpu denorms at least for now - I actually wanted to keep
both the old and new code and using one or the other depending on from where
it's called but that didn't work out as the parameter would have to be passed
through too many layers than I'd like.)

Reviewed-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Si Chen <sichen@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_format_float.c