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
--- 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;