i965/msaa: Fix centroid interpolation of unlit pixels.
authorPaul Berry <stereotype441@gmail.com>
Thu, 21 Jun 2012 18:21:22 +0000 (11:21 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 2 Jul 2012 20:27:36 +0000 (13:27 -0700)
commit8313f44409ceb733e9f8835926364164237b3111
tree32f7d08f69d5e620dfebe6e62a32dddf4a98c2dd
parent3f929efa2872aa5a4402520ec9fd551392e2413a
i965/msaa: Fix centroid interpolation of unlit pixels.

From the Ivy Bridge PRM, Vol 2 Part 1 p280-281 (3DSTATE_WM:
Barycentric Interpolation Mode):

    "Errata: When Centroid Barycentric mode is required, HW may
    produce incorrect interpolation results when a 2X2 pixels have
    unlit pixels."

To work around this problem, after doing centroid interpolation, we
replace the centroid-interpolated values for unlit pixels with
non-centroid-interpolated values (which are interpolated at pixel
centers).  This produces correct rendering at the expense of a slight
increase in shader execution time.

I've conditioned the workaround with a runtime flag
(brw->needs_unlit_centroid_workaround) in the hopes that we won't need
it in future chip generations.

Fixes piglit tests "EXT_framebuffer_multisample/interpolation {2,4}
{centroid-deriv,centroid-deriv-disabled}".  All MSAA interpolation
tests pass now.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_wm.c