diff --git a/Cargo.lock b/Cargo.lock index f570f7c77477a..d2628021a1fb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -176,7 +176,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac57f2b058a76363e357c056e4f74f1945bf734d37b8b3ef49066c4787dde0fc" dependencies = [ "clipboard-win", - "core-graphics", + "core-graphics 0.22.3", "image", "log", "objc", @@ -311,12 +311,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "binary-space-partition" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff" - [[package]] name = "bincode" version = "1.3.3" @@ -737,7 +731,7 @@ dependencies = [ "block", "cocoa-foundation", "core-foundation", - "core-graphics", + "core-graphics 0.22.3", "foreign-types 0.3.2", "libc", "objc", @@ -924,12 +918,6 @@ dependencies = [ "url", ] -[[package]] -name = "convert_case" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" - [[package]] name = "cookie" version = "0.12.0" @@ -978,6 +966,19 @@ dependencies = [ "libc", ] +[[package]] +name = "core-graphics" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + [[package]] name = "core-graphics-types" version = "0.1.3" @@ -996,11 +997,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d74ada66e07c1cefa18f8abfba765b486f250de2e4a999e5727fc0dd4b4a25" dependencies = [ "core-foundation", - "core-graphics", + "core-graphics 0.22.3", "foreign-types 0.3.2", "libc", ] +[[package]] +name = "core-text" +version = "20.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d2790b5c08465d49f8dc05c8bcae9fea467855947db39b0f8145c091aaced5" +dependencies = [ + "core-foundation", + "core-graphics 0.23.1", + "foreign-types 0.5.0", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -1101,16 +1114,6 @@ dependencies = [ "syn 2.0.52", ] -[[package]] -name = "cstr" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aa998c33a6d3271e3678950a22134cd7dd27cef86dee1b611b5b14207d1d90b" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "d3d12" version = "0.7.0" @@ -1208,7 +1211,7 @@ dependencies = [ [[package]] name = "derive_common" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "darling", "proc-macro2", @@ -1223,10 +1226,8 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case", "proc-macro2", "quote", - "rustc_version", "syn 1.0.109", ] @@ -1680,8 +1681,8 @@ dependencies = [ "bitflags 1.3.2", "byteorder", "core-foundation", - "core-graphics", - "core-text", + "core-graphics 0.22.3", + "core-text 19.2.0", "dirs-next", "dwrote", "float-ord", @@ -1951,8 +1952,8 @@ dependencies = [ "bitflags 2.4.2", "byteorder", "core-foundation", - "core-graphics", - "core-text", + "core-graphics 0.22.3", + "core-text 19.2.0", "dwrote", "euclid", "fnv", @@ -2565,8 +2566,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf8c27ca13930dc4ffe474880040fe9e0f03c2121600dc9c95423624cab3e467" dependencies = [ "cc", - "core-graphics", - "core-text", + "core-graphics 0.22.3", + "core-text 19.2.0", "foreign-types 0.3.2", "freetype", "pkg-config", @@ -3462,7 +3463,7 @@ dependencies = [ [[package]] name = "malloc_size_of" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "accountable-refcell", "app_units", @@ -4227,8 +4228,8 @@ dependencies = [ [[package]] name = "peek-poke" -version = "0.2.0" -source = "git+https://github.com/servo/webrender?rev=f91b68a61#f91b68a616377da0f3f8858f3cead3e47da4acdd" +version = "0.3.0" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" dependencies = [ "euclid", "peek-poke-derive", @@ -4236,13 +4237,13 @@ dependencies = [ [[package]] name = "peek-poke-derive" -version = "0.2.1" -source = "git+https://github.com/servo/webrender?rev=f91b68a61#f91b68a616377da0f3f8858f3cead3e47da4acdd" +version = "0.3.0" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", - "synstructure 0.12.6", + "syn 2.0.52", + "synstructure 0.13.1", "unicode-xid", ] @@ -4402,14 +4403,13 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plane-split" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f7075ec146b897b6e0faca47adeb7ed3d4f6eaa8145bf19db17311081b3f63" +checksum = "8c1f7d82649829ecdef8e258790b0587acf0a8403f0ce963473d8e918acc1643" dependencies = [ - "binary-space-partition", "euclid", "log", - "num-traits", + "smallvec", ] [[package]] @@ -5073,7 +5073,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.24.0" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "bitflags 1.3.2", "cssparser", @@ -5361,7 +5361,7 @@ dependencies = [ [[package]] name = "servo_arc" version = "0.2.0" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "nodrop", "serde", @@ -5371,7 +5371,7 @@ dependencies = [ [[package]] name = "servo_atoms" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "string_cache", "string_cache_codegen", @@ -5577,7 +5577,7 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "size_of_test" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "static_assertions", ] @@ -5703,7 +5703,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "static_prefs" version = "0.1.0" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" [[package]] name = "str-buf" @@ -5746,7 +5746,7 @@ dependencies = [ [[package]] name = "style" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "app_units", "arrayvec", @@ -5804,7 +5804,7 @@ dependencies = [ [[package]] name = "style_config" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "lazy_static", ] @@ -5812,7 +5812,7 @@ dependencies = [ [[package]] name = "style_derive" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "darling", "derive_common", @@ -5843,7 +5843,7 @@ dependencies = [ [[package]] name = "style_traits" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "app_units", "bitflags 1.3.2", @@ -5874,7 +5874,7 @@ dependencies = [ "cgl", "cocoa", "core-foundation", - "core-graphics", + "core-graphics 0.22.3", "euclid", "fnv", "gl_generator", @@ -6186,7 +6186,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "to_shmem" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "cssparser", "servo_arc", @@ -6199,7 +6199,7 @@ dependencies = [ [[package]] name = "to_shmem_derive" version = "0.0.1" -source = "git+https://github.com/servo/stylo.git?branch=2023-07-23#e2a483443afc5d3e6dd71dfb19ed45e1c8d8a2dc" +source = "git+https://github.com/servo/stylo.git?branch=webrender-upgrade#f8002258529f6aa803f2cc4c8f7aef884310fca3" dependencies = [ "darling", "derive_common", @@ -6328,6 +6328,12 @@ dependencies = [ "winnow", ] +[[package]] +name = "topological-sort" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa7c7f42dea4b1b99439786f5633aeb9c14c1b53f75e282803c2ec2ad545873c" + [[package]] name = "tower-service" version = "0.3.2" @@ -6864,31 +6870,24 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webrender" -version = "0.61.0" -source = "git+https://github.com/servo/webrender?rev=f91b68a61#f91b68a616377da0f3f8858f3cead3e47da4acdd" +version = "0.64.0" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" dependencies = [ "bincode", - "bitflags 1.3.2", + "bitflags 2.4.2", "build-parallel", "byteorder", - "core-foundation", - "core-graphics", - "core-text", - "cstr", "derive_more", - "dwrote", "etagere", "euclid", - "freetype", "fxhash", "gleam", "glslopt", "lazy_static", - "libc", "log", "malloc_size_of_derive", "num-traits", - "objc", + "peek-poke", "plane-split", "rayon", "ron", @@ -6896,24 +6895,23 @@ dependencies = [ "smallvec", "svg_fmt", "time 0.1.45", + "topological-sort", "tracy-rs", "webrender_api", "webrender_build", + "wr_glyph_rasterizer", "wr_malloc_size_of", ] [[package]] name = "webrender_api" -version = "0.61.0" -source = "git+https://github.com/servo/webrender?rev=f91b68a61#f91b68a616377da0f3f8858f3cead3e47da4acdd" +version = "0.64.0" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" dependencies = [ "app_units", - "bitflags 1.3.2", + "bitflags 2.4.2", "byteorder", - "core-foundation", - "core-graphics", "crossbeam-channel", - "derive_more", "euclid", "malloc_size_of_derive", "peek-poke", @@ -6926,10 +6924,10 @@ dependencies = [ [[package]] name = "webrender_build" -version = "0.0.1" -source = "git+https://github.com/servo/webrender?rev=f91b68a61#f91b68a616377da0f3f8858f3cead3e47da4acdd" +version = "0.0.2" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "lazy_static", ] @@ -7330,7 +7328,7 @@ dependencies = [ "bitflags 1.3.2", "cfg_aliases", "core-foundation", - "core-graphics", + "core-graphics 0.22.3", "dispatch", "instant", "libc", @@ -7382,10 +7380,35 @@ dependencies = [ "winapi", ] +[[package]] +name = "wr_glyph_rasterizer" +version = "0.1.0" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" +dependencies = [ + "core-foundation", + "core-graphics 0.23.1", + "core-text 20.1.0", + "dwrote", + "euclid", + "freetype", + "fxhash", + "lazy_static", + "libc", + "log", + "malloc_size_of_derive", + "objc", + "rayon", + "serde", + "smallvec", + "tracy-rs", + "webrender_api", + "wr_malloc_size_of", +] + [[package]] name = "wr_malloc_size_of" -version = "0.0.1" -source = "git+https://github.com/servo/webrender?rev=f91b68a61#f91b68a616377da0f3f8858f3cead3e47da4acdd" +version = "0.0.2" +source = "git+https://github.com/servo/webrender?branch=0.64#4c36a90f6f3e3326f127940d4b9e3874b88497cc" dependencies = [ "app_units", "euclid", diff --git a/Cargo.toml b/Cargo.toml index 17e2aefb1d545..d8f3d3798eb09 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,7 +64,7 @@ keyboard-types = "0.6" lazy_static = "1.4" libc = "0.2" log = "0.4" -malloc_size_of = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23", features = ["servo"] } +malloc_size_of = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade", features = ["servo"] } malloc_size_of_derive = "0.1" mime = "0.3.13" mime_guess = "2.0.3" @@ -87,31 +87,31 @@ rustls = { version = "0.21.10", features = ["dangerous_configuration"] } rustls-pemfile = "1.0.4" script_layout_interface = { path = "components/shared/script_layout" } script_traits = { path = "components/shared/script" } -selectors = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23" } +selectors = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade" } serde = "1.0.197" serde_bytes = "0.11" serde_json = "1.0" servo-media = { git = "https://github.com/servo/media" } servo-media-dummy = { git = "https://github.com/servo/media" } servo-media-gstreamer = { git = "https://github.com/servo/media" } -servo_arc = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23" } -servo_atoms = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23" } -size_of_test = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23" } +servo_arc = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade" } +servo_atoms = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade" } +size_of_test = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade" } smallbitvec = "2.3.0" smallvec = "1.13" sparkle = "0.1.26" string_cache = "0.8" string_cache_codegen = "0.5" -style = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23", features = ["servo"] } -style_config = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23" } -style_traits = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23", features = ["servo"] } +style = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade", features = ["servo"] } +style_config = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade" } +style_traits = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade", features = ["servo"] } # NOTE: the sm-angle feature only enables ANGLE on Windows, not other platforms! surfman = { version = "0.9", features = ["chains", "sm-angle", "sm-angle-default"] } syn = { version = "2", default-features = false, features = ["clone-impls", "derive", "parsing"] } synstructure = "0.13" thin-vec = "0.2.13" time = "0.1.41" -to_shmem = { git = "https://github.com/servo/stylo.git", branch = "2023-07-23" } +to_shmem = { git = "https://github.com/servo/stylo.git", branch = "webrender-upgrade" } tokio = "1" tokio-rustls = "0.24" tungstenite = "0.20" @@ -123,8 +123,8 @@ uuid = { version = "1.7.0", features = ["v4"] } webdriver = "0.49.0" webpki = "0.22" webpki-roots = "0.25" -webrender = { git = "https://github.com/servo/webrender", rev = "f91b68a61", features = ["capture"] } -webrender_api = { git = "https://github.com/servo/webrender", rev = "f91b68a61" } +webrender = { git = "https://github.com/servo/webrender", branch = "0.64", features = ["capture"] } +webrender_api = { git = "https://github.com/servo/webrender", branch = "0.64" } webrender_traits = { path = "components/shared/webrender" } wgpu-core = "0.18" wgpu-types = "0.18" diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 612774a767574..65cfb606ba106 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -50,10 +50,10 @@ use webrender_api::units::{ LayoutVector2D, WorldPoint, }; use webrender_api::{ - self, BuiltDisplayList, ClipId, DirtyRect, DocumentId, Epoch as WebRenderEpoch, + self, BuiltDisplayList, DirtyRect, DisplayListPayload, DocumentId, Epoch as WebRenderEpoch, ExternalScrollId, HitTestFlags, PipelineId as WebRenderPipelineId, PropertyBinding, - ReferenceFrameKind, ScrollClamping, ScrollLocation, SpaceAndClipInfo, SpatialId, - TransformStyle, ZoomFactor, + ReferenceFrameKind, RenderReasons, SampledScrollOffset, ScrollLocation, SpaceAndClipInfo, + SpatialId, SpatialTreeItemKey, TransformStyle, }; use crate::gl::RenderTargetInfo; @@ -110,13 +110,6 @@ impl FrameTreeId { } } -/// One pixel in layer coordinate space. -/// -/// This unit corresponds to a "pixel" in layer coordinate space, which after scaling and -/// transformation becomes a device pixel. -#[derive(Clone, Copy, Debug)] -enum LayerPixel {} - struct RootPipeline { top_level_browsing_context_id: TopLevelBrowsingContextId, id: Option, @@ -138,9 +131,6 @@ pub struct IOCompositor { /// Tracks details about each active pipeline that the compositor knows about. pipeline_details: HashMap, - /// The scene scale, to allow for zooming and high-resolution painting. - scale: Scale, - /// "Mobile-style" zoom that does not reflow the page. viewport_zoom: PinchZoomFactor, @@ -383,7 +373,6 @@ impl IOCompositor { id: None, }, pipeline_details: HashMap::new(), - scale: Scale::new(1.0), composition_request: CompositionRequest::NoCompositingNecessary, touch_handler: TouchHandler::new(), pending_scroll_zoom_events: Vec::new(), @@ -429,7 +418,7 @@ impl IOCompositor { convert_mouse_to_touch: bool, top_level_browsing_context_id: TopLevelBrowsingContextId, ) -> Self { - let mut compositor = IOCompositor::new( + let compositor = IOCompositor::new( window, state, composite_target, @@ -441,10 +430,6 @@ impl IOCompositor { // Make sure the GL state is OK compositor.assert_gl_framebuffer_complete(); - - // Set the size of the root layer. - compositor.update_zoom_transform(); - compositor } @@ -640,7 +625,7 @@ impl IOCompositor { CompositorMsg::WebDriverMouseButtonEvent(mouse_event_type, mouse_button, x, y), ShutdownState::NotShuttingDown, ) => { - let dppx = self.device_pixels_per_page_px(); + let dppx = self.device_pixel_ratio(); let point = dppx.transform_point(Point2D::new(x, y)); self.on_mouse_window_event_class(match mouse_event_type { MouseEventType::Click => MouseWindowEvent::Click(mouse_button, point), @@ -650,7 +635,7 @@ impl IOCompositor { }, (CompositorMsg::WebDriverMouseMoveEvent(x, y), ShutdownState::NotShuttingDown) => { - let dppx = self.device_pixels_per_page_px(); + let dppx = self.device_pixel_ratio(); let point = dppx.transform_point(Point2D::new(x, y)); self.on_mouse_window_move_event_class(DevicePoint::new(point.x, point.y)); }, @@ -702,13 +687,7 @@ impl IOCompositor { ) => { self.waiting_on_pending_frame = true; let mut txn = Transaction::new(); - txn.set_display_list( - WebRenderEpoch(0), - None, - Default::default(), - (pipeline, Default::default()), - false, - ); + txn.set_display_list(WebRenderEpoch(0), (pipeline, Default::default())); self.webrender_api .send_transaction(self.webrender_document, txn); @@ -720,8 +699,15 @@ impl IOCompositor { self.waiting_for_results_of_scroll = true; let mut txn = Transaction::new(); - txn.scroll_node_with_id(point, scroll_id, ScrollClamping::NoClamping); - txn.generate_frame(0); + let offset = point.to_vector(); + txn.set_scroll_offsets( + scroll_id, + vec![SampledScrollOffset { + offset, + generation: 0, + }], + ); + txn.generate_frame(0, RenderReasons::APZ); self.webrender_api .send_transaction(self.webrender_document, txn); }, @@ -733,10 +719,39 @@ impl IOCompositor { display_list_receiver, }, ) => { - let display_list_data = match display_list_receiver.recv() { + // This must match the order from the sender, currently in `shared/script/lib.rs`. + let items_data = match display_list_receiver.recv() { Ok(display_list_data) => display_list_data, - _ => return warn!("Could not recieve WebRender display list."), + Err(error) => { + return warn!( + "Could not recieve WebRender display list items data: {error}" + ) + }, }; + let cache_data = match display_list_receiver.recv() { + Ok(display_list_data) => display_list_data, + Err(error) => { + return warn!( + "Could not recieve WebRender display list cache data: {error}" + ) + }, + }; + let spatial_tree = match display_list_receiver.recv() { + Ok(display_list_data) => display_list_data, + Err(error) => { + return warn!( + "Could not recieve WebRender display list spatial tree: {error}." + ) + }, + }; + let built_display_list = BuiltDisplayList::from_data( + DisplayListPayload { + items_data, + cache_data, + spatial_tree, + }, + display_list_descriptor, + ); self.waiting_on_pending_frame = true; @@ -746,20 +761,26 @@ impl IOCompositor { details.hit_test_items = display_list_info.hit_test_info; details.install_new_scroll_tree(display_list_info.scroll_tree); - let mut txn = Transaction::new(); - txn.set_display_list( - display_list_info.epoch, - None, - display_list_info.viewport_size, - ( - pipeline_id, - BuiltDisplayList::from_data(display_list_data, display_list_descriptor), - ), - true, - ); - txn.generate_frame(0); + let mut transaction = Transaction::new(); + transaction + .set_display_list(display_list_info.epoch, (pipeline_id, built_display_list)); + + for node in details.scroll_tree.nodes.iter() { + if let (Some(offset), Some(external_id)) = (node.offset(), node.external_id()) { + let offset = LayoutVector2D::new(-offset.x, -offset.y); + transaction.set_scroll_offsets( + external_id, + vec![SampledScrollOffset { + offset, + generation: 0, + }], + ); + } + } + + transaction.generate_frame(0, RenderReasons::SCENE); self.webrender_api - .send_transaction(self.webrender_document, txn); + .send_transaction(self.webrender_document, transaction); }, ForwardedToCompositorMsg::Layout(script_traits::ScriptToCompositorMsg::HitTest( @@ -939,13 +960,13 @@ impl IOCompositor { /// the root pipeline is the root content pipeline. If there is pinch zoom, the root /// content pipeline is wrapped in a display list that applies a pinch zoom /// transformation to it. - fn set_root_content_pipeline_handling_pinch_zoom(&self, transaction: &mut Transaction) { + fn set_root_content_pipeline_handling_device_scaling(&self, transaction: &mut Transaction) { let root_content_pipeline = match self.root_content_pipeline.id { Some(id) => id.to_webrender(), None => return, }; - let zoom_factor = self.pinch_zoom_level(); + let zoom_factor = self.pinch_zoom_level() * self.device_pixel_ratio().0; if zoom_factor == 1.0 { transaction.set_root_pipeline(root_content_pipeline); return; @@ -958,11 +979,12 @@ impl IOCompositor { transaction.set_root_pipeline(root_pipeline); let mut builder = webrender_api::DisplayListBuilder::new(root_pipeline); + builder.begin(); let viewport_size = LayoutSize::new( self.embedder_coordinates.get_viewport().width() as f32, self.embedder_coordinates.get_viewport().height() as f32, ); - let viewport_rect = LayoutRect::new(LayoutPoint::zero(), viewport_size); + let zoom_reference_frame = builder.push_reference_frame( LayoutPoint::zero(), SpatialId::root_reference_frame(root_pipeline), @@ -971,31 +993,37 @@ impl IOCompositor { ReferenceFrameKind::Transform { is_2d_scale_translation: true, should_snap: true, + paired_with_perspective: false, }, + SpatialTreeItemKey::new(0, 0), ); + let scaled_viewport_rect = LayoutRect::from_origin_and_size( + LayoutPoint::zero(), + LayoutSize::new( + viewport_size.width / zoom_factor, + viewport_size.height / zoom_factor, + ), + ); + + let root_clip_id = builder.define_clip_rect(zoom_reference_frame, scaled_viewport_rect); + let clip_chain_id = builder.define_clip_chain(None, [root_clip_id]); builder.push_iframe( - viewport_rect, - viewport_rect, + scaled_viewport_rect, + scaled_viewport_rect, &SpaceAndClipInfo { spatial_id: zoom_reference_frame, - clip_id: ClipId::root(root_pipeline), + clip_chain_id, }, root_content_pipeline, true, ); - let built_display_list = builder.finalize(); + let built_display_list = builder.end(); // NB: We are always passing 0 as the epoch here, but this doesn't seem to // be an issue. WebRender will still update the scene and generate a new // frame even though the epoch hasn't changed. - transaction.set_display_list( - WebRenderEpoch(0), - None, - viewport_rect.size, - built_display_list, - false, - ); + transaction.set_display_list(WebRenderEpoch(0), built_display_list); } fn set_frame_tree(&mut self, frame_tree: &SendableFrameTree) { @@ -1010,8 +1038,8 @@ impl IOCompositor { }; let mut txn = Transaction::new(); - self.set_root_content_pipeline_handling_pinch_zoom(&mut txn); - txn.generate_frame(0); + self.set_root_content_pipeline_handling_device_scaling(&mut txn); + txn.generate_frame(0, RenderReasons::NONE); self.webrender_api .send_transaction(self.webrender_document, txn); @@ -1060,45 +1088,10 @@ impl IOCompositor { self.pipeline_details.remove(&pipeline_id); } - fn send_window_size(&mut self, size_type: WindowSizeType) { - let dppx = self.page_zoom * self.embedder_coordinates.hidpi_factor; - - let mut transaction = Transaction::new(); - transaction.set_document_view( - self.embedder_coordinates.get_viewport(), - self.embedder_coordinates.hidpi_factor.get(), - ); - self.webrender_api - .send_transaction(self.webrender_document, transaction); - - let initial_viewport = self.embedder_coordinates.viewport.size.to_f32() / dppx; - - let data = WindowSizeData { - device_pixel_ratio: dppx, - initial_viewport: initial_viewport, - }; - - let top_level_browsing_context_id = - self.root_content_pipeline.top_level_browsing_context_id; - - let msg = ConstellationMsg::WindowSize(top_level_browsing_context_id, data, size_type); - - if let Err(e) = self.constellation_chan.send(msg) { - warn!("Sending window resize to constellation failed ({:?}).", e); - } - } - pub fn on_resize_window_event(&mut self) -> bool { - trace!("Compositor resize requested"); - let old_coords = self.embedder_coordinates; self.embedder_coordinates = self.window.get_coordinates(); - // A size change could also mean a resolution change. - if self.embedder_coordinates.hidpi_factor != old_coords.hidpi_factor { - self.update_zoom_transform(); - } - // If the framebuffer size has changed, invalidate the current framebuffer object, and mark // the last framebuffer object as needing to be invalidated at the end of the next frame. if self.embedder_coordinates.framebuffer != old_coords.framebuffer { @@ -1106,11 +1099,21 @@ impl IOCompositor { self.invalidate_prev_offscreen_framebuffer = true; } - if self.embedder_coordinates.viewport == old_coords.viewport { + if self.embedder_coordinates.viewport != old_coords.viewport { + let mut transaction = Transaction::new(); + transaction.set_document_view(self.embedder_coordinates.get_viewport()); + self.webrender_api + .send_transaction(self.webrender_document, transaction); + } + + // A size change could also mean a resolution change. + if self.embedder_coordinates.hidpi_factor == old_coords.hidpi_factor && + self.embedder_coordinates.viewport == old_coords.viewport + { return false; } - self.send_window_size(WindowSizeType::Resize); + self.update_after_zoom_or_hidpi_change(); self.composite_if_necessary(CompositingReason::Resize); return true; } @@ -1162,7 +1165,8 @@ impl IOCompositor { } fn hit_test_at_device_point(&self, point: DevicePoint) -> Option { - let dppx = self.page_zoom * self.hidpi_factor(); + //let dppx = self.page_zoom * self.hidpi_factor(); + let dppx: Scale = Scale::new(1.0); let scaled_point = (point / dppx).to_untyped(); let world_point = WorldPoint::from_untyped(scaled_point); return self.hit_test_at_point(world_point); @@ -1430,7 +1434,8 @@ impl IOCompositor { let zoom_changed = self.set_pinch_zoom_level(self.pinch_zoom_level() * combined_magnification); let scroll_result = combined_scroll_event.and_then(|combined_event| { - let cursor = (combined_event.cursor.to_f32() / self.scale).to_untyped(); + let device_pixels_per_page = self.device_pixel_ratio(); + let cursor = (combined_event.cursor.to_f32() / device_pixels_per_page).to_untyped(); self.scroll_node_at_world_point( WorldPoint::from_untyped(cursor), combined_event.scroll_location, @@ -1442,17 +1447,23 @@ impl IOCompositor { let mut transaction = Transaction::new(); if zoom_changed { - self.set_root_content_pipeline_handling_pinch_zoom(&mut transaction); + self.set_root_content_pipeline_handling_device_scaling(&mut transaction); } if let Some((pipeline_id, external_id, offset)) = scroll_result { - let scroll_origin = LayoutPoint::new(-offset.x, -offset.y); - transaction.scroll_node_with_id(scroll_origin, external_id, ScrollClamping::NoClamping); + let offset = LayoutVector2D::new(-offset.x, -offset.y); + transaction.set_scroll_offsets( + external_id, + vec![SampledScrollOffset { + offset, + generation: 0, + }], + ); self.send_scroll_positions_to_layout_for_pipeline(&pipeline_id); self.waiting_for_results_of_scroll = true } - transaction.generate_frame(0); + transaction.generate_frame(0, RenderReasons::APZ); self.webrender_api .send_transaction(self.webrender_document, transaction); } @@ -1468,8 +1479,10 @@ impl IOCompositor { ) -> Option<(PipelineId, ExternalScrollId, LayoutVector2D)> { let scroll_location = match scroll_location { ScrollLocation::Delta(delta) => { - let scaled_delta = - (Vector2D::from_untyped(delta.to_untyped()) / self.scale).to_untyped(); + let device_pixels_per_page = self.device_pixel_ratio(); + let scaled_delta = (Vector2D::from_untyped(delta.to_untyped()) / + device_pixels_per_page) + .to_untyped(); let calculated_delta = LayoutVector2D::from_untyped(scaled_delta); ScrollLocation::Delta(calculated_delta) }, @@ -1543,20 +1556,13 @@ impl IOCompositor { self.embedder_coordinates.hidpi_factor } - fn device_pixels_per_page_px(&self) -> Scale { + fn device_pixel_ratio(&self) -> Scale { self.page_zoom * self.hidpi_factor() } - fn update_zoom_transform(&mut self) { - let scale = self.device_pixels_per_page_px(); - self.scale = Scale::new(scale.get()); - } - pub fn on_zoom_reset_window_event(&mut self) { self.page_zoom = Scale::new(1.0); - self.update_zoom_transform(); - self.send_window_size(WindowSizeType::Resize); - self.update_page_zoom_for_webrender(); + self.update_after_zoom_or_hidpi_change(); } pub fn on_zoom_window_event(&mut self, magnification: f32) { @@ -1565,18 +1571,36 @@ impl IOCompositor { .max(MIN_ZOOM) .min(MAX_ZOOM), ); - self.update_zoom_transform(); - self.send_window_size(WindowSizeType::Resize); - self.update_page_zoom_for_webrender(); + self.update_after_zoom_or_hidpi_change(); } - fn update_page_zoom_for_webrender(&mut self) { - let page_zoom = ZoomFactor::new(self.page_zoom.get()); + fn update_after_zoom_or_hidpi_change(&mut self) { + // Send the new viewport size and HiDPI scale to the constellation. + let device_pixel_ratio = self.device_pixel_ratio(); + let initial_viewport = + self.embedder_coordinates.viewport.size().to_f32() / device_pixel_ratio; + let data = WindowSizeData { + device_pixel_ratio: Scale::new(1.0), + initial_viewport, + }; - let mut txn = webrender::Transaction::new(); - txn.set_page_zoom(page_zoom); + let top_level_browsing_context_id = + self.root_content_pipeline.top_level_browsing_context_id; + + let msg = ConstellationMsg::WindowSize( + top_level_browsing_context_id, + data, + WindowSizeType::Resize, + ); + if let Err(e) = self.constellation_chan.send(msg) { + warn!("Sending window resize to constellation failed ({:?}).", e); + } + + // Update the root transform in WebRender to reflect the new zoom. + let mut transaction = webrender::Transaction::new(); + self.set_root_content_pipeline_handling_device_scaling(&mut transaction); self.webrender_api - .send_transaction(self.webrender_document, txn); + .send_transaction(self.webrender_document, transaction); } /// Simulate a pinch zoom @@ -1834,7 +1858,7 @@ impl IOCompositor { } let (x, y, width, height) = if let Some(rect) = rect { - let rect = self.device_pixels_per_page_px().transform_rect(&rect); + let rect = self.device_pixel_ratio().transform_rect(&rect); let x = rect.origin.x as i32; // We need to convert to the bottom-left origin coordinate @@ -1971,10 +1995,10 @@ impl IOCompositor { // Set the viewport background based on prefs. let viewport = self.embedder_coordinates.get_flipped_viewport(); gl.scissor( - viewport.origin.x, - viewport.origin.y, - viewport.size.width, - viewport.size.height, + viewport.min.x, + viewport.min.y, + viewport.size().width, + viewport.size().height, ); let color = servo_config::pref!(shell.background_color.rgba); @@ -2113,7 +2137,7 @@ impl IOCompositor { self.webrender.set_debug_flags(flags); let mut txn = Transaction::new(); - txn.generate_frame(0); + txn.generate_frame(0, RenderReasons::TESTING); self.webrender_api .send_transaction(self.webrender_document, txn); } diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs index a1a36ee688df3..fbb642c047d23 100644 --- a/components/compositing/windowing.rs +++ b/components/compositing/windowing.rs @@ -219,7 +219,7 @@ impl EmbedderCoordinates { pub fn get_flipped_viewport(&self) -> DeviceIntRect { let fb_height = self.framebuffer.height; let mut view = self.viewport.clone(); - view.origin.y = fb_height - view.origin.y - view.size.height; + view.min.y = fb_height - view.min.y - view.size().height; DeviceIntRect::from_untyped(&view.to_untyped()) } } diff --git a/components/geometry/lib.rs b/components/geometry/lib.rs index 54ccd67d109ae..25ce5cfceaf12 100644 --- a/components/geometry/lib.rs +++ b/components/geometry/lib.rs @@ -51,7 +51,7 @@ impl MaxRect for Rect { impl MaxRect for LayoutRect { #[inline] fn max_rect() -> LayoutRect { - LayoutRect::new( + LayoutRect::from_origin_and_size( LayoutPoint::new(f32::MIN / 2.0, f32::MIN / 2.0), LayoutSize::new(f32::MAX, f32::MAX), ) diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs index c813def21422e..e5a03398a0e36 100644 --- a/components/layout/display_list/builder.rs +++ b/components/layout/display_list/builder.rs @@ -27,6 +27,7 @@ use log::{debug, warn}; use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image_cache::UsePlaceholder; use range::Range; +use script_traits::compositor::ScrollSensitivity; use servo_config::opts; use servo_geometry::{self, MaxRect}; use style::color::AbsoluteColor; @@ -49,7 +50,7 @@ use webrender_api::units::{LayoutRect, LayoutTransform, LayoutVector2D}; use webrender_api::{ self, BorderDetails, BorderRadius, BorderSide, BoxShadowClipMode, ColorF, ColorU, ExternalScrollId, FilterOp, GlyphInstance, ImageRendering, LineStyle, NinePatchBorder, - NinePatchBorderSource, NormalBorder, PropertyBinding, ScrollSensitivity, StickyOffsetBounds, + NinePatchBorderSource, NormalBorder, PropertyBinding, StickyOffsetBounds, }; use crate::block::BlockFlow; @@ -382,6 +383,7 @@ impl<'a> DisplayListBuildState<'a> { &self, clip_rect: Rect, node: OpaqueNode, + unique_id: u64, cursor: Option, section: DisplayListSection, ) -> BaseDisplayItem { @@ -395,6 +397,7 @@ impl<'a> DisplayListBuildState<'a> { self.create_base_display_item_with_clipping_and_scrolling( clip_rect, node, + unique_id, cursor, section, clipping_and_scrolling, @@ -405,12 +408,17 @@ impl<'a> DisplayListBuildState<'a> { &self, clip_rect: Rect, node: OpaqueNode, + unique_id: u64, cursor: Option, section: DisplayListSection, clipping_and_scrolling: ClippingAndScrolling, ) -> BaseDisplayItem { BaseDisplayItem::new( - DisplayItemMetadata { node, cursor }, + DisplayItemMetadata { + node, + unique_id, + cursor, + }, clip_rect.to_layout(), section, self.current_stacking_context_id, @@ -700,6 +708,7 @@ impl Fragment { let base = state.create_base_display_item( bounds, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), display_list_section, ); @@ -840,6 +849,7 @@ impl Fragment { let base = state.create_base_display_item( placement.clip_rect, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), display_list_section, ); @@ -962,6 +972,7 @@ impl Fragment { let base = state.create_base_display_item( placement.clip_rect, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), display_list_section, ); @@ -1038,6 +1049,7 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), display_list_section, ); @@ -1124,6 +1136,7 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), display_list_section, ); @@ -1219,7 +1232,7 @@ impl Fragment { )?; width = image.width; height = image.height; - NinePatchBorderSource::Image(image.key?) + NinePatchBorderSource::Image(image.key?, ImageRendering::Auto) }, Image::PaintWorklet(ref paint_worklet) => { let image = self.get_webrender_image_for_paint_worklet( @@ -1230,7 +1243,7 @@ impl Fragment { )?; width = image.width; height = image.height; - NinePatchBorderSource::Image(image.key?) + NinePatchBorderSource::Image(image.key?, ImageRendering::Auto) }, Image::Gradient(ref gradient) => match **gradient { Gradient::Linear { @@ -1286,7 +1299,6 @@ impl Fragment { fill: border_image_fill, repeat_horizontal: border_image_repeat.0.to_layout(), repeat_vertical: border_image_repeat.1.to_layout(), - outset: SideOffsets2D::zero(), }); state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, @@ -1338,6 +1350,7 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), DisplayListSection::Outlines, ); @@ -1370,6 +1383,7 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), DisplayListSection::Content, ); @@ -1400,12 +1414,13 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(style, Cursor::Default), DisplayListSection::Content, ); // TODO(gw): Use a better estimate for wavy line thickness. let area = baseline.to_layout(); - let wavy_line_thickness = (0.33 * area.size.height).ceil(); + let wavy_line_thickness = (0.33 * area.size().height).ceil(); state.add_display_item(DisplayItem::Line(CommonDisplayItem::new( base, webrender_api::LineDisplayItem { @@ -1430,6 +1445,7 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(&self.style, Cursor::Default), DisplayListSection::Content, ); @@ -1473,6 +1489,7 @@ impl Fragment { let base = state.create_base_display_item( stacking_relative_border_box, self.node, + self.unique_id(), get_cursor(&self.style, Cursor::Default), display_list_section, ); @@ -1520,6 +1537,7 @@ impl Fragment { let base = state.create_base_display_item( insertion_point_bounds, self.node, + self.unique_id(), get_cursor(&self.style, cursor), display_list_section, ); @@ -1707,6 +1725,7 @@ impl Fragment { let base = state.create_base_display_item_with_clipping_and_scrolling( content_size, self.node, + self.unique_id(), // FIXME(emilio): Why does this ignore pointer-events? get_cursor(&self.style, Cursor::Default).or(Some(Cursor::Default)), display_list_section, @@ -1771,6 +1790,7 @@ impl Fragment { state.create_base_display_item( stacking_relative_border_box, self.node, + self.unique_id(), get_cursor(&self.style, Cursor::Default), DisplayListSection::Content, ) @@ -1857,7 +1877,7 @@ impl Fragment { // looks bogus. state.iframe_sizes.insert( browsing_context_id, - euclid::Size2D::new(bounds.size.width, bounds.size.height), + euclid::Size2D::new(bounds.size().width, bounds.size().height), ); let pipeline_id = match fragment_info.pipeline_id { @@ -2065,6 +2085,7 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(&self.style, cursor), DisplayListSection::Content, ); @@ -2228,13 +2249,14 @@ impl Fragment { let base = state.create_base_display_item( clip, self.node, + self.unique_id(), get_cursor(&self.style, Cursor::Default), DisplayListSection::Content, ); // TODO(gw): Use a better estimate for wavy line thickness. let area = stacking_relative_box.to_layout(); - let wavy_line_thickness = (0.33 * area.size.height).ceil(); + let wavy_line_thickness = (0.33 * area.size().height).ceil(); state.add_display_item(DisplayItem::Line(CommonDisplayItem::new( base, webrender_api::LineDisplayItem { @@ -2943,8 +2965,15 @@ impl BaseFlow { let mut color = THREAD_TINT_COLORS[thread_id as usize % THREAD_TINT_COLORS.len()]; color.a = 1.0; - let base = - state.create_base_display_item(self.clip, node, None, DisplayListSection::Content); + let base = state.create_base_display_item( + self.clip, + node, + // This item will never become a spatial tree node, so it's fine + // to pass 0 here. + 0, + None, + DisplayListSection::Content, + ); let bounds = stacking_context_relative_bounds.inflate(Au::from_px(2), Au::from_px(2)); state.add_display_item(DisplayItem::Border(CommonDisplayItem::with_data( base, @@ -3121,6 +3150,6 @@ trait ToF32Px { impl ToF32Px for Rect { type Output = LayoutRect; fn to_f32_px(&self) -> LayoutRect { - LayoutRect::from_untyped(&servo_geometry::au_rect_to_f32_rect(*self)) + LayoutRect::from_untyped(&servo_geometry::au_rect_to_f32_rect(*self).to_box2d()) } } diff --git a/components/layout/display_list/conversions.rs b/components/layout/display_list/conversions.rs index 69c68951e7b72..30af153fe203a 100644 --- a/components/layout/display_list/conversions.rs +++ b/components/layout/display_list/conversions.rs @@ -139,7 +139,7 @@ impl ToLayout for Point2D { impl ToLayout for Rect { type Type = wr::units::LayoutRect; fn to_layout(&self) -> Self::Type { - wr::units::LayoutRect::new(self.origin.to_layout(), self.size.to_layout()) + wr::units::LayoutRect::from_origin_and_size(self.origin.to_layout(), self.size.to_layout()) } } diff --git a/components/layout/display_list/items.rs b/components/layout/display_list/items.rs index 9f1d6d76df539..8f2aeb58bbc39 100644 --- a/components/layout/display_list/items.rs +++ b/components/layout/display_list/items.rs @@ -22,7 +22,7 @@ use gfx_traits::print_tree::PrintTree; use gfx_traits::{self, StackingContextId}; use msg::constellation_msg::PipelineId; use net_traits::image::base::Image; -use script_traits::compositor::ScrollTreeNodeId; +use script_traits::compositor::{ScrollSensitivity, ScrollTreeNodeId}; use serde::Serialize; use servo_geometry::MaxRect; use style::computed_values::_servo_top_layer::T as InTopLayer; @@ -30,9 +30,9 @@ pub use style::dom::OpaqueNode; use webrender_api as wr; use webrender_api::units::{LayoutPixel, LayoutRect, LayoutTransform}; use webrender_api::{ - BorderRadius, ClipChainId, ClipId, ClipMode, CommonItemProperties, ComplexClipRegion, - ExternalScrollId, FilterOp, GlyphInstance, GradientStop, ImageKey, MixBlendMode, - PrimitiveFlags, ScrollSensitivity, Shadow, SpatialId, StickyOffsetBounds, TransformStyle, + BorderRadius, ClipChainId, ClipMode, CommonItemProperties, ComplexClipRegion, ExternalScrollId, + FilterOp, GlyphInstance, GradientStop, ImageKey, MixBlendMode, PrimitiveFlags, Shadow, + SpatialId, StickyOffsetBounds, TransformStyle, }; /// The factor that we multiply the blur radius by in order to inflate the boundaries of display @@ -477,6 +477,7 @@ impl BaseDisplayItem { BaseDisplayItem { metadata: DisplayItemMetadata { node: OpaqueNode(0), + unique_id: 0, cursor: None, }, // Create a rectangle of maximal size. @@ -493,7 +494,7 @@ impl BaseDisplayItem { pub fn empty_common_item_properties() -> CommonItemProperties { CommonItemProperties { clip_rect: LayoutRect::max_rect(), - clip_id: ClipId::root(wr::PipelineId::dummy()), + clip_chain_id: ClipChainId::INVALID, spatial_id: SpatialId::root_scroll_node(wr::PipelineId::dummy()), flags: PrimitiveFlags::empty(), } @@ -551,6 +552,8 @@ impl fmt::Debug for ClippingRegion { pub struct DisplayItemMetadata { /// The DOM node from which this display item originated. pub node: OpaqueNode, + /// The unique fragment id of the fragment of this item. + pub unique_id: u64, /// The value of the `cursor` property when the mouse hovers over this display item. If `None`, /// this display item is ineligible for pointer events (`pointer-events: none`). pub cursor: Option, diff --git a/components/layout/display_list/webrender_helpers.rs b/components/layout/display_list/webrender_helpers.rs index 04d8d825e0653..c86b2e89391b2 100644 --- a/components/layout/display_list/webrender_helpers.rs +++ b/components/layout/display_list/webrender_helpers.rs @@ -14,8 +14,9 @@ use script_traits::compositor::{CompositorDisplayListInfo, ScrollTreeNodeId, Scr use webrender_api::units::{LayoutPoint, LayoutSize, LayoutVector2D}; use webrender_api::{ self, ClipChainId, ClipId, CommonItemProperties, DisplayItem as WrDisplayItem, - DisplayListBuilder, Epoch, PrimitiveFlags, PropertyBinding, PushStackingContextDisplayItem, - RasterSpace, ReferenceFrameKind, SpaceAndClipInfo, SpatialId, StackingContext, + DisplayListBuilder, Epoch, HasScrollLinkedEffect, PrimitiveFlags, PropertyBinding, + PushStackingContextDisplayItem, RasterSpace, ReferenceFrameKind, SpaceAndClipInfo, SpatialId, + SpatialTreeItemKey, StackingContext, }; use crate::display_list::items::{ @@ -117,8 +118,9 @@ impl DisplayList { ) -> (DisplayListBuilder, CompositorDisplayListInfo, IsContentful) { let webrender_pipeline = pipeline_id.to_webrender(); let mut builder = DisplayListBuilder::new(webrender_pipeline); + builder.begin(); - let content_size = self.bounds().size; + let content_size = self.bounds().size(); let mut state = ClipScrollState::new( &mut self.clip_scroll_nodes, CompositorDisplayListInfo::new(viewport_size, content_size, webrender_pipeline, epoch), @@ -135,6 +137,12 @@ impl DisplayList { } impl DisplayItem { + fn get_spatial_tree_item_key(&self, builder: &DisplayListBuilder) -> SpatialTreeItemKey { + let pipeline_tag = (builder.pipeline_id.0 as u64) << 32 | builder.pipeline_id.1 as u64; + let node_tag = self.base().metadata.unique_id; + SpatialTreeItemKey::new(pipeline_tag, node_tag) + } + fn convert_to_webrender( &mut self, state: &mut ClipScrollState, @@ -161,7 +169,7 @@ impl DisplayItem { CommonItemProperties { clip_rect: base.clip_rect, spatial_id: current_scroll_node_id.spatial_id, - clip_id: ClipId::ClipChain(current_clip_chain_id), + clip_chain_id: current_clip_chain_id, // TODO(gw): Make use of the WR backface visibility functionality. flags: PrimitiveFlags::default(), } @@ -185,12 +193,10 @@ impl DisplayItem { ); builder.push_hit_test( - &CommonItemProperties { - clip_rect: bounds, - spatial_id: current_scroll_node_id.spatial_id, - clip_id: ClipId::ClipChain(current_clip_chain_id), - flags: PrimitiveFlags::default(), - }, + bounds, + current_clip_chain_id, + current_scroll_node_id.spatial_id, + PrimitiveFlags::default(), (hit_test_index as u64, state.compositor_info.epoch.as_u16()), ); }; @@ -262,7 +268,7 @@ impl DisplayItem { builder.push_shadow( &SpaceAndClipInfo { spatial_id: common.spatial_id, - clip_id: common.clip_id, + clip_chain_id: common.clip_chain_id, }, item.shadow, true, @@ -281,7 +287,7 @@ impl DisplayItem { common.clip_rect, &SpaceAndClipInfo { spatial_id: common.spatial_id, - clip_id: common.clip_id, + clip_chain_id: common.clip_chain_id, }, item.iframe.to_webrender(), true, @@ -309,6 +315,7 @@ impl DisplayItem { ReferenceFrameKind::Transform { is_2d_scale_translation: false, should_snap: false, + paired_with_perspective: false, }, ), (Some(t), Some(p)) => ( @@ -321,11 +328,12 @@ impl DisplayItem { }; let new_spatial_id = builder.push_reference_frame( - stacking_context.bounds.origin, + stacking_context.bounds.min, current_scroll_node_id.spatial_id, stacking_context.transform_style, PropertyBinding::Value(transform), ref_frame, + self.get_spatial_tree_item_key(builder), ); let index = frame_index.to_index(); @@ -337,7 +345,7 @@ impl DisplayItem { None, ); - bounds.origin = LayoutPoint::zero(); + bounds.min = LayoutPoint::zero(); new_spatial_id } else { current_scroll_node_id.spatial_id @@ -355,13 +363,13 @@ impl DisplayItem { // before we start collecting stacking contexts so that // information will be available when we reach this point. let wr_item = PushStackingContextDisplayItem { - origin: bounds.origin, + origin: bounds.min, spatial_id, prim_flags: PrimitiveFlags::default(), stacking_context: StackingContext { transform_style: stacking_context.transform_style, mix_blend_mode: stacking_context.mix_blend_mode, - clip_id: None, + clip_chain_id: None, raster_space: RasterSpace::Screen, flags: Default::default(), }, @@ -386,19 +394,15 @@ impl DisplayItem { let parent_spatial_id = state.webrender_spatial_id_for_index(parent_index); let parent_clip_chain_id = state.webrender_clip_id_for_index(parent_index); - let parent_space_and_clip_info = SpaceAndClipInfo { - clip_id: ClipId::root(state.compositor_info.pipeline_id), - spatial_id: parent_spatial_id, - }; - match node.node_type { ClipScrollNodeType::Clip(clip_type) => { let clip_id = match clip_type { ClipType::Rect => { - builder.define_clip_rect(&parent_space_and_clip_info, item_rect) + builder.define_clip_rect(parent_spatial_id, item_rect) + }, + ClipType::Rounded(complex) => { + builder.define_clip_rounded_rect(parent_spatial_id, complex) }, - ClipType::Rounded(complex) => builder - .define_clip_rounded_rect(&parent_space_and_clip_info, complex), }; let clip_chain_id = @@ -407,22 +411,21 @@ impl DisplayItem { state.add_spatial_node_mapping_to_parent_index(index, parent_index); }, ClipScrollNodeType::ScrollFrame(scroll_sensitivity, external_id) => { - let clip_id = - builder.define_clip_rect(&parent_space_and_clip_info, item_rect); + let clip_id = builder.define_clip_rect(parent_spatial_id, item_rect); let clip_chain_id = builder.define_clip_chain(Some(parent_clip_chain_id), [clip_id]); state.add_clip_node_mapping(index, clip_chain_id); - let spatial_id = builder - .define_scroll_frame( - &parent_space_and_clip_info, - external_id, - node.content_rect, - item_rect, - scroll_sensitivity, - LayoutVector2D::zero(), - ) - .spatial_id; + let spatial_id = builder.define_scroll_frame( + parent_spatial_id, + external_id, + node.content_rect, + item_rect, + LayoutVector2D::zero(), /* external_scroll_offset */ + 0, /* scroll_offst_generation */ + HasScrollLinkedEffect::No, + self.get_spatial_tree_item_key(builder), + ); state.register_spatial_node( index, @@ -430,7 +433,7 @@ impl DisplayItem { Some(parent_index), Some(ScrollableNodeInfo { external_id, - scrollable_size: node.content_rect.size - item_rect.size, + scrollable_size: node.content_rect.size() - item_rect.size(), scroll_sensitivity, offset: LayoutVector2D::zero(), }), @@ -444,7 +447,8 @@ impl DisplayItem { sticky_data.margins, sticky_data.vertical_offset_bounds, sticky_data.horizontal_offset_bounds, - LayoutVector2D::zero(), + LayoutVector2D::zero(), /* previously_applied_offset */ + self.get_spatial_tree_item_key(builder), ); state.add_clip_node_mapping(index, parent_clip_chain_id); diff --git a/components/layout/sequential.rs b/components/layout/sequential.rs index b641481a32a99..cc6fd9e6316f1 100644 --- a/components/layout/sequential.rs +++ b/components/layout/sequential.rs @@ -86,6 +86,8 @@ pub fn build_display_list_for_subtree<'a>( let base = state.create_base_display_item( bounds, flow_root.as_block().fragment.node, + // The unique id is the same as the node id because this is the root fragment. + flow_root.as_block().fragment.node.id() as u64, None, DisplayListSection::BackgroundAndBorders, ); diff --git a/components/layout_2020/display_list/background.rs b/components/layout_2020/display_list/background.rs index ac8017f79d891..649662ab0838f 100644 --- a/components/layout_2020/display_list/background.rs +++ b/components/layout_2020/display_list/background.rs @@ -66,7 +66,7 @@ impl<'a> BackgroundPainter<'a> { // The 'backgound-clip' property maps directly to `clip_rect` in `CommonItemProperties`: let mut common = builder.common_properties(*painting_area, &fb.fragment.style); if let Some(clip_chain_id) = clip { - common.clip_id = wr::ClipId::ClipChain(clip_chain_id) + common.clip_chain_id = clip_chain_id; } (painting_area, common) } @@ -105,9 +105,9 @@ pub(super) fn layout_layer( Cover, } let size_contain_or_cover = |background_size| { - let mut tile_size = positioning_area.size; + let mut tile_size = positioning_area.size(); if let Some(intrinsic_ratio) = intrinsic.ratio { - let positioning_ratio = positioning_area.size.width / positioning_area.size.height; + let positioning_ratio = positioning_area.size().width / positioning_area.size().height; // Whether the tile width (as opposed to height) // is scaled to that of the positioning area let fit_width = match background_size { @@ -130,10 +130,10 @@ pub(super) fn layout_layer( Size::Cover => size_contain_or_cover(ContainOrCover::Cover), Size::ExplicitSize { width, height } => { let mut width = width.non_auto().map(|lp| { - lp.0.percentage_relative_to(Length::new(positioning_area.size.width)) + lp.0.percentage_relative_to(Length::new(positioning_area.size().width)) }); let mut height = height.non_auto().map(|lp| { - lp.0.percentage_relative_to(Length::new(positioning_area.size.height)) + lp.0.percentage_relative_to(Length::new(positioning_area.size().height)) }); if width.is_none() && height.is_none() { @@ -152,7 +152,7 @@ pub(super) fn layout_layer( intrinsic_height.into() } else { // Treated as 100% - Au::from_f32_px(positioning_area.size.height).into() + Au::from_f32_px(positioning_area.size().height).into() }; units::LayoutSize::new(w.px(), h.px()) }, @@ -163,7 +163,7 @@ pub(super) fn layout_layer( intrinsic_width.into() } else { // Treated as 100% - Au::from_f32_px(positioning_area.size.width).into() + Au::from_f32_px(positioning_area.size().width).into() }; units::LayoutSize::new(w.px(), h.px()) }, @@ -182,20 +182,20 @@ pub(super) fn layout_layer( &mut tile_size.width, repeat_x, get_cyclic(&b.background_position_x.0, layer_index), - painting_area.origin.x - positioning_area.origin.x, - painting_area.size.width, - positioning_area.size.width, + painting_area.min.x - positioning_area.min.x, + painting_area.size().width, + positioning_area.size().width, ); let result_y = layout_1d( &mut tile_size.height, repeat_y, get_cyclic(&b.background_position_y.0, layer_index), - painting_area.origin.y - positioning_area.origin.y, - painting_area.size.height, - positioning_area.size.height, + painting_area.min.y - positioning_area.min.y, + painting_area.size().height, + positioning_area.size().height, ); - let bounds = units::LayoutRect::new( - positioning_area.origin + Vector2D::new(result_x.bounds_origin, result_y.bounds_origin), + let bounds = units::LayoutRect::from_origin_and_size( + positioning_area.min + Vector2D::new(result_x.bounds_origin, result_y.bounds_origin), Size2D::new(result_x.bounds_size, result_y.bounds_size), ); let tile_spacing = units::LayoutSize::new(result_x.tile_spacing, result_y.tile_spacing); diff --git a/components/layout_2020/display_list/conversions.rs b/components/layout_2020/display_list/conversions.rs index e659a97f373a3..94e1418ba256b 100644 --- a/components/layout_2020/display_list/conversions.rs +++ b/components/layout_2020/display_list/conversions.rs @@ -111,14 +111,20 @@ impl ToWebRender for PhysicalSize { impl ToWebRender for PhysicalRect { type Type = units::LayoutRect; fn to_webrender(&self) -> Self::Type { - units::LayoutRect::new(self.origin.to_webrender(), self.size.to_webrender()) + units::LayoutRect::from_origin_and_size( + self.origin.to_webrender(), + self.size.to_webrender(), + ) } } impl ToWebRender for PhysicalRect { type Type = units::LayoutRect; fn to_webrender(&self) -> Self::Type { - units::LayoutRect::new(self.origin.to_webrender(), self.size.to_webrender()) + units::LayoutRect::from_origin_and_size( + self.origin.to_webrender(), + self.size.to_webrender(), + ) } } diff --git a/components/layout_2020/display_list/mod.rs b/components/layout_2020/display_list/mod.rs index 30ae7ce1725cf..52f5e9b258b11 100644 --- a/components/layout_2020/display_list/mod.rs +++ b/components/layout_2020/display_list/mod.rs @@ -22,7 +22,7 @@ use style::values::computed::{BorderStyle, Color, Length, LengthPercentage, Outl use style::values::specified::text::TextDecorationLine; use style::values::specified::ui::CursorKind; use style_traits::CSSPixel; -use webrender_api::{self as wr, units, ClipChainId, ClipId, CommonItemProperties}; +use webrender_api::{self as wr, units, ClipChainId}; use crate::context::LayoutContext; use crate::display_list::conversions::ToWebRender; @@ -160,7 +160,7 @@ impl<'a> DisplayListBuilder<'a> { wr::CommonItemProperties { clip_rect, spatial_id: self.current_scroll_node_id.spatial_id, - clip_id: ClipId::ClipChain(self.current_clip_chain_id), + clip_chain_id: self.current_clip_chain_id, flags: style.get_webrender_primitive_flags(), } } @@ -261,7 +261,7 @@ impl Fragment { common.clip_rect, &wr::SpaceAndClipInfo { spatial_id: common.spatial_id, - clip_id: common.clip_id, + clip_chain_id: common.clip_chain_id, }, iframe.pipeline_id.to_webrender(), true, @@ -297,12 +297,10 @@ impl Fragment { let clip_chain_id = builder.current_clip_chain_id; let spatial_id = builder.current_scroll_node_id.spatial_id; builder.wr().push_hit_test( - &CommonItemProperties { - clip_rect: rect.to_webrender(), - clip_id: ClipId::ClipChain(clip_chain_id), - spatial_id, - flags: style.get_webrender_primitive_flags(), - }, + rect.to_webrender(), + clip_chain_id, + spatial_id, + style.get_webrender_primitive_flags(), hit_info, ); } @@ -398,7 +396,7 @@ impl Fragment { color: &AbsoluteColor, ) { let rect = rect.to_webrender(); - let wavy_line_thickness = (0.33 * rect.size.height).ceil(); + let wavy_line_thickness = (0.33 * rect.size().height).ceil(); let text_decoration_color = fragment .parent_style .clone_text_decoration_color() @@ -445,8 +443,8 @@ impl<'a> BuilderForBoxFragment<'a> { }; let corner = |corner: &style::values::computed::BorderCornerRadius| { Size2D::new( - resolve(&corner.0.width.0, border_rect.size.width), - resolve(&corner.0.height.0, border_rect.size.height), + resolve(&corner.0.width.0, border_rect.size().width), + resolve(&corner.0.height.0, border_rect.size().height), ) }; let b = fragment.style.get_border(); @@ -569,9 +567,15 @@ impl<'a> BuilderForBoxFragment<'a> { let mut common = builder.common_properties(self.border_rect, &self.fragment.style); if let Some(clip_chain_id) = self.border_edge_clip(builder) { - common.clip_id = ClipId::ClipChain(clip_chain_id); + common.clip_chain_id = clip_chain_id; } - builder.wr().push_hit_test(&common, hit_info); + builder.wr().push_hit_test( + common.clip_rect, + common.clip_chain_id, + common.spatial_id, + common.flags, + hit_info, + ); } fn build_background_for_painter( @@ -957,13 +961,10 @@ fn clip_for_radii( if radii.is_zero() { None } else { - let clip_chain_id = builder.current_clip_chain_id; - let parent_space_and_clip = wr::SpaceAndClipInfo { - spatial_id: builder.current_scroll_node_id.spatial_id, - clip_id: ClipId::ClipChain(clip_chain_id), - }; + let spatial_id = builder.current_scroll_node_id.spatial_id; + let parent_clip_chain_id = builder.current_clip_chain_id; let new_clip_id = builder.wr().define_clip_rounded_rect( - &parent_space_and_clip, + spatial_id, wr::ComplexClipRegion { rect, radii, @@ -973,7 +974,7 @@ fn clip_for_radii( Some( builder .wr() - .define_clip_chain(Some(clip_chain_id), [new_clip_id]), + .define_clip_chain(Some(parent_clip_chain_id), [new_clip_id]), ) } } diff --git a/components/layout_2020/display_list/stacking_context.rs b/components/layout_2020/display_list/stacking_context.rs index 47819d0bd103a..603780227ed95 100644 --- a/components/layout_2020/display_list/stacking_context.rs +++ b/components/layout_2020/display_list/stacking_context.rs @@ -9,7 +9,7 @@ use euclid::default::Rect; use euclid::SideOffsets2D; use gfx_traits::print_tree::PrintTree; use log::warn; -use script_traits::compositor::{ScrollTreeNodeId, ScrollableNodeInfo}; +use script_traits::compositor::{ScrollSensitivity, ScrollTreeNodeId, ScrollableNodeInfo}; use servo_arc::Arc as ServoArc; use servo_config::opts::DebugOptions; use style::computed_values::float::T as ComputedFloat; @@ -23,9 +23,8 @@ use style::values::generics::transform; use style::values::specified::box_::DisplayOutside; use webrender_api as wr; use webrender_api::units::{LayoutPoint, LayoutRect, LayoutTransform, LayoutVector2D}; -use webrender_api::ScrollSensitivity; use wr::units::{LayoutPixel, LayoutSize}; -use wr::StickyOffsetBounds; +use wr::{SpatialTreeItemKey, StickyOffsetBounds}; use super::DisplayList; use crate::cell::ArcRefCell; @@ -95,9 +94,14 @@ impl DisplayList { fragment_tree: &FragmentTree, debug: &DebugOptions, ) -> StackingContext { - let root_clip_chain_id = self - .wr - .define_clip_chain(None, [wr::ClipId::root(self.wr.pipeline_id)]); + let root_clip_id = self.wr.define_clip_rect( + self.compositor_info.root_reference_frame_id.spatial_id, + LayoutRect::from_origin_and_size( + LayoutPoint::zero(), + self.compositor_info.viewport_size, + ), + ); + let root_clip_chain_id = self.wr.define_clip_chain(None, [root_clip_id]); let cb_for_non_fixed_descendants = ContainingBlock::new( fragment_tree.initial_containing_block, @@ -142,6 +146,7 @@ impl DisplayList { &mut self, origin: LayoutPoint, parent_scroll_node_id: &ScrollTreeNodeId, + spatial_tree_item_key: SpatialTreeItemKey, transform_style: wr::TransformStyle, transform: wr::PropertyBinding, kind: wr::ReferenceFrameKind, @@ -152,6 +157,7 @@ impl DisplayList { transform_style, transform, kind, + spatial_tree_item_key, ); self.compositor_info.scroll_tree.add_scroll_tree_node( Some(parent_scroll_node_id), @@ -169,40 +175,36 @@ impl DisplayList { parent_scroll_node_id: &ScrollTreeNodeId, parent_clip_chain_id: &wr::ClipChainId, external_id: wr::ExternalScrollId, + spatial_tree_item_key: SpatialTreeItemKey, content_rect: LayoutRect, clip_rect: LayoutRect, scroll_sensitivity: ScrollSensitivity, ) -> (ScrollTreeNodeId, wr::ClipChainId) { - let parent_space_and_clip_info = wr::SpaceAndClipInfo { - spatial_id: parent_scroll_node_id.spatial_id, - clip_id: wr::ClipId::root(self.wr.pipeline_id), - }; let new_clip_id = self .wr - .define_clip_rect(&parent_space_and_clip_info, clip_rect); + .define_clip_rect(parent_scroll_node_id.spatial_id, clip_rect); let new_clip_chain_id = self .wr .define_clip_chain(Some(*parent_clip_chain_id), [new_clip_id]); - let new_spatial_id = self - .wr - .define_scroll_frame( - &parent_space_and_clip_info, - external_id, - content_rect, - clip_rect, - scroll_sensitivity, - LayoutVector2D::zero(), /* external_scroll_offset */ - ) - .spatial_id; + let new_spatial_id = self.wr.define_scroll_frame( + parent_scroll_node_id.spatial_id, + external_id, + content_rect, + clip_rect, + LayoutVector2D::zero(), /* external_scroll_offset */ + 0, /* scroll_offset_generation */ + wr::HasScrollLinkedEffect::No, + spatial_tree_item_key, + ); let new_scroll_node_id = self.compositor_info.scroll_tree.add_scroll_tree_node( Some(parent_scroll_node_id), new_spatial_id, Some(ScrollableNodeInfo { external_id, - scrollable_size: content_rect.size - clip_rect.size, + scrollable_size: content_rect.size() - clip_rect.size(), scroll_sensitivity, offset: LayoutVector2D::zero(), }), @@ -213,6 +215,7 @@ impl DisplayList { fn define_sticky_frame( &mut self, parent_scroll_node_id: &ScrollTreeNodeId, + spatial_tree_item_key: SpatialTreeItemKey, frame_rect: LayoutRect, margins: SideOffsets2D, LayoutPixel>, vertical_offset_bounds: StickyOffsetBounds, @@ -224,7 +227,8 @@ impl DisplayList { margins, vertical_offset_bounds, horizontal_offset_bounds, - LayoutVector2D::zero(), + LayoutVector2D::zero(), /* previously_applied_offset */ + spatial_tree_item_key, ); self.compositor_info.scroll_tree.add_scroll_tree_node( Some(parent_scroll_node_id), @@ -471,8 +475,6 @@ impl StackingContext { return false; } - let clip_id = self.clip_chain_id.map(wr::ClipId::ClipChain); - // Create the filter pipeline. let current_color = style.clone_color(); let mut filters: Vec = effects @@ -498,7 +500,7 @@ impl StackingContext { LayoutPoint::zero(), // origin self.spatial_id, style.get_webrender_primitive_flags(), - clip_id, + self.clip_chain_id, style.get_used_transform_style().to_webrender(), effects.mix_blend_mode.to_webrender(), &filters, @@ -621,13 +623,13 @@ impl StackingContext { if let Some(reference_frame_data) = box_fragment.reference_frame_data_if_necessary(containing_block_rect) { - painting_area.origin -= reference_frame_data.origin.to_webrender().to_vector(); + painting_area.min -= reference_frame_data.origin.to_webrender().to_vector(); if let Some(transformed) = reference_frame_data .transform .inverse() - .and_then(|inversed| inversed.outer_transformed_rect(&painting_area)) + .and_then(|inversed| inversed.outer_transformed_rect(&painting_area.to_rect())) { - painting_area = transformed + painting_area = transformed.to_box2d(); } else { // The desired rect cannot be represented, so skip painting this background-image return; @@ -889,6 +891,19 @@ struct ReferenceFrameData { } impl BoxFragment { + fn get_spatial_tree_item_key(&self, display_list: &DisplayList) -> SpatialTreeItemKey { + let pipeline_tag = + (display_list.wr.pipeline_id.0 as u64) << 32 | display_list.wr.pipeline_id.1 as u64; + let tag = match self.base.tag { + Some(ref tag) => tag, + None => { + unreachable!("Tried to create a spatial node for a completely anonymous fragment.") + }, + }; + let node_tag = tag.to_display_list_fragment_id(); + SpatialTreeItemKey::new(pipeline_tag, node_tag) + } + fn get_stacking_context_type(&self) -> Option { if self.style.establishes_stacking_context() { return Some(StackingContextType::RealStackingContext); @@ -964,6 +979,7 @@ impl BoxFragment { let new_spatial_id = display_list.push_reference_frame( reference_frame_data.origin.to_webrender(), &containing_block.scroll_node_id, + self.get_spatial_tree_item_key(display_list), self.style.get_box().transform_style.to_webrender(), wr::PropertyBinding::Value(reference_frame_data.transform), reference_frame_data.kind, @@ -1219,14 +1235,9 @@ impl BoxFragment { .translate(containing_block_rect.origin.to_vector()) .to_webrender(); - let parent_space_and_clip = &wr::SpaceAndClipInfo { - spatial_id: parent_scroll_node_id.spatial_id, - clip_id: wr::ClipId::root(display_list.wr.pipeline_id), - }; - let clip_id = display_list .wr - .define_clip_rect(parent_space_and_clip, clip_rect); + .define_clip_rect(parent_scroll_node_id.spatial_id, clip_rect); Some( display_list .wr @@ -1270,13 +1281,14 @@ impl BoxFragment { parent_scroll_node_id, parent_clip_id, external_id, + self.get_spatial_tree_item_key(display_list), self.scrollable_overflow(containing_block_rect) .to_webrender(), padding_rect, sensitivity, ); - Some((scroll_tree_node_id, clip_chain_id, padding_rect.size)) + Some((scroll_tree_node_id, clip_chain_id, padding_rect.size())) } fn build_sticky_frame_if_necessary( @@ -1343,12 +1355,12 @@ impl BoxFragment { // This is the minimum negative offset and then the maximum positive offset. We just // specify every edge, but if the corresponding margin is None, that offset has no effect. let vertical_offset_bounds = wr::StickyOffsetBounds::new( - containing_block_rect.min_y() - frame_rect.min_y(), - containing_block_rect.max_y() - frame_rect.max_y(), + containing_block_rect.min.y - frame_rect.min.y, + containing_block_rect.max.y - frame_rect.max.y, ); let horizontal_offset_bounds = wr::StickyOffsetBounds::new( - containing_block_rect.min_x() - frame_rect.min_x(), - containing_block_rect.max_x() - frame_rect.max_x(), + containing_block_rect.min.x - frame_rect.min.x, + containing_block_rect.max.x - frame_rect.max.x, ); let margins = SideOffsets2D::new( @@ -1360,6 +1372,7 @@ impl BoxFragment { let sticky_node_id = display_list.define_sticky_frame( parent_scroll_node_id, + self.get_spatial_tree_item_key(display_list), frame_rect, margins, vertical_offset_bounds, @@ -1398,6 +1411,7 @@ impl BoxFragment { wr::ReferenceFrameKind::Transform { is_2d_scale_translation: false, should_snap: false, + paired_with_perspective: false, }, ), (Some(transform), Some(perspective)) => ( diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 74be9d0cfd954..cfb5433abbf8e 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -872,7 +872,7 @@ impl LayoutThread { self.epoch.set(epoch); // TODO: Avoid the temporary conversion and build webrender sc/dl directly! - let (builder, compositor_info, is_contentful) = + let (mut builder, compositor_info, is_contentful) = display_list.convert_to_webrender(self.id, viewport_size, epoch.into()); // Observe notifications about rendered frames if needed right before @@ -882,7 +882,7 @@ impl LayoutThread { .maybe_observe_paint_time(self, epoch, is_contentful.0); self.webrender_api - .send_display_list(compositor_info, builder.finalize().1); + .send_display_list(compositor_info, builder.end().1); }, ); } diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index f3dd538adda7b..1e13ef236ebb7 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -1062,6 +1062,7 @@ impl LayoutThread { self.id.to_webrender(), epoch.into(), ); + display_list.wr.begin(); // `dump_serialized_display_list` doesn't actually print anything. It sets up // the display list for printing the serialized version when `finalize()` is called. @@ -1097,7 +1098,7 @@ impl LayoutThread { if reflow_goal.needs_display() { self.webrender_api - .send_display_list(display_list.compositor_info, display_list.wr.finalize().1); + .send_display_list(display_list.compositor_info, display_list.wr.end().1); } self.update_iframe_sizes(iframe_sizes); diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 019cc07529fd1..25e56ec682919 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1174,7 +1174,7 @@ impl Document { kind, text, multiline, - DeviceIntRect::from_untyped(&rect), + DeviceIntRect::from_untyped(&rect.to_box2d()), )); } } diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 745fe7af15d2e..bdaa30d85196d 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -20,7 +20,7 @@ max_log_level = ["log/release_max_level_info"] media-gstreamer = ["servo-media-gstreamer", "gstreamer"] native-bluetooth = ["bluetooth/native-bluetooth"] no-wgl = ["canvas/no-wgl"] -no_static_freetype = ["webrender/no_static_freetype"] +dynamic_freetype = ["webrender/dynamic_freetype"] profilemozjs = ["script/profilemozjs"] refcell_backtrace = ["script/refcell_backtrace"] webdriver = ["webdriver_server"] diff --git a/components/servo/lib.rs b/components/servo/lib.rs index c21c6af4ede46..dcd8ab9b40e68 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -88,7 +88,7 @@ use surfman::{GLApi, GLVersion}; #[cfg(target_os = "linux")] use surfman::{NativeConnection, NativeContext}; use webrender::{RenderApiSender, ShaderPrecacheFlags}; -use webrender_api::{DocumentId, FontInstanceKey, FontKey, ImageKey}; +use webrender_api::{ColorF, DocumentId, FontInstanceKey, FontKey, FramePublishId, ImageKey}; use webrender_traits::{ WebrenderExternalImageHandlers, WebrenderExternalImageRegistry, WebrenderImageHandlerType, }; @@ -210,7 +210,7 @@ impl webrender_api::RenderNotifier for RenderNotifier { _document_id: DocumentId, scrolled: bool, composite_needed: bool, - _render_time_ns: Option, + _frame_publish_id: FramePublishId, ) { if scrolled { self.compositor_proxy @@ -319,7 +319,7 @@ where let coordinates: compositing::windowing::EmbedderCoordinates = window.get_coordinates(); let device_pixel_ratio = coordinates.hidpi_factor.get(); - let viewport_size = coordinates.viewport.size.to_f32() / device_pixel_ratio; + let viewport_size = coordinates.viewport.size().to_f32() / device_pixel_ratio; let (mut webrender, webrender_api_sender) = { let mut debug_flags = webrender::DebugFlags::empty(); @@ -329,11 +329,10 @@ where ); let render_notifier = Box::new(RenderNotifier::new(compositor_proxy.clone())); - webrender::Renderer::new( + webrender::create_webrender_instance( webrender_gl.clone(), render_notifier, - webrender::RendererOptions { - device_pixel_ratio, + webrender::WebRenderOptions { resource_override_path: opts.shaders_dir.clone(), enable_aa: !opts.debug.disable_text_antialiasing, debug_flags: debug_flags, @@ -345,7 +344,7 @@ where enable_subpixel_aa: pref!(gfx.subpixel_text_antialiasing.enabled) && !opts.debug.disable_subpixel_text_antialiasing, allow_texture_swizzling: pref!(gfx.texture_swizzling.enabled), - clear_color: None, + clear_color: ColorF::new(1.0, 1.0, 1.0, 0.0), ..Default::default() }, None, @@ -354,7 +353,7 @@ where }; let webrender_api = webrender_api_sender.create_api(); - let webrender_document = webrender_api.add_document(coordinates.get_viewport().size); + let webrender_document = webrender_api.add_document(coordinates.get_viewport().size()); // Important that this call is done in a single-threaded fashion, we // can't defer it after `create_constellation` has started. diff --git a/components/shared/script/compositor.rs b/components/shared/script/compositor.rs index c09b2edb0e3b0..8698a04ba146a 100644 --- a/components/shared/script/compositor.rs +++ b/components/shared/script/compositor.rs @@ -7,9 +7,17 @@ use embedder_traits::Cursor; use serde::{Deserialize, Serialize}; use webrender_api::units::{LayoutSize, LayoutVector2D}; -use webrender_api::{ - Epoch, ExternalScrollId, PipelineId, ScrollLocation, ScrollSensitivity, SpatialId, -}; +use webrender_api::{Epoch, ExternalScrollId, PipelineId, ScrollLocation, SpatialId}; + +/// The scroll sensitivity of a scroll node ie whether it can be scrolled due to input event and +/// script events or only script events. +#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)] +pub enum ScrollSensitivity { + /// This node can be scrolled by input and script events. + ScriptAndInputEvents, + /// This node can only be scrolled by script events. + Script, +} /// Information that Servo keeps alongside WebRender display items /// in order to add more context to hit test results. diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs index f39089cf3a089..beb47a125b8c5 100644 --- a/components/shared/script/lib.rs +++ b/components/shared/script/lib.rs @@ -1192,8 +1192,14 @@ impl WebrenderIpcSender { warn!("Error sending display list: {}", e); } - if let Err(e) = display_list_sender.send(&display_list_data) { - warn!("Error sending display data: {}", e); + if let Err(error) = display_list_sender.send(&display_list_data.items_data) { + warn!("Error sending display list items: {}", error); + } + if let Err(error) = display_list_sender.send(&display_list_data.cache_data) { + warn!("Error sending display list cache data: {}", error); + } + if let Err(error) = display_list_sender.send(&display_list_data.spatial_tree) { + warn!("Error sending display spatial tree: {}", error); } } diff --git a/components/shared/script/tests/compositor.rs b/components/shared/script/tests/compositor.rs index d741d7a9d5358..289f4ffebf17c 100644 --- a/components/shared/script/tests/compositor.rs +++ b/components/shared/script/tests/compositor.rs @@ -3,9 +3,11 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use euclid::Size2D; -use script_traits::compositor::{ScrollTree, ScrollTreeNodeId, ScrollableNodeInfo}; +use script_traits::compositor::{ + ScrollSensitivity, ScrollTree, ScrollTreeNodeId, ScrollableNodeInfo, +}; use webrender_api::units::LayoutVector2D; -use webrender_api::{ExternalScrollId, PipelineId, ScrollLocation, ScrollSensitivity, SpatialId}; +use webrender_api::{ExternalScrollId, PipelineId, ScrollLocation, SpatialId}; fn add_mock_scroll_node(tree: &mut ScrollTree) -> ScrollTreeNodeId { let pipeline_id = PipelineId(0, 0); diff --git a/components/shared/webrender/lib.rs b/components/shared/webrender/lib.rs index 8e48d94e43972..713816a9a8357 100644 --- a/components/shared/webrender/lib.rs +++ b/components/shared/webrender/lib.rs @@ -9,9 +9,7 @@ use std::sync::{Arc, Mutex}; use euclid::default::Size2D; use webrender_api::units::TexelRect; -use webrender_api::{ - ExternalImage, ExternalImageHandler, ExternalImageId, ExternalImageSource, ImageRendering, -}; +use webrender_api::{ExternalImage, ExternalImageHandler, ExternalImageId, ExternalImageSource}; /// This trait is used as a bridge between the different GL clients /// in Servo that handles WebRender ExternalImages and the WebRender @@ -114,12 +112,7 @@ impl ExternalImageHandler for WebrenderExternalImageHandlers { /// image content. /// The WR client should not change the image content until the /// unlock() call. - fn lock( - &mut self, - key: ExternalImageId, - _channel_index: u8, - _rendering: ImageRendering, - ) -> ExternalImage { + fn lock(&mut self, key: ExternalImageId, _channel_index: u8) -> ExternalImage { let external_images = self.external_images.lock().unwrap(); let handler_type = external_images .get(&key) diff --git a/ports/jniapi/Cargo.toml b/ports/jniapi/Cargo.toml index 533769a913b23..c8fa1f4e8cd46 100644 --- a/ports/jniapi/Cargo.toml +++ b/ports/jniapi/Cargo.toml @@ -44,7 +44,7 @@ js_backtrace = ["libservo/js_backtrace"] max_log_level = ["log/release_max_level_info"] media-gstreamer = ["libservo/media-gstreamer"] native-bluetooth = ["libservo/native-bluetooth"] -no_static_freetype = ["libservo/no_static_freetype"] +dynamic_freetype = ["libservo/dynamic_freetype"] no-wgl = ["libservo/no-wgl"] profilemozjs = ["libservo/profilemozjs"] refcell_backtrace = ["libservo/refcell_backtrace"] diff --git a/ports/servoshell/headed_window.rs b/ports/servoshell/headed_window.rs index 756e8531267ad..36f8711878a91 100644 --- a/ports/servoshell/headed_window.rs +++ b/ports/servoshell/headed_window.rs @@ -527,12 +527,12 @@ impl WindowMethods for Window { let viewport_size = inner_size - Size2D::from_lengths(Length::zero(), toolbar_height); let viewport_origin = DeviceIntPoint::zero(); // bottom left - let viewport = DeviceIntRect::new(viewport_origin, viewport_size.to_i32()); + let viewport = DeviceIntRect::from_origin_and_size(viewport_origin, viewport_size.to_i32()); let screen = self.screen_size.to_i32(); EmbedderCoordinates { viewport, - framebuffer: viewport.size, + framebuffer: viewport.size(), window: (window_size, window_origin), screen, // FIXME: Winit doesn't have API for available size. Fallback to screen size diff --git a/ports/servoshell/headless_window.rs b/ports/servoshell/headless_window.rs index 308a85120cee0..e590162918645 100644 --- a/ports/servoshell/headless_window.rs +++ b/ports/servoshell/headless_window.rs @@ -161,7 +161,7 @@ impl WindowMethods for Window { .unwrap_or(None) .map(|info| Size2D::from_untyped(info.size)) .unwrap_or(Size2D::new(0, 0)); - let viewport = DeviceIntRect::new(Point2D::zero(), size); + let viewport = DeviceIntRect::from_origin_and_size(Point2D::zero(), size); EmbedderCoordinates { viewport, framebuffer: size, diff --git a/servo-tidy.toml b/servo-tidy.toml index a5e0496f69e5b..0c43c7fbc3abb 100644 --- a/servo-tidy.toml +++ b/servo-tidy.toml @@ -68,6 +68,10 @@ packages = [ "phf_codegen", "phf_generator", "phf_shared", + + # These can be removed once winit, font-kit, etc are upgraded + "core-graphics", + "core-text", ] # Files that are ignored for all tidy and lint checks. files = [