lima/gp: Fix problem with complex moves
authorConnor Abbott <cwabbott0@gmail.com>
Sat, 11 May 2019 16:43:30 +0000 (18:43 +0200)
committerConnor Abbott <cwabbott0@gmail.com>
Thu, 18 Jul 2019 12:33:23 +0000 (14:33 +0200)
commitb178fdf486f3496270dd4ec12d9bc596d11433ad
treebcf6f0ce43c192cc6c9b33c8a5e884ff6a58c658
parent54434fe67068d9abdf73bfc3482337cc4315d2d3
lima/gp: Fix problem with complex moves

When writing the scheduler, we forgot that you can't read the complex
unit in certain sources because it gets overwritten to 0 or 1. Fixing
this turned out to be possible without giving up and reducing
GPIR_VALUE_REG_NUM to 10, although it was difficult in a way I didn't
expect. There can be at most 4 next-max nodes that can't have moves
scheduled in the complex slot, so it actually isn't a problem for
getting the number of next-max nodes at 5 or lower. However, it is a
problem for stores. If a given node is a next-max node whose move cannot
go in the complex slot *and* is used by a store that we decide to
schedule, we have to reserve one of the non-complex slots for a move
instead of all the slots, or we can wind up in a situation where only
the complex slot is free and we fail the move. This means that we have
to add another term to the reservation logic, for stores whose children
cannot be in the complex slot.

Acked-by: Qiang Yu <yuq825@gmail.com>
src/gallium/drivers/lima/ir/gp/gpir.h
src/gallium/drivers/lima/ir/gp/instr.c
src/gallium/drivers/lima/ir/gp/scheduler.c