diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-12 14:07:37 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-07-17 10:29:26 +0000 |
commit | ec02ee4181c49b61fce1c8fb99292dbb8139cc90 (patch) | |
tree | 25cde714b2b71eb639d1cd53f5a22e9ba76e14ef /chromium/cc/trees/layer_tree_host.cc | |
parent | bb09965444b5bb20b096a291445170876225268d (diff) | |
download | qtwebengine-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.cc | 193 |
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()); } |