diff options
author | ccameron <ccameron@chromium.org> | 2014-12-05 11:31:00 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-12-05 19:32:02 +0000 |
commit | b9aec4502197bf280b1c66f7104ed78937894b22 (patch) | |
tree | c4bdae06cae7493284364dfd06e3823017724b18 | |
parent | 5f870d2cf372ae6f1f2631ada6721a4164d6b87f (diff) | |
download | chromium_src-b9aec4502197bf280b1c66f7104ed78937894b22.zip chromium_src-b9aec4502197bf280b1c66f7104ed78937894b22.tar.gz chromium_src-b9aec4502197bf280b1c66f7104ed78937894b22.tar.bz2 |
Translate the overscroll elasticity layer by the overscroll amount
Add a synced property, elastic_overscroll, similar to page_scale_factor.
Use this property to translate the overscroll elasticity layer.
With this in place, the overscroll effect works most of the time,
when using impl-thread events.
Originally committed at r306991, reverted at r306995 due to ASAN break
due to LTI::overscroll_elasticity_layer_ not being initialized.
BUG=133097
TBR=aelias
Review URL: https://codereview.chromium.org/749393005
Cr-Commit-Position: refs/heads/master@{#307057}
-rw-r--r-- | cc/input/scroll_elasticity_helper.cc | 14 | ||||
-rw-r--r-- | cc/input/top_controls_manager_unittest.cc | 3 | ||||
-rw-r--r-- | cc/trees/layer_tree_host.cc | 12 | ||||
-rw-r--r-- | cc/trees/layer_tree_host.h | 2 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common.cc | 9 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common.h | 12 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common_perftest.cc | 6 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_impl.cc | 12 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.cc | 12 | ||||
-rw-r--r-- | cc/trees/layer_tree_impl.h | 20 |
10 files changed, 82 insertions, 20 deletions
diff --git a/cc/input/scroll_elasticity_helper.cc b/cc/input/scroll_elasticity_helper.cc index 54da888..6a38e4b3 100644 --- a/cc/input/scroll_elasticity_helper.cc +++ b/cc/input/scroll_elasticity_helper.cc @@ -32,6 +32,7 @@ bool ScrollElasticityHelper::AllowsVerticalStretching() { } gfx::Vector2dF ScrollElasticityHelper::StretchAmount() { + // TODO(ccameron): Use the value of active_tree->elastic_overscroll directly return stretch_offset_; } @@ -63,7 +64,7 @@ bool ScrollElasticityHelper::CanScrollVertically() { gfx::Vector2dF ScrollElasticityHelper::AbsoluteScrollPosition() { // TODO(ccameron): This is function is redundant and may be removed. - return stretch_offset_; + return StretchAmount(); } void ScrollElasticityHelper::ImmediateScrollBy(const gfx::Vector2dF& scroll) { @@ -73,9 +74,14 @@ void ScrollElasticityHelper::ImmediateScrollBy(const gfx::Vector2dF& scroll) { void ScrollElasticityHelper::ImmediateScrollByWithoutContentEdgeConstraints( const gfx::Vector2dF& scroll) { stretch_offset_ += scroll; - - // TODO(ccameron): Update the transform of the appropriate layer in the - // LayerTreeHostImpl, and request that a frame be drawn. + // TODO(ccameron): Use the value of active_tree->elastic_overscroll directly + // Note that this assumes that this property's true value is ever changed + // by the impl thread. While this is true, it is redundant state. + layer_tree_host_impl_->active_tree()->elastic_overscroll()->SetCurrent( + -stretch_offset_); + layer_tree_host_impl_->active_tree()->set_needs_update_draw_properties(); + layer_tree_host_impl_->SetNeedsCommit(); + layer_tree_host_impl_->SetNeedsRedraw(); } void ScrollElasticityHelper::StartSnapRubberbandTimer() { diff --git a/cc/input/top_controls_manager_unittest.cc b/cc/input/top_controls_manager_unittest.cc index a209012..0be40ca 100644 --- a/cc/input/top_controls_manager_unittest.cc +++ b/cc/input/top_controls_manager_unittest.cc @@ -32,7 +32,8 @@ class MockTopControlsManagerClient : public TopControlsManagerClient { top_controls_show_threshold_(top_controls_show_threshold), top_controls_hide_threshold_(top_controls_hide_threshold) { active_tree_ = - LayerTreeImpl::create(&host_impl_, new SyncedProperty<ScaleGroup>); + LayerTreeImpl::create(&host_impl_, new SyncedProperty<ScaleGroup>, + new SyncedElasticOverscroll); root_scroll_layer_ = LayerImpl::Create(active_tree_.get(), 1); } diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 361fae1..22b1196 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc @@ -363,6 +363,9 @@ void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { sync_tree->PushPageScaleFromMainThread( page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_); + sync_tree->elastic_overscroll()->PushFromMainThread(elastic_overscroll_); + if (sync_tree->IsActiveTree()) + sync_tree->elastic_overscroll()->PushPendingToActive(); sync_tree->PassSwapPromises(&swap_promise_list_); @@ -875,6 +878,7 @@ bool LayerTreeHost::UpdateLayers(Layer* root_layer, LayerTreeHostCommon::CalcDrawPropsMainInputs inputs( root_layer, device_viewport_size(), gfx::Transform(), device_scale_factor_, page_scale_factor_, page_scale_layer, + elastic_overscroll_, overscroll_elasticity_layer_.get(), GetRendererCapabilities().max_texture_size, settings_.can_use_lcd_text, settings_.layers_always_allowed_lcd_text, can_render_to_separate_surface, @@ -1126,9 +1130,8 @@ void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { } if (!inner_viewport_scroll_delta.IsZero() || - !outer_viewport_scroll_delta.IsZero() || - info->page_scale_delta != 1.f || - info->top_controls_delta) { + !outer_viewport_scroll_delta.IsZero() || info->page_scale_delta != 1.f || + !info->elastic_overscroll_delta.IsZero() || info->top_controls_delta) { // Preemptively apply the scroll offset and scale delta here before sending // it to the client. If the client comes back and sets it to the same // value, then the layer can early out without needing a full commit. @@ -1147,12 +1150,15 @@ void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { } ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); + elastic_overscroll_ += info->elastic_overscroll_delta; if (!settings_.use_pinch_virtual_viewport) { client_->ApplyViewportDeltas( inner_viewport_scroll_delta + outer_viewport_scroll_delta, info->page_scale_delta, info->top_controls_delta); } else { + // TODO(ccameron): pass the elastic overscroll here so that input events + // may be translated appropriately. client_->ApplyViewportDeltas( inner_viewport_scroll_delta, outer_viewport_scroll_delta, diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h index 9d758c8..75165ad 100644 --- a/cc/trees/layer_tree_host.h +++ b/cc/trees/layer_tree_host.h @@ -223,6 +223,7 @@ class CC_EXPORT LayerTreeHost { float min_page_scale_factor, float max_page_scale_factor); float page_scale_factor() const { return page_scale_factor_; } + gfx::Vector2dF elastic_overscroll() const { return elastic_overscroll_; } SkColor background_color() const { return background_color_; } void set_background_color(SkColor color) { background_color_ = color; } @@ -428,6 +429,7 @@ class CC_EXPORT LayerTreeHost { float page_scale_factor_; float min_page_scale_factor_; float max_page_scale_factor_; + gfx::Vector2dF elastic_overscroll_; bool has_gpu_rasterization_trigger_; bool content_is_suitable_for_gpu_rasterization_; bool gpu_rasterization_histogram_recorded_; diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc index 3b4de1d..9a9650f 100644 --- a/cc/trees/layer_tree_host_common.cc +++ b/cc/trees/layer_tree_host_common.cc @@ -1268,6 +1268,8 @@ struct SubtreeGlobals { float device_scale_factor; float page_scale_factor; const LayerType* page_scale_application_layer; + gfx::Vector2dF elastic_overscroll; + const LayerType* elastic_overscroll_application_layer; bool can_adjust_raster_scales; bool can_render_to_separate_surface; bool layers_always_allowed_lcd_text; @@ -2121,6 +2123,10 @@ static void CalculateDrawPropertiesInternal( globals.page_scale_factor); data_for_children.in_subtree_of_page_scale_application_layer = true; } + if (layer == globals.elastic_overscroll_application_layer) { + data_for_children.parent_matrix.Translate(globals.elastic_overscroll.x(), + globals.elastic_overscroll.y()); + } // Flatten to 2D if the layer doesn't preserve 3D. if (layer->should_flatten_transform()) @@ -2399,6 +2405,9 @@ static void ProcessCalcDrawPropsInputs( inputs.device_scale_factor * device_transform_scale; globals->page_scale_factor = inputs.page_scale_factor; globals->page_scale_application_layer = inputs.page_scale_application_layer; + globals->elastic_overscroll = inputs.elastic_overscroll; + globals->elastic_overscroll_application_layer = + inputs.elastic_overscroll_application_layer; globals->can_render_to_separate_surface = inputs.can_render_to_separate_surface; globals->can_adjust_raster_scales = inputs.can_adjust_raster_scales; diff --git a/cc/trees/layer_tree_host_common.h b/cc/trees/layer_tree_host_common.h index 349b341..81aca55 100644 --- a/cc/trees/layer_tree_host_common.h +++ b/cc/trees/layer_tree_host_common.h @@ -38,6 +38,8 @@ class CC_EXPORT LayerTreeHostCommon { float device_scale_factor, float page_scale_factor, const LayerType* page_scale_application_layer, + const gfx::Vector2dF& elastic_overscroll, + const LayerType* elastic_overscroll_application_layer, int max_texture_size, bool can_use_lcd_text, bool layers_always_allowed_lcd_text, @@ -51,6 +53,9 @@ class CC_EXPORT LayerTreeHostCommon { device_scale_factor(device_scale_factor), page_scale_factor(page_scale_factor), page_scale_application_layer(page_scale_application_layer), + elastic_overscroll(elastic_overscroll), + elastic_overscroll_application_layer( + elastic_overscroll_application_layer), max_texture_size(max_texture_size), can_use_lcd_text(can_use_lcd_text), layers_always_allowed_lcd_text(layers_always_allowed_lcd_text), @@ -66,6 +71,8 @@ class CC_EXPORT LayerTreeHostCommon { float device_scale_factor; float page_scale_factor; const LayerType* page_scale_application_layer; + gfx::Vector2dF elastic_overscroll; + const LayerType* elastic_overscroll_application_layer; int max_texture_size; bool can_use_lcd_text; bool layers_always_allowed_lcd_text; @@ -145,6 +152,7 @@ struct CC_EXPORT ScrollAndScaleSet { std::vector<LayerTreeHostCommon::ScrollUpdateInfo> scrolls; float page_scale_delta; + gfx::Vector2dF elastic_overscroll_delta; float top_controls_delta; ScopedPtrVector<SwapPromise> swap_promises; }; @@ -223,6 +231,8 @@ LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType, 1.f, 1.f, NULL, + gfx::Vector2dF(), + NULL, std::numeric_limits<int>::max() / 2, false, false, @@ -248,6 +258,8 @@ LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType, 1.f, 1.f, NULL, + gfx::Vector2dF(), + NULL, std::numeric_limits<int>::max() / 2, false, false, diff --git a/cc/trees/layer_tree_host_common_perftest.cc b/cc/trees/layer_tree_host_common_perftest.cc index 2fd2146..ab72cf9 100644 --- a/cc/trees/layer_tree_host_common_perftest.cc +++ b/cc/trees/layer_tree_host_common_perftest.cc @@ -96,6 +96,8 @@ class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest { layer_tree_host()->device_viewport_size(), gfx::Transform(), layer_tree_host()->device_scale_factor(), layer_tree_host()->page_scale_factor(), + layer_tree_host()->overscroll_elasticity_layer(), + layer_tree_host()->elastic_overscroll(), layer_tree_host()->page_scale_layer(), max_texture_size, layer_tree_host()->settings().can_use_lcd_text, layer_tree_host()->settings().layers_always_allowed_lcd_text, @@ -148,7 +150,9 @@ class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest { active_tree->root_layer(), active_tree->DrawViewportSize(), host_impl->DrawTransform(), active_tree->device_scale_factor(), active_tree->current_page_scale_factor(), - active_tree->InnerViewportContainerLayer(), max_texture_size, + active_tree->InnerViewportContainerLayer(), + active_tree->elastic_overscroll()->Current(active_tree->IsActiveTree()), + active_tree->overscroll_elasticity_layer(), max_texture_size, host_impl->settings().can_use_lcd_text, host_impl->settings().layers_always_allowed_lcd_text, can_render_to_separate_surface, diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 566fb57..307078f 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc @@ -237,7 +237,8 @@ LayerTreeHostImpl::LayerTreeHostImpl( SetDebugState(settings.initial_debug_state); // LTHI always has an active tree. - active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>()); + active_tree_ = LayerTreeImpl::create(this, new SyncedProperty<ScaleGroup>(), + new SyncedElasticOverscroll); TRACE_EVENT_OBJECT_CREATED_WITH_ID( TRACE_DISABLED_BY_DEFAULT("cc.debug"), "cc::LayerTreeHostImpl", id_); @@ -1101,8 +1102,8 @@ void LayerTreeHostImpl::BlockNotifyReadyToActivateForTesting(bool block) { void LayerTreeHostImpl::ResetTreesForTesting() { if (active_tree_) active_tree_->DetachLayerTree(); - active_tree_ = - LayerTreeImpl::create(this, active_tree()->page_scale_factor()); + active_tree_ = LayerTreeImpl::create(this, active_tree()->page_scale_factor(), + active_tree()->elastic_overscroll()); if (pending_tree_) pending_tree_->DetachLayerTree(); pending_tree_ = nullptr; @@ -1748,7 +1749,8 @@ void LayerTreeHostImpl::CreatePendingTree() { recycle_tree_.swap(pending_tree_); else pending_tree_ = - LayerTreeImpl::create(this, active_tree()->page_scale_factor()); + LayerTreeImpl::create(this, active_tree()->page_scale_factor(), + active_tree()->elastic_overscroll()); // Update the delta from the active tree, which may have // adjusted its delta prior to the pending tree being created. @@ -3022,6 +3024,8 @@ scoped_ptr<ScrollAndScaleSet> LayerTreeHostImpl::ProcessScrollDeltas() { CollectScrollDeltas(scroll_info.get(), active_tree_->root_layer()); scroll_info->page_scale_delta = active_tree_->page_scale_factor()->PullDeltaForMainThread(); + scroll_info->elastic_overscroll_delta = + active_tree_->elastic_overscroll()->PullDeltaForMainThread(); scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); scroll_info->top_controls_delta = active_tree()->top_controls_delta(); active_tree_->set_sent_top_controls_delta(scroll_info->top_controls_delta); diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 3a4d36d..6a88834 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc @@ -75,7 +75,8 @@ class LayerScrollOffsetDelegateProxy : public LayerImpl::ScrollOffsetDelegate { LayerTreeImpl::LayerTreeImpl( LayerTreeHostImpl* layer_tree_host_impl, - scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor) + scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, + scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) : layer_tree_host_impl_(layer_tree_host_impl), source_frame_number_(-1), hud_layer_(0), @@ -83,12 +84,14 @@ LayerTreeImpl::LayerTreeImpl( root_layer_scroll_offset_delegate_(NULL), background_color_(0), has_transparent_background_(false), + overscroll_elasticity_layer_(NULL), page_scale_layer_(NULL), inner_viewport_scroll_layer_(NULL), outer_viewport_scroll_layer_(NULL), page_scale_factor_(page_scale_factor), min_page_scale_factor_(0), max_page_scale_factor_(0), + elastic_overscroll_(elastic_overscroll), scrolling_layer_id_from_previous_tree_(0), contents_textures_purged_(false), viewport_size_invalid_(false), @@ -230,6 +233,7 @@ void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { // tree so only the limits need to be provided. target_tree->PushPageScaleFactorAndLimits(nullptr, min_page_scale_factor(), max_page_scale_factor()); + target_tree->elastic_overscroll()->PushPendingToActive(); target_tree->pending_page_scale_animation_ = pending_page_scale_animation_.Pass(); @@ -428,6 +432,7 @@ void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() { DCHECK(IsActiveTree()); page_scale_factor()->AbortCommit(); + elastic_overscroll()->AbortCommit(); top_controls_content_offset_ += sent_top_controls_delta_; top_controls_delta_ -= sent_top_controls_delta_; @@ -524,8 +529,9 @@ bool LayerTreeImpl::UpdateDrawProperties() { root_layer(), DrawViewportSize(), layer_tree_host_impl_->DrawTransform(), device_scale_factor(), current_page_scale_factor(), page_scale_layer, - resource_provider()->max_texture_size(), settings().can_use_lcd_text, - settings().layers_always_allowed_lcd_text, + elastic_overscroll()->Current(IsActiveTree()), + overscroll_elasticity_layer_, resource_provider()->max_texture_size(), + settings().can_use_lcd_text, settings().layers_always_allowed_lcd_text, can_render_to_separate_surface, settings().layer_transforms_should_scale_layer_contents, &render_surface_layer_list_, render_surface_layer_list_id_); diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h index d16234b..46b8312 100644 --- a/cc/trees/layer_tree_impl.h +++ b/cc/trees/layer_tree_impl.h @@ -50,14 +50,16 @@ struct RendererCapabilities; struct SelectionHandle; typedef std::list<UIResourceRequest> UIResourceRequestQueue; +typedef SyncedProperty<AdditionGroup<gfx::Vector2dF>> SyncedElasticOverscroll; class CC_EXPORT LayerTreeImpl { public: static scoped_ptr<LayerTreeImpl> create( LayerTreeHostImpl* layer_tree_host_impl, - scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor) { - return make_scoped_ptr( - new LayerTreeImpl(layer_tree_host_impl, page_scale_factor)); + scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, + scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) { + return make_scoped_ptr(new LayerTreeImpl( + layer_tree_host_impl, page_scale_factor, elastic_overscroll)); } virtual ~LayerTreeImpl(); @@ -179,6 +181,13 @@ class CC_EXPORT LayerTreeImpl { SyncedProperty<ScaleGroup>* page_scale_factor(); const SyncedProperty<ScaleGroup>* page_scale_factor() const; + SyncedElasticOverscroll* elastic_overscroll() { + return elastic_overscroll_.get(); + } + const SyncedElasticOverscroll* elastic_overscroll() const { + return elastic_overscroll_.get(); + } + // Updates draw properties and render surface layer list, as well as tile // priorities. Returns false if it was unable to update. bool UpdateDrawProperties(); @@ -325,7 +334,8 @@ class CC_EXPORT LayerTreeImpl { protected: explicit LayerTreeImpl( LayerTreeHostImpl* layer_tree_host_impl, - scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor); + scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, + scoped_refptr<SyncedElasticOverscroll> elastic_overscroll); void ReleaseResourcesRecursive(LayerImpl* current); float ClampPageScaleFactorToLimits(float page_scale_factor) const; void PushPageScaleFactorAndLimits(const float* page_scale_factor, @@ -360,6 +370,8 @@ class CC_EXPORT LayerTreeImpl { float min_page_scale_factor_; float max_page_scale_factor_; + scoped_refptr<SyncedElasticOverscroll> elastic_overscroll_; + typedef base::hash_map<int, LayerImpl*> LayerIdMap; LayerIdMap layer_id_map_; |