i965/fs: Fix FB writes that tried to use the non-existent m16 register.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 24 Apr 2012 21:09:13 +0000 (14:09 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 27 Apr 2012 23:53:37 +0000 (16:53 -0700)
commitb443ca96a55a06ee215a3f9a9e7dba558deeb58c
treedd26ac5c08521a8809e675c2d5c3ff6983a8809b
parent6af4c9006cddaf5b2c6ae39b9e5722d93e2ad44d
i965/fs: Fix FB writes that tried to use the non-existent m16 register.

A little analysis shows that the worst-case value for "nr" is 17:
- base_mrf = 2                       ... 2
- header present (say gen == 5)      ... 4
- aa_dest_stencil_reg (stencil test) ... 5
- SIMD16 mode: += 4 * reg_width      ... 13
- source_depth_to_render_target      ... 15
- dest_depth_reg                     ... 17

This resulted in us setting base_mrf to 2 and mlen to 15.  In other
words, we'd try to use m2..m16.  But m16 doesn't exist pre-Gen6.  Also,
the instruction scheduler data structures use arrays of size 16, so this
would cause us to access them out of bounds.

While the debugger system routine may need m0 and m1, we don't use it
today, so the simplest solution is just to move base_mrf back to 1.
That way, our worst case message fits in m1..m15, which is legal.

An alternative would be to fail on SIMD16 in this case, but that seems
a bit unfortunate if there's no real need to reserve m0 and m1.

Fixes new piglit test shaders/depth-test-and-write on Ironlake.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=48218
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp