Mesa (master): lima/gpir: fix compile fail when two slot node
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Apr 14 05:10:42 UTC 2019
Module: Mesa
Branch: master
Commit: 8d91cd64aa8e6aa730c4fc3613a848f767d27089
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8d91cd64aa8e6aa730c4fc3613a848f767d27089
Author: Qiang Yu <yuq825 at gmail.com>
Date: Thu Apr 11 15:42:59 2019 +0800
lima/gpir: fix compile fail when two slot node
Come from glmark2-es2 jellyfish test.
Fixes: 92d7ca4b1cd "gallium: add lima driver"
Signed-off-by: Qiang Yu <yuq825 at gmail.com>
Reviewed-by: Vasily Khoruzhick <anarsoul at gmail.com>
---
src/gallium/drivers/lima/ir/gp/gpir.h | 5 +++++
src/gallium/drivers/lima/ir/gp/instr.c | 2 +-
src/gallium/drivers/lima/ir/gp/scheduler.c | 21 +++++++++++++++++++--
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/src/gallium/drivers/lima/ir/gp/gpir.h b/src/gallium/drivers/lima/ir/gp/gpir.h
index 47e4422cd83..43d2adf2366 100644
--- a/src/gallium/drivers/lima/ir/gp/gpir.h
+++ b/src/gallium/drivers/lima/ir/gp/gpir.h
@@ -377,6 +377,11 @@ bool gpir_instr_try_insert_node(gpir_instr *instr, gpir_node *node);
void gpir_instr_remove_node(gpir_instr *instr, gpir_node *node);
void gpir_instr_print_prog(gpir_compiler *comp);
+static inline bool gpir_instr_alu_slot_is_full(gpir_instr *instr)
+{
+ return instr->alu_num_slot_free <= instr->alu_num_slot_needed_by_store;
+}
+
bool gpir_codegen_acc_same_op(gpir_op op1, gpir_op op2);
bool gpir_pre_rsched_lower_prog(gpir_compiler *comp);
diff --git a/src/gallium/drivers/lima/ir/gp/instr.c b/src/gallium/drivers/lima/ir/gp/instr.c
index 84736990608..0ff7e7eabc2 100644
--- a/src/gallium/drivers/lima/ir/gp/instr.c
+++ b/src/gallium/drivers/lima/ir/gp/instr.c
@@ -273,7 +273,7 @@ static bool gpir_instr_insert_store_check(gpir_instr *instr, gpir_node *node)
* already in this instr's alu slot, so instr must have some free
* alu slot to insert this node's child
*/
- if (instr->alu_num_slot_free <= instr->alu_num_slot_needed_by_store)
+ if (gpir_instr_alu_slot_is_full(instr))
return false;
instr->alu_num_slot_needed_by_store++;
diff --git a/src/gallium/drivers/lima/ir/gp/scheduler.c b/src/gallium/drivers/lima/ir/gp/scheduler.c
index 8dbec242a7a..3d7e640ada2 100644
--- a/src/gallium/drivers/lima/ir/gp/scheduler.c
+++ b/src/gallium/drivers/lima/ir/gp/scheduler.c
@@ -464,16 +464,33 @@ static gpir_node *gpir_sched_instr_pass(gpir_instr *instr,
/* schedule node used by previous instr when count > 5 */
int count = 0;
+ gpir_node *two_slot_node = NULL;
list_for_each_entry(gpir_node, node, ready_list, list) {
if (gpir_is_input_node(node)) {
int min = gpir_get_min_scheduled_succ(node);
assert(min >= instr->index - 1);
- if (min == instr->index - 1)
- count += gpir_op_infos[node->op].may_consume_two_slots ? 2 : 1;
+ if (min == instr->index - 1) {
+ if (gpir_op_infos[node->op].may_consume_two_slots) {
+ two_slot_node = node;
+ count += 2;
+ }
+ else
+ count++;
+ }
}
}
if (count > 5) {
+ /* When no slot avaible, must schedule a move for two slot node
+ * to reduce the count. This results from the dummy_m/f method.
+ */
+ if (gpir_instr_alu_slot_is_full(instr)) {
+ assert(two_slot_node);
+ gpir_debug("instr is full, schedule move node for two slot node %d\n",
+ two_slot_node->index);
+ return gpir_sched_node(instr, two_slot_node);
+ }
+
/* schedule fully ready node first */
list_for_each_entry(gpir_node, node, ready_list, list) {
if (gpir_is_input_node(node)) {
More information about the mesa-commit
mailing list