From: Glenn Kennard Date: Sun, 5 Mar 2017 17:26:50 +0000 (+0100) Subject: r600g: Add pending output function X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d31596d7ae8f24b00450a0b0d242dadfb36dfd9;p=mesa.git r600g: Add pending output function Spills have to happen after the VLIW bundle currently processed, so defer emitting the spill op. Signed-off-by: Glenn Kennard Reviewed-by: Dave Airlie --- diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c index 5b74be1748a..7a4dddb7b6c 100644 --- a/src/gallium/drivers/r600/r600_asm.c +++ b/src/gallium/drivers/r600/r600_asm.c @@ -231,6 +231,15 @@ int r600_bytecode_add_output(struct r600_bytecode *bc, return 0; } +int r600_bytecode_add_pending_output(struct r600_bytecode *bc, + const struct r600_bytecode_output *output) +{ + assert(bc->n_pending_outputs + 1 < ARRAY_SIZE(bc->pending_outputs)); + bc->pending_outputs[bc->n_pending_outputs++] = *output; + + return 0; +} + /* alu instructions that can ony exits once per group */ static int is_alu_once_inst(struct r600_bytecode_alu *alu) { @@ -1301,6 +1310,15 @@ int r600_bytecode_add_alu_type(struct r600_bytecode *bc, if (nalu->dst.rel && bc->r6xx_nop_after_rel_dst) insert_nop_r6xx(bc); + /* Might need to insert spill write ops after current clause */ + if (nalu->last && bc->n_pending_outputs) { + while (bc->n_pending_outputs) { + r = r600_bytecode_add_output(bc, &bc->pending_outputs[--bc->n_pending_outputs]); + if (r) + return r; + } + } + return 0; } diff --git a/src/gallium/drivers/r600/r600_asm.h b/src/gallium/drivers/r600/r600_asm.h index b8abdf014d7..93ac717fb8f 100644 --- a/src/gallium/drivers/r600/r600_asm.h +++ b/src/gallium/drivers/r600/r600_asm.h @@ -274,6 +274,8 @@ struct r600_bytecode { unsigned index_reg[2]; /* indexing register CF_INDEX_[01] */ unsigned debug_id; struct r600_isa* isa; + struct r600_bytecode_output pending_outputs[5]; + int n_pending_outputs; }; /* eg_asm.c */ @@ -300,6 +302,8 @@ int r600_bytecode_add_gds(struct r600_bytecode *bc, const struct r600_bytecode_gds *gds); int r600_bytecode_add_output(struct r600_bytecode *bc, const struct r600_bytecode_output *output); +int r600_bytecode_add_pending_output(struct r600_bytecode *bc, + const struct r600_bytecode_output *output); int r600_bytecode_build(struct r600_bytecode *bc); int r600_bytecode_add_cf(struct r600_bytecode *bc); int r600_bytecode_add_cfinst(struct r600_bytecode *bc,