diff options
author | Glenn Kennard <[email protected]> | 2017-03-05 18:26:54 +0100 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2018-02-09 09:53:26 +1000 |
commit | 1d871aa6268159cdc63ef846599456d9ba567206 (patch) | |
tree | 4b31dd59b094cc53e6260ac2e5a5a6f2ef55cf2e /src/gallium/drivers/r600/r600_asm.c | |
parent | 22fc5eff803d14e99e9f86db223ceedcef1b9108 (diff) |
r600g: Implement spilling of temp arrays (v2)
Pessimistically spills arrays if GPR limit is exceeded.
v2: fix r600 support [airlied]
Signed-off-by: Glenn Kennard <[email protected]>
Reviewed-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600/r600_asm.c')
-rw-r--r-- | src/gallium/drivers/r600/r600_asm.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c index 7a4dddb7b6c..fdccae8c04c 100644 --- a/src/gallium/drivers/r600/r600_asm.c +++ b/src/gallium/drivers/r600/r600_asm.c @@ -240,6 +240,16 @@ int r600_bytecode_add_pending_output(struct r600_bytecode *bc, return 0; } +void r600_bytecode_need_wait_ack(struct r600_bytecode *bc, boolean need_wait_ack) +{ + bc->need_wait_ack = need_wait_ack; +} + +boolean r600_bytecode_get_need_wait_ack(struct r600_bytecode *bc) +{ + return bc->need_wait_ack; +} + /* alu instructions that can ony exits once per group */ static int is_alu_once_inst(struct r600_bytecode_alu *alu) { @@ -1511,6 +1521,13 @@ int r600_bytecode_add_gds(struct r600_bytecode *bc, const struct r600_bytecode_g int r600_bytecode_add_cfinst(struct r600_bytecode *bc, unsigned op) { int r; + + /* Emit WAIT_ACK before control flow to ensure pending writes are always acked. */ + if (op != CF_OP_MEM_SCRATCH && bc->need_wait_ack) { + bc->need_wait_ack = false; + r = r600_bytecode_add_cfinst(bc, CF_OP_WAIT_ACK); + } + r = r600_bytecode_add_cf(bc); if (r) return r; |