Bug 1355602 - Decouple pushing scroll layers from pushing stacking contexts. r?mchang draft
authorKartikaya Gupta <kgupta@mozilla.com>
Tue, 11 Apr 2017 16:28:21 -0400
changeset 560696 035f60fa5378b1cb5c7f258ac3265179b21f88ee
parent 560695 0eff4453972da453a25d035ed8a08b0b4b56aea0
child 623789 276d98922d90fc513efc13755ac3fd631bc39012
push id53521
push userkgupta@mozilla.com
push dateTue, 11 Apr 2017 20:28:54 +0000
reviewersmchang
bugs1355602
milestone55.0a1
Bug 1355602 - Decouple pushing scroll layers from pushing stacking contexts. r?mchang This removes the call to push_scroll_layer in wr_push_stacking_context, so that it's now possible to push a stacking context without necessarily pushing a scroll layer. There is already a separate function to push a scroll layer so the call sites can do that. This patch just changes all the call sites that were pushing a stacking context to also push a scroll layer, so there should be no functional change. Future patches can remove of the spurious scroll layers. MozReview-Commit-ID: 15Sr69ZQYCo
gfx/layers/wr/WebRenderCanvasLayer.cpp
gfx/layers/wr/WebRenderColorLayer.cpp
gfx/layers/wr/WebRenderContainerLayer.cpp
gfx/layers/wr/WebRenderImageLayer.cpp
gfx/layers/wr/WebRenderPaintedLayer.cpp
gfx/webrender_bindings/WebRenderAPI.cpp
gfx/webrender_bindings/WebRenderAPI.h
gfx/webrender_bindings/src/bindings.rs
gfx/webrender_bindings/webrender_ffi.h
--- a/gfx/layers/wr/WebRenderCanvasLayer.cpp
+++ b/gfx/layers/wr/WebRenderCanvasLayer.cpp
@@ -82,23 +82,25 @@ WebRenderCanvasLayer::RenderLayer(wr::Di
   }
 
   WrImageKey key;
   key.mNamespace = WrBridge()->GetNamespace();
   key.mHandle = WrBridge()->GetNextResourceId();
   WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId, key));
 
   aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
-                               wr::ToWrRect(overflow),
-                               mask.ptrOr(nullptr),
                                1.0f,
                                //GetAnimations(),
                                transform,
                                mixBlendMode);
+  aBuilder.PushScrollLayer(wr::ToWrRect(overflow),
+                           wr::ToWrRect(overflow),
+                           mask.ptrOr(nullptr));
   aBuilder.PushImage(wr::ToWrRect(rect), clip, filter, key);
+  aBuilder.PopScrollLayer();
   aBuilder.PopStackingContext();
 }
 
 void
 WebRenderCanvasLayer::AttachCompositable()
 {
   mCanvasClient->Connect();
 }
--- a/gfx/layers/wr/WebRenderColorLayer.cpp
+++ b/gfx/layers/wr/WebRenderColorLayer.cpp
@@ -29,20 +29,22 @@ WebRenderColorLayer::RenderLayer(wr::Dis
   Maybe<WrImageMask> mask = BuildWrMaskLayer();
   WrClipRegion clip = aBuilder.BuildClipRegion(wr::ToWrRect(clipRect));
 
   wr::MixBlendMode mixBlendMode = wr::ToWrMixBlendMode(GetMixBlendMode());
 
   DumpLayerInfo("ColorLayer", rect);
 
   aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
-                              wr::ToWrRect(overflow),
-                              mask.ptrOr(nullptr),
                               1.0f,
                               //GetAnimations(),
                               transform,
                               mixBlendMode);
+  aBuilder.PushScrollLayer(wr::ToWrRect(overflow),
+                           wr::ToWrRect(overflow),
+                           mask.ptrOr(nullptr));
   aBuilder.PushRect(wr::ToWrRect(rect), clip, wr::ToWrColor(mColor));
+  aBuilder.PopScrollLayer();
   aBuilder.PopStackingContext();
 }
 
 } // namespace layers
 } // namespace mozilla
--- a/gfx/layers/wr/WebRenderContainerLayer.cpp
+++ b/gfx/layers/wr/WebRenderContainerLayer.cpp
@@ -31,28 +31,30 @@ WebRenderContainerLayer::RenderLayer(wr:
     printf_stderr("ContainerLayer %p using bounds=%s, overflow=%s, transform=%s, mix-blend-mode=%s\n",
                   this->GetLayer(),
                   Stringify(relBounds).c_str(),
                   Stringify(overflow).c_str(),
                   Stringify(transform).c_str(),
                   Stringify(mixBlendMode).c_str());
   }
   aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
-                               wr::ToWrRect(overflow),
-                               mask.ptrOr(nullptr),
                                GetLocalOpacity(),
                                //GetLayer()->GetAnimations(),
                                transform,
                                mixBlendMode);
+  aBuilder.PushScrollLayer(wr::ToWrRect(overflow),
+                           wr::ToWrRect(overflow),
+                           mask.ptrOr(nullptr));
   for (LayerPolygon& child : children) {
     if (child.layer->IsBackfaceHidden()) {
       continue;
     }
     ToWebRenderLayer(child.layer)->RenderLayer(aBuilder);
   }
+  aBuilder.PopScrollLayer();
   aBuilder.PopStackingContext();
 }
 
 void
 WebRenderRefLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
 {
   gfx::Matrix4x4 transform;// = GetTransform();
   gfx::Rect relBounds = TransformedVisibleBoundsRelativeToParent();
--- a/gfx/layers/wr/WebRenderImageLayer.cpp
+++ b/gfx/layers/wr/WebRenderImageLayer.cpp
@@ -154,23 +154,25 @@ WebRenderImageLayer::RenderLayer(wr::Dis
   }
 
   WrImageKey key;
   key.mNamespace = WrBridge()->GetNamespace();
   key.mHandle = WrBridge()->GetNextResourceId();
   WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId, key));
 
   aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
-                            wr::ToWrRect(overflow),
-                            mask.ptrOr(nullptr),
                             1.0f,
                             //GetAnimations(),
                             transform,
                             mixBlendMode);
+  aBuilder.PushScrollLayer(wr::ToWrRect(overflow),
+                           wr::ToWrRect(overflow),
+                           mask.ptrOr(nullptr));
   aBuilder.PushImage(wr::ToWrRect(rect), clip, filter, key);
+  aBuilder.PopScrollLayer();
   aBuilder.PopStackingContext();
 
   //mContainer->SetImageFactory(originalIF);
 }
 
 Maybe<WrImageMask>
 WebRenderImageLayer::RenderMaskLayer(const gfx::Matrix4x4& aTransform)
 {
--- a/gfx/layers/wr/WebRenderPaintedLayer.cpp
+++ b/gfx/layers/wr/WebRenderPaintedLayer.cpp
@@ -199,20 +199,22 @@ WebRenderPaintedLayer::RenderLayer(wr::D
   DumpLayerInfo("PaintedLayer", rect);
 
   WrImageKey key;
   key.mNamespace = WrBridge()->GetNamespace();
   key.mHandle = WrBridge()->GetNextResourceId();
   WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId, key));
 
   aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
-                              wr::ToWrRect(overflow),
-                              mask.ptrOr(nullptr),
                               1.0f,
                               //GetAnimations(),
                               transform,
                               mixBlendMode);
+  aBuilder.PushScrollLayer(wr::ToWrRect(overflow),
+                           wr::ToWrRect(overflow),
+                           mask.ptrOr(nullptr));
   aBuilder.PushImage(wr::ToWrRect(rect), clip, wr::ImageRendering::Auto, key);
+  aBuilder.PopScrollLayer();
   aBuilder.PopStackingContext();
 }
 
 } // namespace layers
 } // namespace mozilla
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
@@ -521,23 +521,21 @@ DisplayListBuilder::Finalize()
                           dl.dl.inner,
                           dl.aux_desc,
                           dl.aux.inner);
   return dl;
 }
 
 void
 DisplayListBuilder::PushStackingContext(const WrRect& aBounds,
-                                        const WrRect& aOverflow,
-                                        const WrImageMask* aMask,
                                         const float aOpacity,
                                         const gfx::Matrix4x4& aTransform,
                                         const WrMixBlendMode& aMixBlendMode)
 {
-  wr_dp_push_stacking_context(mWrState, aBounds, aOverflow, aMask, aOpacity,
+  wr_dp_push_stacking_context(mWrState, aBounds, aOpacity,
                               ToWrMatrix(aTransform), aMixBlendMode);
 }
 
 void
 DisplayListBuilder::PopStackingContext()
 {
   wr_dp_pop_stacking_context(mWrState);
 }
--- a/gfx/webrender_bindings/WebRenderAPI.h
+++ b/gfx/webrender_bindings/WebRenderAPI.h
@@ -133,18 +133,16 @@ public:
   ~DisplayListBuilder();
 
   void Begin(const LayerIntSize& aSize);
 
   void End();
   wr::BuiltDisplayList Finalize();
 
   void PushStackingContext(const WrRect& aBounds, // TODO: We should work with strongly typed rects
-                           const WrRect& aOverflow,
-                           const WrImageMask* aMask, // TODO: needs a wrapper.
                            const float aOpacity,
                            const gfx::Matrix4x4& aTransform,
                            const WrMixBlendMode& aMixBlendMode);
 
   void PopStackingContext();
 
   void PushBuiltDisplayList(wr::BuiltDisplayList dl);
 
--- a/gfx/webrender_bindings/src/bindings.rs
+++ b/gfx/webrender_bindings/src/bindings.rs
@@ -1,9 +1,10 @@
 use std::ffi::CString;
+use std::io::Write;
 use std::{mem, slice};
 use std::path::PathBuf;
 use std::os::raw::{c_void, c_char};
 use std::sync::Arc;
 use std::collections::HashMap;
 use gleam::gl;
 
 use webrender_traits::*;
@@ -771,16 +772,17 @@ pub extern "C" fn wr_window_new(window_i
     } else {
       gl = unsafe { gl::GlFns::load_with(|symbol| get_proc_address(gl_context, symbol)) };
     }
     gl.clear_color(0.3, 0.0, 0.0, 1.0);
 
     let version = gl.get_string(gl::VERSION);
 
     println!("WebRender - OpenGL version new {}", version);
+    writeln!(::std::io::stderr(), "[stderr] WebRender starting up, yo").unwrap();
 
     let opts = RendererOptions {
         enable_aa: true,
         enable_subpixel_aa: true,
         enable_profiler: enable_profiler,
         recorder: recorder,
         blob_image_renderer: Some(Box::new(Moz2dImageRenderer::new())),
         ..Default::default()
@@ -1092,66 +1094,45 @@ pub extern "C" fn wr_dp_new_clip_region(
     let clip_region = state.frame_builder.dl_builder.new_clip_region(&main, complex, mask);
 
     clip_region.into()
 }
 
 #[no_mangle]
 pub extern "C" fn wr_dp_push_stacking_context(state: &mut WrState,
                                               bounds: WrRect,
-                                              overflow: WrRect,
-                                              mask: *const WrImageMask,
                                               opacity: f32,
                                               transform: WrMatrix,
                                               mix_blend_mode: WrMixBlendMode) {
     assert!(unsafe { is_in_main_thread() });
     state.z_index += 1;
 
     let bounds = bounds.to_rect();
-    let overflow = overflow.to_rect();
-
-    // convert from the C type to the Rust type
-    let mask = unsafe {
-        mask.as_ref().map(|&WrImageMask { image, ref rect, repeat }| {
-            ImageMask {
-                image: image,
-                rect: rect.to_rect(),
-                repeat: repeat,
-            }
-        })
-    };
-
-    let clip_region = state.frame_builder.dl_builder.new_clip_region(&overflow, vec![], mask);
 
     let mut filters: Vec<FilterOp> = Vec::new();
     if opacity < 1.0 {
         filters.push(FilterOp::Opacity(PropertyBinding::Value(opacity)));
     }
 
     state.frame_builder
         .dl_builder
         .push_stacking_context(webrender_traits::ScrollPolicy::Scrollable,
                                bounds,
                                state.z_index,
                                Some(PropertyBinding::Value(transform.to_layout_transform())),
                                TransformStyle::Flat,
                                None,
                                mix_blend_mode,
                                filters);
-
-    let clip_bounds = LayoutRect::new(LayoutPoint::new(0.0, 0.0), bounds.size);
-    state.frame_builder.dl_builder.push_scroll_layer(clip_region, clip_bounds, None);
 }
 
 #[no_mangle]
 pub extern "C" fn wr_dp_pop_stacking_context(state: &mut WrState) {
     assert!(unsafe { is_in_main_thread() });
-    state.frame_builder.dl_builder.pop_scroll_layer();
     state.frame_builder.dl_builder.pop_stacking_context();
-    //println!("pop_stacking {:?}", state.pipeline_id);
 }
 
 #[no_mangle]
 pub extern "C" fn wr_dp_push_scroll_layer(state: &mut WrState,
                                           bounds: WrRect,
                                           overflow: WrRect,
                                           mask: *const WrImageMask) {
     let bounds = bounds.to_rect();
--- a/gfx/webrender_bindings/webrender_ffi.h
+++ b/gfx/webrender_bindings/webrender_ffi.h
@@ -629,17 +629,16 @@ WR_INLINE WrClipRegion
 wr_dp_new_clip_region(WrState* wrState,
                       WrRect main,
                       const WrComplexClipRegion* complex, size_t complexCount,
                       const WrImageMask* image_mask)
 WR_FUNC;
 
 WR_INLINE void
 wr_dp_push_stacking_context(WrState *wrState, WrRect bounds,
-                            WrRect overflow, const WrImageMask *mask,
                             float opacity, WrMatrix transform,
                             WrMixBlendMode mixBlendMode)
 WR_FUNC;
 
 //XXX: matrix should use a proper type
 WR_INLINE void
 wr_dp_pop_stacking_context(WrState *wrState)
 WR_FUNC;