layout: Combine assign-widths and assign-heights traversals.

15% layout speedup on mobile Wikipedia.
This commit is contained in:
Patrick Walton 2014-02-14 18:18:48 -08:00
parent 9479a7dcac
commit 2cec5c6c5e
2 changed files with 13 additions and 23 deletions

View file

@ -16,8 +16,7 @@ use layout::flow::{Flow, FlowLeafSet, ImmutableFlowUtils, MutableFlowUtils, Muta
use layout::flow::{PreorderFlowTraversal, PostorderFlowTraversal};
use layout::flow;
use layout::incremental::RestyleDamage;
use layout::parallel::{AssignHeightsAndStoreOverflowTraversalKind, BubbleWidthsTraversalKind};
use layout::parallel::{PaddedUnsafeFlow};
use layout::parallel::PaddedUnsafeFlow;
use layout::parallel;
use layout::util::{LayoutDataAccess, OpaqueNode, LayoutDataWrapper};
use layout::wrapper::{DomLeafSet, LayoutNode, TLayoutNode, ThreadSafeLayoutNode};
@ -498,8 +497,7 @@ impl LayoutTask {
match self.parallel_traversal {
None => fail!("solve_contraints_parallel() called with no parallel traversal ready"),
Some(ref mut traversal) => {
parallel::traverse_flow_tree_postorder(BubbleWidthsTraversalKind,
&self.flow_leaf_set,
parallel::traverse_flow_tree_postorder(&self.flow_leaf_set,
self.profiler_chan.clone(),
layout_context,
traversal);
@ -510,12 +508,6 @@ impl LayoutTask {
self.profiler_chan.clone(),
layout_context,
traversal);
parallel::traverse_flow_tree_postorder(AssignHeightsAndStoreOverflowTraversalKind,
&self.flow_leaf_set,
self.profiler_chan.clone(),
layout_context,
traversal);
}
}
}

View file

@ -25,11 +25,6 @@ use std::ptr;
use std::sync::atomics::{AtomicInt, Relaxed, SeqCst};
use style::{Stylist, TNode};
pub enum TraversalKind {
BubbleWidthsTraversalKind,
AssignHeightsAndStoreOverflowTraversalKind,
}
#[allow(dead_code)]
fn static_assertion(node: UnsafeLayoutNode) {
unsafe {
@ -169,6 +164,7 @@ trait ParallelPreorderFlowTraversal : PreorderFlowTraversal {
fn run_parallel(&mut self,
unsafe_flow: UnsafeFlow,
proxy: &mut WorkerProxy<*mut LayoutContext,PaddedUnsafeFlow>) {
let mut had_children = false;
unsafe {
// Get a real flow.
let flow: &mut ~Flow = cast::transmute(&unsafe_flow);
@ -178,11 +174,19 @@ trait ParallelPreorderFlowTraversal : PreorderFlowTraversal {
// Possibly enqueue the children.
for kid in flow::child_iter(*flow) {
had_children = true;
proxy.push(WorkUnit {
fun: assign_widths,
data: UnsafeFlowConversions::from_flow(&borrowed_flow_to_unsafe_flow(kid)),
});
}
}
// If there were no more children, start assigning heights.
if !had_children {
assign_heights_and_store_overflow(UnsafeFlowConversions::from_flow(&unsafe_flow),
proxy)
}
}
}
@ -344,8 +348,7 @@ pub fn traverse_flow_tree_preorder(root: &mut ~Flow,
queue.data = ptr::mut_null()
}
pub fn traverse_flow_tree_postorder(kind: TraversalKind,
leaf_set: &Arc<FlowLeafSet>,
pub fn traverse_flow_tree_postorder(leaf_set: &Arc<FlowLeafSet>,
profiler_chan: ProfilerChan,
layout_context: &mut LayoutContext,
queue: &mut WorkQueue<*mut LayoutContext,PaddedUnsafeFlow>) {
@ -353,15 +356,10 @@ pub fn traverse_flow_tree_postorder(kind: TraversalKind,
queue.data = cast::transmute(layout_context)
}
let fun = match kind {
BubbleWidthsTraversalKind => bubble_widths,
AssignHeightsAndStoreOverflowTraversalKind => assign_heights_and_store_overflow,
};
profile(time::LayoutParallelWarmupCategory, profiler_chan, || {
for (flow, _) in leaf_set.get().iter() {
queue.push(WorkUnit {
fun: fun,
fun: bubble_widths,
data: UnsafeFlowConversions::from_flow(flow),
})
}