summaryrefslogtreecommitdiff
path: root/chromium/cc/trees/layer_tree_host.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-07-12 14:07:37 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-07-17 10:29:26 +0000
commitec02ee4181c49b61fce1c8fb99292dbb8139cc90 (patch)
tree25cde714b2b71eb639d1cd53f5a22e9ba76e14ef /chromium/cc/trees/layer_tree_host.cc
parentbb09965444b5bb20b096a291445170876225268d (diff)
downloadqtwebengine-chromium-ec02ee4181c49b61fce1c8fb99292dbb8139cc90.tar.gz
BASELINE: Update Chromium to 59.0.3071.134
Change-Id: Id02ef6fb2204c5fd21668a1c3e6911c83b17585a Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/cc/trees/layer_tree_host.cc')
-rw-r--r--chromium/cc/trees/layer_tree_host.cc193
1 files changed, 155 insertions, 38 deletions
diff --git a/chromium/cc/trees/layer_tree_host.cc b/chromium/cc/trees/layer_tree_host.cc
index 942d5938681..e8a6f4b0c07 100644
--- a/chromium/cc/trees/layer_tree_host.cc
+++ b/chromium/cc/trees/layer_tree_host.cc
@@ -29,19 +29,18 @@
#include "base/timer/elapsed_timer.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/trace_event_argument.h"
+#include "cc/base/devtools_instrumentation.h"
#include "cc/base/histograms.h"
#include "cc/base/math_util.h"
-#include "cc/debug/devtools_instrumentation.h"
-#include "cc/debug/frame_viewer_instrumentation.h"
#include "cc/debug/rendering_stats_instrumentation.h"
#include "cc/input/layer_selection_bound.h"
#include "cc/input/page_scale_animation.h"
#include "cc/layers/heads_up_display_layer.h"
#include "cc/layers/heads_up_display_layer_impl.h"
#include "cc/layers/layer.h"
-#include "cc/layers/layer_iterator.h"
#include "cc/layers/painted_scrollbar_layer.h"
#include "cc/resources/ui_resource_manager.h"
+#include "cc/tiles/frame_viewer_instrumentation.h"
#include "cc/trees/draw_property_utils.h"
#include "cc/trees/effect_node.h"
#include "cc/trees/layer_tree_host_client.h"
@@ -161,6 +160,8 @@ void LayerTreeHost::InitializeProxy(std::unique_ptr<Proxy> proxy) {
proxy_ = std::move(proxy);
proxy_->Start();
+ UpdateDeferCommitsInternal();
+
mutator_host_->SetSupportsScrollAnimations(proxy_->SupportsImplScrolling());
}
@@ -315,6 +316,11 @@ void LayerTreeHost::FinishCommitOnImplThread(
sync_tree->SetDeviceScaleFactor(device_scale_factor_);
host_impl->SetDebugState(debug_state_);
+ if (did_navigate_) {
+ did_navigate_ = false;
+ host_impl->ClearImageCacheOnNavigation();
+ }
+
sync_tree->set_ui_resource_request_queue(
ui_resource_manager_->TakeUIResourcesRequests());
@@ -340,6 +346,11 @@ void LayerTreeHost::FinishCommitOnImplThread(
mutator_host_->PushPropertiesTo(host_impl->mutator_host());
}
+ // Transfer image decode requests to the impl thread.
+ for (auto& request : queued_image_decodes_)
+ host_impl->QueueImageDecode(std::move(request.first), request.second);
+ queued_image_decodes_.clear();
+
micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl);
property_trees_.ResetAllChangeTracking();
}
@@ -349,7 +360,12 @@ void LayerTreeHost::WillCommit() {
client_->WillCommit();
}
-void LayerTreeHost::UpdateHudLayer() {}
+
+void LayerTreeHost::UpdateDeferCommitsInternal() {
+ proxy_->SetDeferCommits(defer_commits_ ||
+ (settings_.enable_surface_synchronization &&
+ !local_surface_id_.is_valid()));
+}
void LayerTreeHost::CommitComplete() {
source_frame_number_++;
@@ -427,7 +443,10 @@ void LayerTreeHost::DidLoseCompositorFrameSink() {
}
void LayerTreeHost::SetDeferCommits(bool defer_commits) {
- proxy_->SetDeferCommits(defer_commits);
+ if (defer_commits_ == defer_commits)
+ return;
+ defer_commits_ = defer_commits;
+ UpdateDeferCommitsInternal();
}
DISABLE_CFI_PERF
@@ -464,9 +483,9 @@ void LayerTreeHost::SetNextCommitWaitsForActivation() {
proxy_->SetNextCommitWaitsForActivation();
}
-void LayerTreeHost::SetNextCommitForcesRedraw() {
+void LayerTreeHost::SetNeedsCommitWithForcedRedraw() {
next_commit_forces_redraw_ = true;
- proxy_->SetNeedsUpdateLayers();
+ proxy_->SetNeedsCommit();
}
void LayerTreeHost::SetAnimationEvents(
@@ -581,7 +600,7 @@ bool LayerTreeHost::UpdateLayers() {
->Add(timer.Elapsed().InMicroseconds());
}
- return result || next_commit_forces_redraw_;
+ return result;
}
void LayerTreeHost::DidCompletePageScaleAnimation() {
@@ -630,7 +649,6 @@ bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) {
"source_frame_number", SourceFrameNumber());
UpdateHudLayer(debug_state_.ShowHudInfo());
- UpdateHudLayer();
Layer* root_scroll =
PropertyTreeBuilder::FindFirstScrollableLayer(root_layer);
@@ -641,6 +659,16 @@ bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) {
if (hud_layer_) {
hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_,
device_scale_factor_);
+ // The HUD layer is managed outside the layer list sent to LayerTreeHost
+ // and needs to have its property tree state set.
+ if (settings_.use_layer_lists && root_layer_.get()) {
+ hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index());
+ hud_layer_->SetEffectTreeIndex(root_layer_->effect_tree_index());
+ hud_layer_->SetClipTreeIndex(root_layer_->clip_tree_index());
+ hud_layer_->SetScrollTreeIndex(root_layer_->scroll_tree_index());
+ hud_layer_->set_property_tree_sequence_number(
+ root_layer_->property_tree_sequence_number());
+ }
}
gfx::Transform identity_transform;
@@ -654,7 +682,6 @@ bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) {
TRACE_EVENT0(
TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"),
"LayerTreeHostInProcessCommon::ComputeVisibleRectsWithPropertyTrees");
- PropertyTreeBuilder::PreCalculateMetaInformation(root_layer);
bool can_render_to_separate_surface = true;
PropertyTrees* property_trees = &property_trees_;
if (!settings_.use_layer_lists) {
@@ -675,7 +702,7 @@ bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) {
TRACE_EVENT_SCOPE_THREAD, "property_trees",
property_trees->AsTracedValue());
}
- draw_property_utils::UpdatePropertyTrees(property_trees,
+ draw_property_utils::UpdatePropertyTrees(this, property_trees,
can_render_to_separate_surface);
draw_property_utils::FindLayersThatNeedUpdates(this, property_trees,
&update_layer_list);
@@ -732,6 +759,16 @@ void LayerTreeHost::ApplyViewportDeltas(ScrollAndScaleSet* info) {
SetNeedsUpdateLayers();
}
+void LayerTreeHost::RecordWheelAndTouchScrollingCount(ScrollAndScaleSet* info) {
+ bool has_scrolled_by_wheel = info->has_scrolled_by_wheel;
+ bool has_scrolled_by_touch = info->has_scrolled_by_touch;
+
+ if (has_scrolled_by_wheel || has_scrolled_by_touch) {
+ client_->RecordWheelAndTouchScrollingCount(has_scrolled_by_wheel,
+ has_scrolled_by_touch);
+ }
+}
+
void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
for (auto& swap_promise : info->swap_promises) {
TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow",
@@ -762,6 +799,8 @@ void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) {
// controls from clamping the layout viewport both on the compositor and
// on the main thread.
ApplyViewportDeltas(info);
+
+ RecordWheelAndTouchScrollingCount(info);
}
const base::WeakPtr<InputHandler>& LayerTreeHost::GetInputHandler()
@@ -839,6 +878,7 @@ void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) {
ResetGpuRasterizationTracking();
SetNeedsFullTreeSync();
+ did_navigate_ = true;
}
void LayerTreeHost::RegisterViewportLayers(
@@ -964,11 +1004,11 @@ void LayerTreeHost::SetPaintedDeviceScaleFactor(
SetNeedsCommit();
}
-void LayerTreeHost::SetDeviceColorSpace(
- const gfx::ColorSpace& device_color_space) {
- if (device_color_space_ == device_color_space)
+void LayerTreeHost::SetRasterColorSpace(
+ const gfx::ColorSpace& raster_color_space) {
+ if (raster_color_space_ == raster_color_space)
return;
- device_color_space_ = device_color_space;
+ raster_color_space_ = raster_color_space;
LayerTreeHostCommon::CallFunctionForEveryLayer(
this, [](Layer* layer) { layer->SetNeedsDisplay(); });
}
@@ -980,6 +1020,14 @@ void LayerTreeHost::SetContentSourceId(uint32_t id) {
SetNeedsCommit();
}
+void LayerTreeHost::SetLocalSurfaceId(const LocalSurfaceId& local_surface_id) {
+ if (local_surface_id_ == local_surface_id)
+ return;
+ local_surface_id_ = local_surface_id;
+ UpdateDeferCommitsInternal();
+ SetNeedsCommit();
+}
+
void LayerTreeHost::RegisterLayer(Layer* layer) {
DCHECK(!LayerById(layer->id()));
DCHECK(!in_paint_layer_contents_);
@@ -1038,10 +1086,6 @@ bool LayerTreeHost::LayerNeedsPushPropertiesForTesting(Layer* layer) const {
layers_that_should_push_properties_.end();
}
-void LayerTreeHost::SetNeedsMetaInfoRecomputation(bool needs_recomputation) {
- needs_meta_info_recomputation_ = needs_recomputation;
-}
-
void LayerTreeHost::SetPageScaleFromImplSide(float page_scale) {
DCHECK(CommitRequested());
page_scale_factor_ = page_scale;
@@ -1070,8 +1114,6 @@ void LayerTreeHost::UpdateHudLayer(bool show_hud_info) {
void LayerTreeHost::SetNeedsFullTreeSync() {
needs_full_tree_sync_ = true;
- needs_meta_info_recomputation_ = true;
-
property_trees_.needs_rebuild = true;
SetNeedsCommit();
}
@@ -1148,10 +1190,12 @@ void LayerTreeHost::PushPropertiesTo(LayerTreeImpl* tree_impl) {
tree_impl->set_painted_device_scale_factor(painted_device_scale_factor_);
- tree_impl->SetDeviceColorSpace(device_color_space_);
+ tree_impl->SetRasterColorSpace(raster_color_space_);
tree_impl->set_content_source_id(content_source_id_);
+ tree_impl->set_local_surface_id(local_surface_id_);
+
if (pending_page_scale_animation_) {
tree_impl->SetPendingPageScaleAnimation(
std::move(pending_page_scale_animation_));
@@ -1196,7 +1240,6 @@ void LayerTreeHost::SetElementIdsForTesting() {
}
void LayerTreeHost::BuildPropertyTreesForTesting() {
- PropertyTreeBuilder::PreCalculateMetaInformation(root_layer());
gfx::Transform identity_transform;
PropertyTreeBuilder::BuildPropertyTrees(
root_layer(), page_scale_layer(), inner_viewport_scroll_layer(),
@@ -1235,12 +1278,10 @@ void LayerTreeHost::SetElementOpacityMutated(ElementId element_id,
DCHECK_LE(opacity, 1.f);
layer->OnOpacityAnimated(opacity);
- if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::EFFECT,
- layer->id())) {
- DCHECK_EQ(layer->effect_tree_index(),
- property_trees_.layer_id_to_effect_node_index[layer->id()]);
- EffectNode* node =
- property_trees_.effect_tree.Node(layer->effect_tree_index());
+ if (EffectNode* node =
+ property_trees_.effect_tree.UpdateNodeFromOwningLayerId(
+ layer->id())) {
+ DCHECK_EQ(layer->effect_tree_index(), node->id);
if (node->opacity == opacity)
return;
@@ -1259,12 +1300,10 @@ void LayerTreeHost::SetElementTransformMutated(
DCHECK(layer);
layer->OnTransformAnimated(transform);
- if (property_trees_.IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
- layer->id())) {
- DCHECK_EQ(layer->transform_tree_index(),
- property_trees_.layer_id_to_transform_node_index[layer->id()]);
- TransformNode* node =
- property_trees_.transform_tree.Node(layer->transform_tree_index());
+ if (TransformNode* node =
+ property_trees_.transform_tree.UpdateNodeFromOwningLayerId(
+ layer->id())) {
+ DCHECK_EQ(layer->transform_tree_index(), node->id);
if (node->local == transform)
return;
@@ -1291,9 +1330,79 @@ void LayerTreeHost::ElementIsAnimatingChanged(
ElementListType list_type,
const PropertyAnimationState& mask,
const PropertyAnimationState& state) {
- Layer* layer = LayerByElementId(element_id);
- if (layer)
- layer->OnIsAnimatingChanged(mask, state);
+ // TODO(weiliangc): Most of the code is duplicated with LayerTeeHostImpl
+ // version of function. Should try to share code.
+ DCHECK_EQ(ElementListType::ACTIVE, list_type);
+
+ for (int property = TargetProperty::FIRST_TARGET_PROPERTY;
+ property <= TargetProperty::LAST_TARGET_PROPERTY; ++property) {
+ if (!mask.currently_running[property] &&
+ !mask.potentially_animating[property])
+ continue;
+
+ switch (property) {
+ case TargetProperty::TRANSFORM:
+ if (TransformNode* transform_node =
+ property_trees()->transform_tree.FindNodeFromElementId(
+ element_id)) {
+ if (mask.currently_running[property])
+ transform_node->is_currently_animating =
+ state.currently_running[property];
+ if (mask.potentially_animating[property]) {
+ transform_node->has_potential_animation =
+ state.potentially_animating[property];
+ transform_node->has_only_translation_animations =
+ mutator_host()->HasOnlyTranslationTransforms(element_id,
+ list_type);
+ property_trees()->transform_tree.set_needs_update(true);
+ }
+ } else {
+ if (state.currently_running[property] ||
+ state.potentially_animating[property])
+ DCHECK(property_trees()->needs_rebuild)
+ << "Attempting to animate non existent transform node";
+ }
+ break;
+ case TargetProperty::OPACITY:
+ if (EffectNode* effect_node =
+ property_trees()->effect_tree.FindNodeFromElementId(
+ element_id)) {
+ if (mask.currently_running[property])
+ effect_node->is_currently_animating_opacity =
+ state.currently_running[property];
+ if (mask.potentially_animating[property]) {
+ effect_node->has_potential_opacity_animation =
+ state.potentially_animating[property];
+ property_trees()->effect_tree.set_needs_update(true);
+ }
+ } else {
+ if (state.currently_running[property] ||
+ state.potentially_animating[property])
+ DCHECK(property_trees()->needs_rebuild)
+ << "Attempting to animate opacity on non existent effect node";
+ }
+ break;
+ case TargetProperty::FILTER:
+ if (EffectNode* effect_node =
+ property_trees()->effect_tree.FindNodeFromElementId(
+ element_id)) {
+ if (mask.currently_running[property])
+ effect_node->is_currently_animating_filter =
+ state.currently_running[property];
+ if (mask.potentially_animating[property])
+ effect_node->has_potential_filter_animation =
+ state.potentially_animating[property];
+ } else {
+ if (state.currently_running[property] ||
+ state.potentially_animating[property])
+ DCHECK(property_trees()->needs_rebuild)
+ << "Attempting to animate filter on non existent effect node";
+ }
+ break;
+ default:
+ break;
+ }
+ }
}
gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation(
@@ -1303,6 +1412,14 @@ gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation(
return layer->ScrollOffsetForAnimation();
}
+void LayerTreeHost::QueueImageDecode(
+ sk_sp<const SkImage> image,
+ const base::Callback<void(bool)>& callback) {
+ TRACE_EVENT0("cc", "LayerTreeHost::QueueImageDecode");
+ queued_image_decodes_.emplace_back(std::move(image), callback);
+ SetNeedsCommit();
+}
+
LayerListIterator<Layer> LayerTreeHost::begin() const {
return LayerListIterator<Layer>(root_layer_.get());
}