i965/blorp: Modify manual_blend() to avoid unnecessary loss of precision.
authorPaul Berry <stereotype441@gmail.com>
Sat, 7 Jul 2012 15:02:48 +0000 (08:02 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 20 Jul 2012 16:35:37 +0000 (09:35 -0700)
commitb961d37e613b8b14927c42e09d16d09d70ebcb77
tree3fac424fdde93e42053f4da8f896f8b1ce60b3f1
parent6a27506181b29c8b7eda7bd6cf80689f849e181d
i965/blorp: Modify manual_blend() to avoid unnecessary loss of precision.

When downsampling from an MSAA image to a single-sampled image, it is
inevitable that some loss of numerical precision will occur, since we
have to use 32-bit floating point registers to hold the intermediate
results while blending.  However, it seems reasonable to expect that
when all samples corresponding to a given pixel have the exact same
color value, there will be no loss of precision.

Previously, we averaged samples as follows:

    blend = (((sample[0] + sample[1]) + sample[2]) + sample[3]) / 4

This had the potential to lose numerical precision when all samples
have the same color value, since ((sample[0] + sample[1]) + sample[2])
may not be precisely representable as a 32-bit float, even if the
individual samples are.

This patch changes the formula to:

    blend = ((sample[0] + sample[1]) + (sample[2] + sample[3])) / 4

This avoids any loss of precision in the event that all samples are
the same, by ensuring that each addition operation adds two equal
values.

As a side benefit, this puts the formula in the form we will need in
order to implement correct blending of integer formats.

Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
src/mesa/drivers/dri/i965/brw_blorp_blit.cpp