summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-01-18 21:26:53 -0800
committerEric Anholt <[email protected]>2011-01-19 16:30:00 -0800
commitb41d323c90da47d720c015a18aa90e9efbb689aa (patch)
treea5ee511d70270c27924d288a09e04865edb786f8 /src/mesa/drivers/dri/i965
parent382c2d99da3f219a5b82f391a81b534b6b44ebce (diff)
i965/fs: Take the shared mathbox into account in instruction scheduling.
I don't have evidence for this amounting to any improvement, but it does codify a bit more what we understand so far about the pipeline.
Diffstat (limited to 'src/mesa/drivers/dri/i965')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp b/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp
index 00aa99de7f1..c8f0b27b76f 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_schedule_instructions.cpp
@@ -438,6 +438,21 @@ instruction_scheduler::schedule_instructions(fs_inst *next_block_header)
instructions.push_tail(child);
}
}
+
+ /* Shared resource: the mathbox. There's one per EU (on later
+ * generations, it's even more limited pre-gen6), so if we send
+ * something off to it then the next math isn't going to make
+ * progress until the first is done.
+ */
+ if (chosen->inst->is_math()) {
+ foreach_iter(exec_list_iterator, iter, instructions) {
+ schedule_node *n = (schedule_node *)iter.get();
+
+ if (n->inst->is_math())
+ n->unblocked_time = MAX2(n->unblocked_time,
+ time + chosen->latency);
+ }
+ }
}
assert(instructions_to_schedule == 0);