diff options
author | Dave Airlie <[email protected]> | 2015-11-30 16:05:14 +1000 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2015-12-07 09:59:02 +1000 |
commit | bb44c1f036f053c2099df00184f27aee6dece444 (patch) | |
tree | cfc3dd2b005a6f77768b4fbef1106b499b27cc89 /src/gallium/drivers/r600 | |
parent | 8ec2cb13e5a950b298935acabcac4346b3e63cd4 (diff) |
r600/asm: handle lds read operations.
Reads from the queue shouldn't be merged for now read operations.
Reads from the queue shouldn't be merged for now, or put in
T slots.
Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600')
-rw-r--r-- | src/gallium/drivers/r600/r600_asm.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c index 931caa0473f..05270119c8d 100644 --- a/src/gallium/drivers/r600/r600_asm.c +++ b/src/gallium/drivers/r600/r600_asm.c @@ -268,6 +268,24 @@ static int alu_uses_rel(struct r600_bytecode *bc, struct r600_bytecode_alu *alu) return 0; } +static int is_lds_read(int sel) +{ + return sel == EG_V_SQ_ALU_SRC_LDS_OQ_A_POP || sel == EG_V_SQ_ALU_SRC_LDS_OQ_B_POP; +} + +static int alu_uses_lds(struct r600_bytecode *bc, struct r600_bytecode_alu *alu) +{ + unsigned num_src = r600_bytecode_get_num_operands(bc, alu); + unsigned src; + + for (src = 0; src < num_src; ++src) { + if (is_lds_read(alu->src[src].sel)) { + return 1; + } + } + return 0; +} + static int is_alu_64bit_inst(struct r600_bytecode *bc, struct r600_bytecode_alu *alu) { const struct alu_op_info *op = r600_isa_alu(alu->op); @@ -787,6 +805,8 @@ static int merge_inst_groups(struct r600_bytecode *bc, struct r600_bytecode_alu } have_rel = 1; } + if (alu_uses_lds(bc, prev[i])) + return 0; num_once_inst += is_alu_once_inst(bc, prev[i]); } @@ -800,7 +820,7 @@ static int merge_inst_groups(struct r600_bytecode *bc, struct r600_bytecode_alu } else if (prev[i] && slots[i]) { if (max_slots == 5 && result[4] == NULL && prev[4] == NULL && slots[4] == NULL) { /* Trans unit is still free try to use it. */ - if (is_alu_any_unit_inst(bc, slots[i])) { + if (is_alu_any_unit_inst(bc, slots[i]) && !alu_uses_lds(bc, slots[i])) { result[i] = prev[i]; result[4] = slots[i]; } else if (is_alu_any_unit_inst(bc, prev[i])) { |