summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorccameron <ccameron@chromium.org>2014-12-05 11:31:00 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-05 19:32:02 +0000
commitb9aec4502197bf280b1c66f7104ed78937894b22 (patch)
treec4bdae06cae7493284364dfd06e3823017724b18
parent5f870d2cf372ae6f1f2631ada6721a4164d6b87f (diff)
downloadchromium_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.cc14
-rw-r--r--cc/input/top_controls_manager_unittest.cc3
-rw-r--r--cc/trees/layer_tree_host.cc12
-rw-r--r--cc/trees/layer_tree_host.h2
-rw-r--r--cc/trees/layer_tree_host_common.cc9
-rw-r--r--cc/trees/layer_tree_host_common.h12
-rw-r--r--cc/trees/layer_tree_host_common_perftest.cc6
-rw-r--r--cc/trees/layer_tree_host_impl.cc12
-rw-r--r--cc/trees/layer_tree_impl.cc12
-rw-r--r--cc/trees/layer_tree_impl.h20
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_;