Skip to content

Commit

Permalink
Plumb scroll elasticity layer from Blink to cc
Browse files Browse the repository at this point in the history
Implement the 4-argument version of registerViewportLayers
for all implementers of WebLayerTreeView.

Add a scroll elasticity layer to cc::LayerTreeHost and through to
cc::LayerTreeHostImpl. These layers are still optional, and most
tests set them to NULL. Once the Blink side that pushes real layers
through is completed, the scroll elasticity layer will be required.

R=enne
TBR=jam
BUG=133097

Review URL: https://codereview.chromium.org/731863009

Cr-Commit-Position: refs/heads/master@{#305260}
  • Loading branch information
ccameron-chromium authored and Commit bot committed Nov 21, 2014
1 parent 686ccaf commit 8230b68
Show file tree
Hide file tree
Showing 14 changed files with 221 additions and 109 deletions.
15 changes: 9 additions & 6 deletions cc/trees/layer_tree_host.cc
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ LayerTreeHost::~LayerTreeHost() {
}

// We must clear any pointers into the layer tree prior to destroying it.
RegisterViewportLayers(NULL, NULL, NULL);
RegisterViewportLayers(NULL, NULL, NULL, NULL);

if (root_layer_.get()) {
// The layer tree must be destroyed before the layer tree host. We've
Expand Down Expand Up @@ -347,11 +347,12 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) {
sync_tree->set_has_transparent_background(has_transparent_background_);

if (page_scale_layer_.get() && inner_viewport_scroll_layer_.get()) {
sync_tree->SetViewportLayersFromIds(page_scale_layer_->id(),
inner_viewport_scroll_layer_->id(),
outer_viewport_scroll_layer_.get()
? outer_viewport_scroll_layer_->id()
: Layer::INVALID_ID);
sync_tree->SetViewportLayersFromIds(
overscroll_elasticity_layer_.get() ? overscroll_elasticity_layer_->id()
: Layer::INVALID_ID,
page_scale_layer_->id(), inner_viewport_scroll_layer_->id(),
outer_viewport_scroll_layer_.get() ? outer_viewport_scroll_layer_->id()
: Layer::INVALID_ID);
} else {
sync_tree->ClearViewportLayers();
}
Expand Down Expand Up @@ -1288,9 +1289,11 @@ gfx::Size LayerTreeHost::GetUIResourceSize(UIResourceId uid) const {
}

void LayerTreeHost::RegisterViewportLayers(
scoped_refptr<Layer> overscroll_elasticity_layer,
scoped_refptr<Layer> page_scale_layer,
scoped_refptr<Layer> inner_viewport_scroll_layer,
scoped_refptr<Layer> outer_viewport_scroll_layer) {
overscroll_elasticity_layer_ = overscroll_elasticity_layer;
page_scale_layer_ = page_scale_layer;
inner_viewport_scroll_layer_ = inner_viewport_scroll_layer;
outer_viewport_scroll_layer_ = outer_viewport_scroll_layer;
Expand Down
12 changes: 8 additions & 4 deletions cc/trees/layer_tree_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,14 @@ class CC_EXPORT LayerTreeHost {
void SetRootLayer(scoped_refptr<Layer> root_layer);
Layer* root_layer() { return root_layer_.get(); }
const Layer* root_layer() const { return root_layer_.get(); }
const Layer* overscroll_elasticity_layer() const {
return overscroll_elasticity_layer_.get();
}
const Layer* page_scale_layer() const { return page_scale_layer_.get(); }
void RegisterViewportLayers(
scoped_refptr<Layer> page_scale_layer,
scoped_refptr<Layer> inner_viewport_scroll_layer,
scoped_refptr<Layer> outer_viewport_scroll_layer);
void RegisterViewportLayers(scoped_refptr<Layer> overscroll_elasticity_layer,
scoped_refptr<Layer> page_scale_layer,
scoped_refptr<Layer> inner_viewport_scroll_layer,
scoped_refptr<Layer> outer_viewport_scroll_layer);
Layer* inner_viewport_scroll_layer() const {
return inner_viewport_scroll_layer_.get();
}
Expand Down Expand Up @@ -463,6 +466,7 @@ class CC_EXPORT LayerTreeHost {
int id_;
bool next_commit_forces_redraw_;

scoped_refptr<Layer> overscroll_elasticity_layer_;
scoped_refptr<Layer> page_scale_layer_;
scoped_refptr<Layer> inner_viewport_scroll_layer_;
scoped_refptr<Layer> outer_viewport_scroll_layer_;
Expand Down
145 changes: 79 additions & 66 deletions cc/trees/layer_tree_host_impl_unittest.cc

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions cc/trees/layer_tree_host_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1020,8 +1020,8 @@ class LayerTreeHostTestStartPageScaleAnimation : public LayerTreeHostTest {
layer_tree_host()->root_layer()->AddChild(scroll_layer_);
// This test requires the page_scale and inner viewport layers to be
// identified.
layer_tree_host()->RegisterViewportLayers(
root_layer, scroll_layer_.get(), NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer,
scroll_layer_.get(), NULL);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.5f, 2.f);
}

Expand Down Expand Up @@ -5512,7 +5512,7 @@ class LayerTreeHostTestCrispUpAfterPinchEnds : public LayerTreeHostTest {
layer->disable_lcd_text();
pinch->AddChild(layer);

layer_tree_host()->RegisterViewportLayers(root, pinch, pinch);
layer_tree_host()->RegisterViewportLayers(NULL, root, pinch, pinch);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f);
layer_tree_host()->SetRootLayer(root);
LayerTreeHostTest::SetupTree();
Expand Down Expand Up @@ -5722,7 +5722,7 @@ class LayerTreeHostTestContinuousDrawWhenCreatingVisibleTiles
layer->disable_lcd_text();
pinch->AddChild(layer);

layer_tree_host()->RegisterViewportLayers(root, pinch, pinch);
layer_tree_host()->RegisterViewportLayers(NULL, root, pinch, pinch);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 1.f, 4.f);
layer_tree_host()->SetRootLayer(root);
LayerTreeHostTest::SetupTree();
Expand Down
26 changes: 14 additions & 12 deletions cc/trees/layer_tree_host_unittest_scroll.cc
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ class LayerTreeHostScrollTestScrollSimple : public LayerTreeHostScrollTest {
scroll_layer->SetIsContainerForFixedPositionLayers(true);
scroll_layer->SetScrollClipLayerId(root_layer->id());
scroll_layer->SetScrollOffset(initial_scroll_);
layer_tree_host()->RegisterViewportLayers(root_layer, scroll_layer, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer, scroll_layer,
NULL);
PostSetNeedsCommitToMainThread();
}

Expand Down Expand Up @@ -122,7 +123,8 @@ class LayerTreeHostScrollTestScrollMultipleRedraw
scroll_layer_->SetIsContainerForFixedPositionLayers(true);
scroll_layer_->SetScrollClipLayerId(root_layer->id());
scroll_layer_->SetScrollOffset(initial_scroll_);
layer_tree_host()->RegisterViewportLayers(root_layer, scroll_layer_, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer, scroll_layer_,
NULL);
PostSetNeedsCommitToMainThread();
}

Expand Down Expand Up @@ -224,8 +226,8 @@ class LayerTreeHostScrollTestScrollAbortedCommit
root_scroll_layer->SetIsContainerForFixedPositionLayers(true);
root_layer->AddChild(root_scroll_layer);

layer_tree_host()->RegisterViewportLayers(
root_layer, root_scroll_layer, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer,
root_scroll_layer, NULL);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f);
}

Expand Down Expand Up @@ -407,8 +409,8 @@ class LayerTreeHostScrollTestFractionalScroll : public LayerTreeHostScrollTest {
root_scroll_layer->SetIsContainerForFixedPositionLayers(true);
root_layer->AddChild(root_scroll_layer);

layer_tree_host()->RegisterViewportLayers(
root_layer, root_scroll_layer, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer,
root_scroll_layer, NULL);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f);
}

Expand Down Expand Up @@ -510,8 +512,8 @@ class LayerTreeHostScrollTestCaseWithChild : public LayerTreeHostScrollTest {
expected_scroll_layer_->SetScrollOffset(initial_offset_);

layer_tree_host()->SetRootLayer(root_layer);
layer_tree_host()->RegisterViewportLayers(
root_layer, root_scroll_layer_, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer,
root_scroll_layer_, NULL);
LayerTreeHostScrollTest::SetupTree();
}

Expand Down Expand Up @@ -779,8 +781,8 @@ class ImplSidePaintingScrollTestSimple : public ImplSidePaintingScrollTest {
root_scroll_layer->SetIsContainerForFixedPositionLayers(true);
root_layer->AddChild(root_scroll_layer);

layer_tree_host()->RegisterViewportLayers(
root_layer, root_scroll_layer, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer,
root_scroll_layer, NULL);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f);
}

Expand Down Expand Up @@ -910,8 +912,8 @@ class ImplSidePaintingScrollTestImplOnlyScroll
root_scroll_layer->SetIsContainerForFixedPositionLayers(true);
root_layer->AddChild(root_scroll_layer);

layer_tree_host()->RegisterViewportLayers(
root_layer, root_scroll_layer, NULL);
layer_tree_host()->RegisterViewportLayers(NULL, root_layer,
root_scroll_layer, NULL);
layer_tree_host()->SetPageScaleFactorAndLimits(1.f, 0.01f, 100.f);
}

Expand Down
7 changes: 5 additions & 2 deletions cc/trees/layer_tree_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,9 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {

if (page_scale_layer_ && inner_viewport_scroll_layer_) {
target_tree->SetViewportLayersFromIds(
page_scale_layer_->id(),
inner_viewport_scroll_layer_->id(),
overscroll_elasticity_layer_ ? overscroll_elasticity_layer_->id()
: Layer::INVALID_ID,
page_scale_layer_->id(), inner_viewport_scroll_layer_->id(),
outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
: Layer::INVALID_ID);
} else {
Expand Down Expand Up @@ -425,9 +426,11 @@ void LayerTreeImpl::ApplyScrollDeltasSinceBeginMainFrame() {
}

void LayerTreeImpl::SetViewportLayersFromIds(
int overscroll_elasticity_layer_id,
int page_scale_layer_id,
int inner_viewport_scroll_layer_id,
int outer_viewport_scroll_layer_id) {
overscroll_elasticity_layer_ = LayerById(overscroll_elasticity_layer_id);
page_scale_layer_ = LayerById(page_scale_layer_id);
DCHECK(page_scale_layer_);

Expand Down
7 changes: 6 additions & 1 deletion cc/trees/layer_tree_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,14 @@ class CC_EXPORT LayerTreeImpl {
void SetCurrentlyScrollingLayer(LayerImpl* layer);
void ClearCurrentlyScrollingLayer();

void SetViewportLayersFromIds(int page_scale_layer_id,
void SetViewportLayersFromIds(int overscroll_elasticity_layer,
int page_scale_layer_id,
int inner_viewport_scroll_layer_id,
int outer_viewport_scroll_layer_id);
void ClearViewportLayers();
LayerImpl* overscroll_elasticity_layer() {
return overscroll_elasticity_layer_;
}
LayerImpl* page_scale_layer() { return page_scale_layer_; }
void ApplySentScrollAndScaleDeltasFromAbortedCommit();
void ApplyScrollDeltasSinceBeginMainFrame();
Expand Down Expand Up @@ -334,6 +338,7 @@ class CC_EXPORT LayerTreeImpl {
SkColor background_color_;
bool has_transparent_background_;

LayerImpl* overscroll_elasticity_layer_;
LayerImpl* page_scale_layer_;
LayerImpl* inner_viewport_scroll_layer_;
LayerImpl* outer_viewport_scroll_layer_;
Expand Down
6 changes: 4 additions & 2 deletions cc/trees/layer_tree_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1798,7 +1798,8 @@ TEST_F(LayerTreeImplTest,
host_impl().active_tree()->SetPageScaleFactorAndLimits(
page_scale_factor, page_scale_factor, page_scale_factor);
host_impl().active_tree()->SetRootLayer(root.Pass());
host_impl().active_tree()->SetViewportLayersFromIds(1, 1, Layer::INVALID_ID);
host_impl().active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 1,
Layer::INVALID_ID);
host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree();

// Sanity check the scenario we just created.
Expand Down Expand Up @@ -2301,7 +2302,8 @@ TEST_F(LayerTreeImplTest, SelectionBoundsForScaledLayers) {
host_impl().active_tree()->SetPageScaleFactorAndLimits(
page_scale_factor, page_scale_factor, page_scale_factor);
host_impl().active_tree()->SetRootLayer(root.Pass());
host_impl().active_tree()->SetViewportLayersFromIds(1, 1, Layer::INVALID_ID);
host_impl().active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 1,
Layer::INVALID_ID);
host_impl().UpdateNumChildrenAndDrawPropertiesForActiveTree();

// Sanity check the scenario we just created.
Expand Down
32 changes: 26 additions & 6 deletions content/renderer/gpu/render_widget_compositor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -685,20 +685,40 @@ void RenderWidgetCompositor::registerViewportLayers(
const blink::WebLayer* innerViewportScrollLayer,
const blink::WebLayer* outerViewportScrollLayer) {
layer_tree_host_->RegisterViewportLayers(
NULL, static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(),
static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer)
->layer(),
// The outer viewport layer will only exist when using pinch virtual
// viewports.
outerViewportScrollLayer
? static_cast<const cc_blink::WebLayerImpl*>(outerViewportScrollLayer)
->layer()
: NULL);
}

void RenderWidgetCompositor::registerViewportLayers(
const blink::WebLayer* overscrollElasticityLayer,
const blink::WebLayer* pageScaleLayer,
const blink::WebLayer* innerViewportScrollLayer,
const blink::WebLayer* outerViewportScrollLayer) {
layer_tree_host_->RegisterViewportLayers(
static_cast<const cc_blink::WebLayerImpl*>(overscrollElasticityLayer)
->layer(),
static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(),
static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer)
->layer(),
// The outer viewport layer will only exist when using pinch virtual
// viewports.
outerViewportScrollLayer ? static_cast<const cc_blink::WebLayerImpl*>(
outerViewportScrollLayer)->layer()
: NULL);
outerViewportScrollLayer
? static_cast<const cc_blink::WebLayerImpl*>(outerViewportScrollLayer)
->layer()
: NULL);
}

void RenderWidgetCompositor::clearViewportLayers() {
layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
scoped_refptr<cc::Layer>(),
scoped_refptr<cc::Layer>());
layer_tree_host_->RegisterViewportLayers(
scoped_refptr<cc::Layer>(), scoped_refptr<cc::Layer>(),
scoped_refptr<cc::Layer>(), scoped_refptr<cc::Layer>());
}

void RenderWidgetCompositor::registerSelection(
Expand Down
6 changes: 6 additions & 0 deletions content/renderer/gpu/render_widget_compositor.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ class CONTENT_EXPORT RenderWidgetCompositor
virtual void finishAllRendering();
virtual void setDeferCommits(bool defer_commits);
virtual void registerForAnimations(blink::WebLayer* layer);
virtual void registerViewportLayers(
const blink::WebLayer* overscrollElasticityLayer,
const blink::WebLayer* pageScaleLayer,
const blink::WebLayer* innerViewportScrollLayer,
const blink::WebLayer* outerViewportScrollLayer) override;
// TODO(ccameron): Remove this when Blink no longer calls it.
virtual void registerViewportLayers(
const blink::WebLayer* pageScaleLayer,
const blink::WebLayer* innerViewportScrollLayer,
Expand Down
27 changes: 24 additions & 3 deletions content/test/web_layer_tree_view_impl_for_testing.cc
Original file line number Diff line number Diff line change
Expand Up @@ -164,22 +164,43 @@ void WebLayerTreeViewImplForTesting::RequestNewOutputSurface(
}

void WebLayerTreeViewImplForTesting::registerViewportLayers(
const blink::WebLayer* overscrollElasticityLayer,
const blink::WebLayer* pageScaleLayer,
const blink::WebLayer* innerViewportScrollLayer,
const blink::WebLayer* outerViewportScrollLayer) {
layer_tree_host_->RegisterViewportLayers(
static_cast<const cc_blink::WebLayerImpl*>(overscrollElasticityLayer)
->layer(),
static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(),
static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer)
->layer(),
// The outer viewport layer will only exist when using pinch virtual
// viewports.
outerViewportScrollLayer ? static_cast<const cc_blink::WebLayerImpl*>(
outerViewportScrollLayer)->layer()
: NULL);
outerViewportScrollLayer
? static_cast<const cc_blink::WebLayerImpl*>(outerViewportScrollLayer)
->layer()
: NULL);
}

void WebLayerTreeViewImplForTesting::registerViewportLayers(
const blink::WebLayer* pageScaleLayer,
const blink::WebLayer* innerViewportScrollLayer,
const blink::WebLayer* outerViewportScrollLayer) {
layer_tree_host_->RegisterViewportLayers(
NULL, static_cast<const cc_blink::WebLayerImpl*>(pageScaleLayer)->layer(),
static_cast<const cc_blink::WebLayerImpl*>(innerViewportScrollLayer)
->layer(),
// The outer viewport layer will only exist when using pinch virtual
// viewports.
outerViewportScrollLayer
? static_cast<const cc_blink::WebLayerImpl*>(outerViewportScrollLayer)
->layer()
: NULL);
}

void WebLayerTreeViewImplForTesting::clearViewportLayers() {
layer_tree_host_->RegisterViewportLayers(scoped_refptr<cc::Layer>(),
scoped_refptr<cc::Layer>(),
scoped_refptr<cc::Layer>(),
scoped_refptr<cc::Layer>());
}
Expand Down
6 changes: 6 additions & 0 deletions content/test/web_layer_tree_view_impl_for_testing.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ class WebLayerTreeViewImplForTesting
virtual void didStopFlinging();
virtual void finishAllRendering();
virtual void setDeferCommits(bool defer_commits);
virtual void registerViewportLayers(
const blink::WebLayer* overscrollElasticityLayer,
const blink::WebLayer* pageScaleLayerLayer,
const blink::WebLayer* innerViewportScrollLayer,
const blink::WebLayer* outerViewportScrollLayer) override;
// TODO(ccameron): Remove this when Blink no longer calls it.
virtual void registerViewportLayers(
const blink::WebLayer* pageScaleLayerLayer,
const blink::WebLayer* innerViewportScrollLayer,
Expand Down
Loading

0 comments on commit 8230b68

Please sign in to comment.