aco: fix target calculation when vgpr spilling introduces sgpr spilling
A shader might require vgpr spilling but not require sgpr spilling. In
that case, the spiller lowers the sgpr target by 5 which could mean sgpr
spilling is then required. Then the vgpr target has to be lowered to make
space for the linear vgprs. Previously, space wasn't make for the linear
vgprs.
Found while testing the spiller on the pipeline-db with a lowered limit
Fixes: a7ff1bb5b9
('aco: simplify calculation of target register pressure when spilling')
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3257>
This commit is contained in:
parent
a61eff8330
commit
590c26beab
|
@ -1750,9 +1750,8 @@ void spill(Program* program, live& live_vars, const struct radv_nir_compiler_opt
|
|||
|
||||
if (register_target.vgpr > program->vgpr_limit)
|
||||
register_target.sgpr = program->sgpr_limit - 5;
|
||||
register_target.vgpr = program->vgpr_limit - (register_target.vgpr - program->max_reg_demand.vgpr);
|
||||
|
||||
int spills_to_vgpr = (program->max_reg_demand.sgpr - register_target.sgpr + program->wave_size - 1 + 32) / program->wave_size;
|
||||
register_target.vgpr = program->vgpr_limit - spills_to_vgpr;
|
||||
|
||||
/* initialize ctx */
|
||||
spill_ctx ctx(register_target, program, live_vars.register_demand);
|
||||
|
|
Loading…
Reference in New Issue