aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/layout_task.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2014-10-14 19:33:28 -0600
committerbors-servo <metajack+bors@gmail.com>2014-10-14 19:33:28 -0600
commit7eaeaeeb217e7cbd083fe318863e7de4b9f38e2b (patch)
tree844d99c18b88fb72f73c38bec7652767fa540278 /components/layout/layout_task.rs
parent3eb6b17137964fc12779eca9597fa77930440138 (diff)
parent7368d42225b94f3ac821058800350d7c541f1a3f (diff)
downloadservo-7eaeaeeb217e7cbd083fe318863e7de4b9f38e2b.tar.gz
servo-7eaeaeeb217e7cbd083fe318863e7de4b9f38e2b.zip
auto merge of #3668 : cgaebel/servo/sequential-reflow, r=pcwalton
Now that DOM/Flow traversals have been refactored out, the `recalc_style_for_subtree` function in `css/matching.rs` can be removed, in lieu of just running the standard `recalc_style_for_node` and `construct_flows` traversals sequentially. Now we no longer have the maintenance headache of duplicating selector matching logic in two places! \o/ This passes reftests with both default arguments, and with `-y 1`. r? @pcwalton
Diffstat (limited to 'components/layout/layout_task.rs')
-rw-r--r--components/layout/layout_task.rs76
1 files changed, 19 insertions, 57 deletions
diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs
index 68ab0b863da..0d5f5ebbc41 100644
--- a/components/layout/layout_task.rs
+++ b/components/layout/layout_task.rs
@@ -5,18 +5,16 @@
//! The layout task. Performs layout on the DOM, builds display lists and sends them to be
//! rendered.
-use css::matching::{ApplicableDeclarations, MatchMethods};
use css::node_style::StyledNode;
use construct::FlowConstructionResult;
use context::{LayoutContext, SharedLayoutContext};
use flow::{Flow, ImmutableFlowUtils, MutableFlowUtils, MutableOwnedFlowUtils};
-use flow::{PreorderFlowTraversal, PostorderFlowTraversal};
use flow;
use flow_ref::FlowRef;
use layout_debug;
use parallel::UnsafeFlow;
use parallel;
-use traversal;
+use sequential;
use util::{LayoutDataAccess, LayoutDataWrapper, OpaqueNodeMethods, ToGfxColor};
use wrapper::{LayoutNode, TLayoutNode, ThreadSafeLayoutNode};
@@ -48,7 +46,6 @@ use servo_msg::constellation_msg::{ConstellationChan, PipelineId, Failure, Failu
use servo_net::image_cache_task::{ImageCacheTask, ImageResponseMsg};
use gfx::font_cache_task::{FontCacheTask};
use servo_net::local_image_cache::{ImageResponder, LocalImageCache};
-use servo_util::bloom::BloomFilter;
use servo_net::resource_task::{ResourceTask, load_bytes_iter};
use servo_util::geometry::Au;
use servo_util::geometry;
@@ -515,31 +512,10 @@ impl LayoutTask {
/// benchmarked against those two. It is marked `#[inline(never)]` to aid profiling.
#[inline(never)]
fn solve_constraints<'a>(&self,
- layout_root: &mut Flow,
- layout_context: &'a LayoutContext<'a>) {
+ layout_root: &mut FlowRef,
+ shared_layout_context: &SharedLayoutContext) {
let _scope = layout_debug_scope!("solve_constraints");
-
- if layout_context.shared.opts.bubble_inline_sizes_separately {
- let mut traversal = traversal::BubbleISizes {
- layout_context: layout_context,
- };
- layout_root.traverse_postorder(&mut traversal);
- }
-
- // FIXME(pcwalton): Prune these two passes.
- {
- let mut traversal = traversal::AssignISizes {
- layout_context: layout_context,
- };
- layout_root.traverse_preorder(&mut traversal);
- }
-
- {
- let mut traversal = traversal::AssignBSizesAndStoreOverflow {
- layout_context: layout_context,
- };
- layout_root.traverse_postorder(&mut traversal);
- }
+ sequential::traverse_flow_tree_preorder(layout_root, shared_layout_context);
}
/// Performs layout constraint solving in parallel.
@@ -552,12 +528,7 @@ impl LayoutTask {
rw_data: &mut LayoutTaskData,
layout_root: &mut FlowRef,
shared_layout_context: &SharedLayoutContext) {
- if shared_layout_context.opts.bubble_inline_sizes_separately {
- let mut traversal = traversal::BubbleISizes {
- layout_context: &LayoutContext::new(shared_layout_context),
- };
- layout_root.get_mut().traverse_postorder(&mut traversal);
- }
+ let _scope = layout_debug_scope!("solve_constraints_parallel");
match rw_data.parallel_traversal {
None => fail!("solve_contraints_parallel() called with no parallel traversal ready"),
@@ -649,17 +620,10 @@ impl LayoutTask {
let rw_data = rw_data.deref_mut();
match rw_data.parallel_traversal {
None => {
- let layout_ctx = LayoutContext::new(&shared_layout_ctx);
- let mut applicable_declarations = ApplicableDeclarations::new();
- let mut parent_bf = Some(box BloomFilter::new());
- node.recalc_style_for_subtree(&*rw_data.stylist,
- &layout_ctx,
- &mut parent_bf,
- &mut applicable_declarations,
- None)
+ sequential::traverse_dom_preorder(*node, &shared_layout_ctx);
}
Some(ref mut traversal) => {
- parallel::traverse_dom_preorder(*node, &mut shared_layout_ctx, traversal)
+ parallel::traverse_dom_preorder(*node, &shared_layout_ctx, traversal)
}
}
@@ -702,8 +666,7 @@ impl LayoutTask {
match rw_data.parallel_traversal {
None => {
// Sequential mode.
- let layout_ctx = LayoutContext::new(&shared_layout_ctx);
- self.solve_constraints(layout_root.get_mut(), &layout_ctx)
+ self.solve_constraints(&mut layout_root, &shared_layout_ctx)
}
Some(_) => {
// Parallel mode.
@@ -724,20 +687,19 @@ impl LayoutTask {
let rw_data = rw_data.deref_mut();
match rw_data.parallel_traversal {
None => {
- let layout_ctx = LayoutContext::new(&shared_layout_ctx);
- let mut traversal = traversal::BuildDisplayList {
- layout_context: &layout_ctx,
- };
- traversal.process(layout_root.get_mut());
+ sequential::build_display_list_for_subtree(
+ &mut layout_root,
+ &shared_layout_ctx);
}
Some(ref mut traversal) => {
- parallel::build_display_list_for_subtree(&mut layout_root,
- &data.url,
- data.iframe,
- self.first_reflow.get(),
- self.time_profiler_chan.clone(),
- &mut shared_layout_ctx,
- traversal);
+ parallel::build_display_list_for_subtree(
+ &mut layout_root,
+ &data.url,
+ data.iframe,
+ self.first_reflow.get(),
+ self.time_profiler_chan.clone(),
+ &shared_layout_ctx,
+ traversal);
}
}