[Mesa-dev] [PATCH 2/3] i965: Make split_virtual_grfs() call compact_virtual_grfs().
itoral at igalia.com
Mon Oct 24 09:34:53 UTC 2016
On Sun, 2016-10-23 at 23:44 -0700, Kenneth Graunke wrote:
> Post-splitting, VGRFs have a maximum size (MAX_VGRF_SIZE). This is
> required by the register allocator, as we have to create classes for
> each size of VGRF.
> We can (and do) allocate virtual registers larger than MAX_VGRF_SIZE,
> but we must ensure that they are splittable. split_virtual_grfs()
> asserts that the post-splitting register size is in range.
> Unfortunately, these trip for completely dead registers which are too
> large - we only set split points for live registers. So dead ones
> never split, and if they happened to be too large, they'd trip
> To fix this, call compact_virtual_grfs() to eliminate dead registers
> before splitting.
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> src/mesa/drivers/dri/i965/brw_fs.cpp | 2 ++
> 1 file changed, 2 insertions(+)
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 1c7a6e6..31d21ec 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -1687,6 +1687,8 @@ fs_visitor::assign_gs_urb_setup()
Maybe I would add a comment here to explain why we compact before we
split so people don't forget about the special case this handles. Maybe
something like this:
/* Compact the register file so we eliminate dead vgrfs. This
* only defines split points for live registers, so if we have
* too large dead registers they will hit assertions later.
> + compact_virtual_grfs();
> int num_vars = this->alloc.count;
> /* Count the total number of registers */
More information about the mesa-dev