aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/fragment_tree
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2025-05-20 15:42:39 +0200
committerGitHub <noreply@github.com>2025-05-20 13:42:39 +0000
commitd8294fa42378d2fa4645ddb7ada55a898d85c8ba (patch)
tree0ff685f95c9c055188d358c2cd590e9ecb33bb38 /components/layout/fragment_tree
parent27c8a899ea64810dea224a49e292819488e8b5de (diff)
downloadservo-d8294fa42378d2fa4645ddb7ada55a898d85c8ba.tar.gz
servo-d8294fa42378d2fa4645ddb7ada55a898d85c8ba.zip
layout: Split stacking context and display list construction (#37047)
Previously, after a layout was finished (or skipped in the case of repaint-only layout), both the stacking context tree and display list were built. In the case of repaint-only layout, we should be able to skip the reconstruction of the stacking context tree and only do display list building. This change does that, also generally cleaning and up and clarifying the data structure used during this phase of layout. This opens up the possibility of a new kind of incremental layout that does both repaint and a rebuild of the stacking context tree. On the blaster.html test case[^1], this reduces tightly-measured layout time from ~45-50 milliseconds to ~25-30 milliseconds on my M3. [^1]: https://gist.github.com/mrobinson/44ec87d028c0198917a7715a06dd98a0 Testing: There are currently no performance tests for layout. :( This should not modify the results of WPT tests. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Oriol Brufau <obrufau@igalia.com>
Diffstat (limited to 'components/layout/fragment_tree')
-rw-r--r--components/layout/fragment_tree/box_fragment.rs2
-rw-r--r--components/layout/fragment_tree/fragment_tree.rs11
2 files changed, 1 insertions, 12 deletions
diff --git a/components/layout/fragment_tree/box_fragment.rs b/components/layout/fragment_tree/box_fragment.rs
index 9b96b1c4fb4..b7c3a2a3524 100644
--- a/components/layout/fragment_tree/box_fragment.rs
+++ b/components/layout/fragment_tree/box_fragment.rs
@@ -92,7 +92,7 @@ pub(crate) struct BoxFragment {
pub scrollable_overflow_from_children: PhysicalRect<Au>,
/// The resolved box insets if this box is `position: sticky`. These are calculated
- /// during stacking context tree construction because they rely on the size of the
+ /// during `StackingContextTree` construction because they rely on the size of the
/// scroll container.
pub(crate) resolved_sticky_insets: AtomicRefCell<Option<PhysicalSides<AuOrAuto>>>,
diff --git a/components/layout/fragment_tree/fragment_tree.rs b/components/layout/fragment_tree/fragment_tree.rs
index 979bd0090fc..ba03a72ac21 100644
--- a/components/layout/fragment_tree/fragment_tree.rs
+++ b/components/layout/fragment_tree/fragment_tree.rs
@@ -14,7 +14,6 @@ use webrender_api::units;
use super::{BoxFragment, ContainingBlockManager, Fragment};
use crate::ArcRefCell;
use crate::context::LayoutContext;
-use crate::display_list::StackingContext;
use crate::geom::PhysicalRect;
#[derive(MallocSizeOf)]
@@ -91,16 +90,6 @@ impl FragmentTree {
fragment_tree
}
- pub(crate) fn build_display_list(
- &self,
- builder: &mut crate::display_list::DisplayListBuilder,
- root_stacking_context: &StackingContext,
- ) {
- // Paint the canvas’ background (if any) before/under everything else
- root_stacking_context.build_canvas_background_display_list(builder, self);
- root_stacking_context.build_display_list(builder);
- }
-
pub fn print(&self) {
let mut print_tree = PrintTree::new("Fragment Tree".to_string());
for fragment in &self.root_fragments {