diff options
Diffstat (limited to 'chromium/cc/trees/layer_tree_host_impl.cc')
-rw-r--r-- | chromium/cc/trees/layer_tree_host_impl.cc | 284 |
1 files changed, 121 insertions, 163 deletions
diff --git a/chromium/cc/trees/layer_tree_host_impl.cc b/chromium/cc/trees/layer_tree_host_impl.cc index 49112276c53..0dd3041f319 100644 --- a/chromium/cc/trees/layer_tree_host_impl.cc +++ b/chromium/cc/trees/layer_tree_host_impl.cc @@ -79,12 +79,12 @@ #include "cc/trees/image_animation_controller.h" #include "cc/trees/latency_info_swap_promise_monitor.h" #include "cc/trees/layer_tree_frame_sink.h" -#include "cc/trees/layer_tree_host_common.h" #include "cc/trees/layer_tree_impl.h" #include "cc/trees/mutator_host.h" #include "cc/trees/presentation_time_callback_buffer.h" #include "cc/trees/render_frame_metadata.h" #include "cc/trees/render_frame_metadata_observer.h" +#include "cc/trees/scroll_and_scale_set.h" #include "cc/trees/scroll_node.h" #include "cc/trees/single_thread_proxy.h" #include "cc/trees/transform_node.h" @@ -92,6 +92,7 @@ #include "components/viz/common/features.h" #include "components/viz/common/frame_sinks/copy_output_request.h" #include "components/viz/common/frame_sinks/delay_based_time_source.h" +#include "components/viz/common/frame_timing_details.h" #include "components/viz/common/hit_test/hit_test_region_list.h" #include "components/viz/common/quads/compositor_frame.h" #include "components/viz/common/quads/compositor_frame_metadata.h" @@ -117,7 +118,6 @@ #include "ui/gfx/geometry/scroll_offset.h" #include "ui/gfx/geometry/size_conversions.h" #include "ui/gfx/geometry/vector2d_conversions.h" -#include "ui/gfx/presentation_feedback.h" #include "ui/gfx/skia_util.h" namespace cc { @@ -202,25 +202,6 @@ void RecordCompositorSlowScrollMetric(InputHandler::ScrollInputType type, } } -ui::FrameMetricsSettings LTHI_FrameMetricsSettings( - const LayerTreeSettings& settings) { - ui::FrameMetricsSource source = - settings.commit_to_active_tree - ? ui::FrameMetricsSource::UiCompositor - : ui::FrameMetricsSource::RendererCompositor; - ui::FrameMetricsSourceThread source_thread = - settings.commit_to_active_tree - ? ui::FrameMetricsSourceThread::UiCompositor - : ui::FrameMetricsSourceThread::RendererCompositor; - ui::FrameMetricsCompileTarget compile_target = - settings.using_synchronous_renderer_compositor - ? ui::FrameMetricsCompileTarget::SynchronousCompositor - : settings.wait_for_all_pipeline_stages_before_draw - ? ui::FrameMetricsCompileTarget::Headless - : ui::FrameMetricsCompileTarget::Chromium; - return ui::FrameMetricsSettings(source, source_thread, compile_target); -} - class ScopedPostAnimationEventsToMainThread { public: ScopedPostAnimationEventsToMainThread(MutatorHost* animation_host, @@ -263,11 +244,12 @@ std::unique_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( TaskGraphRunner* task_graph_runner, std::unique_ptr<MutatorHost> mutator_host, int id, - scoped_refptr<base::SequencedTaskRunner> image_worker_task_runner) { + scoped_refptr<base::SequencedTaskRunner> image_worker_task_runner, + LayerTreeHostSchedulingClient* scheduling_client) { return base::WrapUnique(new LayerTreeHostImpl( settings, client, task_runner_provider, rendering_stats_instrumentation, task_graph_runner, std::move(mutator_host), id, - std::move(image_worker_task_runner))); + std::move(image_worker_task_runner), scheduling_client)); } LayerTreeHostImpl::LayerTreeHostImpl( @@ -278,8 +260,10 @@ LayerTreeHostImpl::LayerTreeHostImpl( TaskGraphRunner* task_graph_runner, std::unique_ptr<MutatorHost> mutator_host, int id, - scoped_refptr<base::SequencedTaskRunner> image_worker_task_runner) + scoped_refptr<base::SequencedTaskRunner> image_worker_task_runner, + LayerTreeHostSchedulingClient* scheduling_client) : client_(client), + scheduling_client_(scheduling_client), task_runner_provider_(task_runner_provider), current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), compositor_frame_reporting_controller_( @@ -314,12 +298,11 @@ LayerTreeHostImpl::LayerTreeHostImpl( image_animation_controller_(GetTaskRunner(), this, settings_.enable_image_animation_resync), - frame_metrics_(LTHI_FrameMetricsSettings(settings_)), - skipped_frame_tracker_(&frame_metrics_), is_animating_for_snap_(false), paint_image_generator_client_id_(PaintImage::GetNextGeneratorClientId()), scrollbar_controller_(std::make_unique<ScrollbarController>(this)), - frame_trackers_(compositor_frame_reporting_controller_.get()), + frame_trackers_(settings.single_thread_proxy_scheduler, + compositor_frame_reporting_controller_.get()), scroll_gesture_did_end_(false) { DCHECK(mutator_host_); mutator_host_->SetMutatorHostClient(this); @@ -388,6 +371,11 @@ LayerTreeHostImpl::~LayerTreeHostImpl() { mutator_host_->SetMutatorHostClient(nullptr); } +void LayerTreeHostImpl::WillSendBeginMainFrame() { + if (scheduling_client_) + scheduling_client_->DidScheduleBeginMainFrame(); +} + void LayerTreeHostImpl::DidSendBeginMainFrame(const viz::BeginFrameArgs& args) { if (impl_thread_phase_ == ImplThreadPhase::INSIDE_IMPL_FRAME) begin_main_frame_sent_during_impl_ = true; @@ -756,8 +744,8 @@ void LayerTreeHostImpl::AnimateInternal() { did_animate |= AnimateScrollbars(monotonic_time); did_animate |= AnimateBrowserControls(monotonic_time); - // Animating stuff can change the root scroll offset, so inform the - // synchronous input handler. + // Animating stuff can change the root scroll offset, so inform the + // synchronous input handler. UpdateRootLayerStateForSynchronousInputHandler(); if (did_animate) { // If the tree changed, then we want to draw at the end of the current @@ -766,7 +754,6 @@ void LayerTreeHostImpl::AnimateInternal() { } } - bool LayerTreeHostImpl::PrepareTiles() { if (!tile_priorities_dirty_) return false; @@ -802,8 +789,8 @@ void LayerTreeHostImpl::StartPageScaleAnimation( gfx::ScrollOffset scroll_total = active_tree_->TotalScrollOffset(); gfx::SizeF scrollable_size = active_tree_->ScrollableSize(); - gfx::SizeF viewport_size = - gfx::SizeF(active_tree_->InnerViewportContainerLayer()->bounds()); + gfx::SizeF viewport_size( + active_tree_->InnerViewportScrollNode()->container_bounds); // TODO(miletus) : Pass in ScrollOffset. page_scale_animation_ = @@ -836,9 +823,7 @@ bool LayerTreeHostImpl::IsCurrentlyScrollingViewport() const { auto* node = CurrentlyScrollingNode(); if (!node) return false; - if (!viewport()->MainScrollLayer()) - return false; - return node->id == viewport()->MainScrollLayer()->scroll_tree_index(); + return node == viewport()->MainScrollNode(); } bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( @@ -1028,11 +1013,13 @@ void LayerTreeHostImpl::FrameData::AsValueInto( base::trace_event::TracedValue* value) const { value->SetBoolean("has_no_damage", has_no_damage); - // Quad data can be quite large, so only dump render passes if we select - // viz.quads. - bool quads_enabled; - TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("viz.quads"), - &quads_enabled); + // Quad data can be quite large, so only dump render passes if we are + // logging verbosely or viz.quads tracing category is enabled. + bool quads_enabled = VLOG_IS_ON(3); + if (!quads_enabled) { + TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("viz.quads"), + &quads_enabled); + } if (quads_enabled) { value->BeginArray("render_passes"); for (size_t i = 0; i < render_passes.size(); ++i) { @@ -1044,6 +1031,18 @@ void LayerTreeHostImpl::FrameData::AsValueInto( } } +std::string LayerTreeHostImpl::FrameData::ToString() const { + base::trace_event::TracedValue value; + AsValueInto(&value); + std::string str; + base::JSONWriter::WriteWithOptions( + *value.ToBaseValue(), + base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION | + base::JSONWriter::OPTIONS_PRETTY_PRINT, + &str); + return str; +} + DrawMode LayerTreeHostImpl::GetDrawMode() const { if (resourceless_software_draw_) { return DRAW_MODE_RESOURCELESS_SOFTWARE; @@ -1150,8 +1149,7 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(FrameData* frame) { // must compute all damage tracking before drawing anything, so that we know // the root damage rect. The root damage rect is then used to scissor each // surface. - DamageTracker::UpdateDamageTracking(active_tree_.get(), - active_tree_->GetRenderSurfaceList()); + DamageTracker::UpdateDamageTracking(active_tree_.get()); if (HasDamage()) { consecutive_frame_with_damage_count_++; @@ -1469,7 +1467,6 @@ void LayerTreeHostImpl::InvalidateLayerTreeFrameSink(bool needs_redraw) { DCHECK(layer_tree_frame_sink()); layer_tree_frame_sink()->Invalidate(needs_redraw); - skipped_frame_tracker_.DidProduceFrame(); } DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { @@ -1588,6 +1585,15 @@ DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { } DrawResult draw_result = CalculateRenderPasses(frame); + + // Dump render passes and draw quads if run with: + // --vmodule=layer_tree_host_impl=3 + if (VLOG_IS_ON(3)) { + VLOG(3) << "Prepare to draw (" + << (client_name ? client_name : "<unknown client>") << ")\n" + << frame->ToString(); + } + if (draw_result != DRAW_SUCCESS) { DCHECK(!resourceless_software_draw_); return draw_result; @@ -1696,6 +1702,7 @@ void LayerTreeHostImpl::ResetTreesForTesting() { active_tree()->top_controls_shown_ratio(), active_tree()->elastic_overscroll()); active_tree_->property_trees()->is_active = true; + active_tree_->property_trees()->clear(); if (pending_tree_) pending_tree_->DetachLayers(); pending_tree_ = nullptr; @@ -1995,25 +2002,19 @@ void LayerTreeHostImpl::DidReceiveCompositorFrameAck() { void LayerTreeHostImpl::DidPresentCompositorFrame( uint32_t frame_token, - const gfx::PresentationFeedback& feedback) { - frame_trackers_.NotifyFramePresented(frame_token, feedback); + const viz::FrameTimingDetails& details) { + frame_trackers_.NotifyFramePresented(frame_token, + details.presentation_feedback); PresentationTimeCallbackBuffer::PendingCallbacks activated = presentation_time_callbacks_.PopPendingCallbacks(frame_token); - // Update compositor frame latency and smoothness stats only for frames - // that caused on-screen damage. - if (!activated.frame_time.is_null()) { - frame_metrics_.AddFrameDisplayed(activated.frame_time, feedback.timestamp); - } - // Send all the main-thread callbacks to the client in one batch. The client // is in charge of posting them to the main thread. client_->DidPresentCompositorFrameOnImplThread( - frame_token, std::move(activated.main_thread_callbacks), feedback); + frame_token, std::move(activated.main_thread_callbacks), details); } void LayerTreeHostImpl::DidNotNeedBeginFrame() { - skipped_frame_tracker_.WillNotProduceFrame(); frame_trackers_.NotifyPauseFrameProduction(); } @@ -2233,7 +2234,6 @@ bool LayerTreeHostImpl::DrawLayers(FrameData* frame) { DCHECK(CanDraw()); DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty()); ResetRequiresHighResToDraw(); - skipped_frame_tracker_.DidProduceFrame(); if (frame->has_no_damage) { DCHECK(!resourceless_software_draw_); @@ -2314,11 +2314,11 @@ viz::CompositorFrame LayerTreeHostImpl::GenerateCompositorFrame( TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); if (is_new_trace) { if (pending_tree_) { - LayerTreeHostCommon::CallFunctionForEveryLayer( - pending_tree(), [](LayerImpl* layer) { layer->DidBeginTracing(); }); + for (auto* layer : *pending_tree_) + layer->DidBeginTracing(); } - LayerTreeHostCommon::CallFunctionForEveryLayer( - active_tree(), [](LayerImpl* layer) { layer->DidBeginTracing(); }); + for (auto* layer : *active_tree_) + layer->DidBeginTracing(); } { @@ -2362,15 +2362,7 @@ viz::CompositorFrame LayerTreeHostImpl::GenerateCompositorFrame( active_tree()->TakeForceSendMetadataRequest()); } - metadata.latency_info.emplace_back(ui::SourceEventType::FRAME); - ui::LatencyInfo& new_latency_info = metadata.latency_info.back(); - if (CommitToActiveTree()) { - new_latency_info.AddLatencyNumberWithTimestamp( - ui::LATENCY_BEGIN_FRAME_UI_COMPOSITOR_COMPONENT, frame_time); - } else { - new_latency_info.AddLatencyNumberWithTimestamp( - ui::LATENCY_BEGIN_FRAME_RENDERER_COMPOSITOR_COMPONENT, frame_time); - + if (!CommitToActiveTree()) { base::TimeTicks draw_time = base::TimeTicks::Now(); for (auto& latency : metadata.latency_info) { latency.AddLatencyNumberWithTimestamp( @@ -2399,20 +2391,18 @@ viz::CompositorFrame LayerTreeHostImpl::GenerateCompositorFrame( resources, &compositor_frame.resource_list, layer_tree_frame_sink_->context_provider()); compositor_frame.render_pass_list = std::move(frame->render_passes); - // TODO(fsamuel): Once all clients get their viz::LocalSurfaceId from their - // parent, the viz::LocalSurfaceId should hang off CompositorFrameMetadata. - if (settings_.enable_surface_synchronization) { - // If surface synchronization is on, we should always have a valid - // LocalSurfaceId in LayerTreeImpl unless we don't have a scheduler because - // without a scheduler commits are not deferred and LayerTrees without valid - // LocalSurfaceId might slip through, but single-thread-without-scheduler - // mode is only used in tests so it doesn't matter. - CHECK(!settings_.single_thread_proxy_scheduler || - active_tree()->local_surface_id_allocation_from_parent().IsValid()); - layer_tree_frame_sink_->SetLocalSurfaceId( - child_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation() - .local_surface_id()); - } + + // We should always have a valid LocalSurfaceId in LayerTreeImpl unless we + // don't have a scheduler because without a scheduler commits are not deferred + // and LayerTrees without valid LocalSurfaceId might slip through, but + // single-thread-without-scheduler mode is only used in tests so it doesn't + // matter. + CHECK(!settings_.single_thread_proxy_scheduler || + active_tree()->local_surface_id_allocation_from_parent().IsValid()); + layer_tree_frame_sink_->SetLocalSurfaceId( + child_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation() + .local_surface_id()); + last_draw_local_surface_id_allocation_ = child_local_surface_id_allocator_.GetCurrentLocalSurfaceIdAllocation(); return compositor_frame; @@ -2440,13 +2430,6 @@ int LayerTreeHostImpl::RequestedMSAASampleCount() const { return settings_.gpu_rasterization_msaa_sample_count; } -void LayerTreeHostImpl::SetHasGpuRasterizationTrigger(bool flag) { - if (has_gpu_rasterization_trigger_ != flag) { - has_gpu_rasterization_trigger_ = flag; - need_update_gpu_rasterization_status_ = true; - } -} - void LayerTreeHostImpl::SetContentHasSlowPaths(bool flag) { if (content_has_slow_paths_ != flag) { content_has_slow_paths_ = flag; @@ -2471,9 +2454,15 @@ void LayerTreeHostImpl::GetGpuRasterizationCapabilities( *max_msaa_samples = 0; *supports_disable_msaa = false; + if (settings_.gpu_rasterization_disabled) { + DCHECK(!settings_.gpu_rasterization_forced); + return; + } + if (!(layer_tree_frame_sink_ && layer_tree_frame_sink_->context_provider() && - layer_tree_frame_sink_->worker_context_provider())) + layer_tree_frame_sink_->worker_context_provider())) { return; + } viz::RasterContextProvider* context_provider = layer_tree_frame_sink_->worker_context_provider(); @@ -2559,8 +2548,6 @@ bool LayerTreeHostImpl::UpdateGpuRasterizationStatus() { } } else if (!gpu_rasterization_enabled) { gpu_rasterization_status_ = GpuRasterizationStatus::OFF_DEVICE; - } else if (!has_gpu_rasterization_trigger_) { - gpu_rasterization_status_ = GpuRasterizationStatus::OFF_VIEWPORT; } else if (content_has_slow_paths_ && using_msaa_for_slow_paths) { use_gpu = use_msaa = true; gpu_rasterization_status_ = GpuRasterizationStatus::MSAA_CONTENT; @@ -2612,6 +2599,15 @@ void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() { SetRequiresHighResToDraw(); } +void LayerTreeHostImpl::RegisterCompositorPresentationTimeCallback( + uint32_t frame_token, + LayerTreeHost::PresentationTimeCallback callback) { + std::vector<LayerTreeHost::PresentationTimeCallback> as_vector; + as_vector.emplace_back(std::move(callback)); + presentation_time_callbacks_.RegisterCompositorPresentationCallbacks( + frame_token, std::move(as_vector)); +} + bool LayerTreeHostImpl::WillBeginImplFrame(const viz::BeginFrameArgs& args) { impl_thread_phase_ = ImplThreadPhase::INSIDE_IMPL_FRAME; current_begin_frame_tracker_.Start(args); @@ -2639,8 +2635,6 @@ bool LayerTreeHostImpl::WillBeginImplFrame(const viz::BeginFrameArgs& args) { for (auto* it : video_frame_controllers_) it->OnBeginFrame(args); - skipped_frame_tracker_.BeginFrame(args.frame_time, args.interval); - bool recent_frame_had_no_damage = consecutive_frame_with_damage_count_ < settings_.damaged_frame_limit; // Check damage early if the setting is enabled and a recent frame had no @@ -2650,8 +2644,7 @@ bool LayerTreeHostImpl::WillBeginImplFrame(const viz::BeginFrameArgs& args) { CanDraw()) { bool ok = active_tree()->UpdateDrawProperties(); DCHECK(ok); - DamageTracker::UpdateDamageTracking(active_tree_.get(), - active_tree_->GetRenderSurfaceList()); + DamageTracker::UpdateDamageTracking(active_tree_.get()); bool has_damage = HasDamage(); // Animations are updated after we attempt to draw. If the frame is aborted, // update animations now. @@ -2676,7 +2669,6 @@ void LayerTreeHostImpl::DidFinishImplFrame() { frame_trackers_.NotifyMainFrameCausedNoDamage( current_begin_frame_tracker_.Current()); } - skipped_frame_tracker_.FinishFrame(); impl_thread_phase_ = ImplThreadPhase::IDLE; current_begin_frame_tracker_.Finish(); } @@ -2859,26 +2851,10 @@ void LayerTreeHostImpl::SetNeedsCommit() { client_->SetNeedsCommitOnImplThread(); } -LayerImpl* LayerTreeHostImpl::InnerViewportContainerLayer() const { - return active_tree_->InnerViewportContainerLayer(); -} - -LayerImpl* LayerTreeHostImpl::InnerViewportScrollLayer() const { - return active_tree_->InnerViewportScrollLayer(); -} - ScrollNode* LayerTreeHostImpl::InnerViewportScrollNode() const { return active_tree_->InnerViewportScrollNode(); } -LayerImpl* LayerTreeHostImpl::OuterViewportContainerLayer() const { - return active_tree_->OuterViewportContainerLayer(); -} - -LayerImpl* LayerTreeHostImpl::OuterViewportScrollLayer() const { - return active_tree_->OuterViewportScrollLayer(); -} - ScrollNode* LayerTreeHostImpl::OuterViewportScrollNode() const { return active_tree_->OuterViewportScrollNode(); } @@ -3155,8 +3131,6 @@ void LayerTreeHostImpl::SetNeedsOneBeginImplFrame() { void LayerTreeHostImpl::SetNeedsRedraw() { NotifySwapPromiseMonitorsOfSetNeedsRedraw(); client_->SetNeedsRedrawOnImplThread(); - if (CurrentlyScrollingNode()) - skipped_frame_tracker_.WillProduceFrame(); } ManagedMemoryPolicy LayerTreeHostImpl::ActualManagedMemoryPolicy() const { @@ -3306,16 +3280,8 @@ void LayerTreeHostImpl::SetPaintWorkletLayerPainter( paint_worklet_painter_ = std::move(painter); } -LayerImpl* LayerTreeHostImpl::ViewportMainScrollLayer() { - return viewport()->MainScrollLayer(); -} - ScrollNode* LayerTreeHostImpl::ViewportMainScrollNode() { - if (!ViewportMainScrollLayer()) - return nullptr; - - return active_tree_->property_trees()->scroll_tree.Node( - ViewportMainScrollLayer()->scroll_tree_index()); + return viewport()->MainScrollNode(); } void LayerTreeHostImpl::QueueImageDecode(int request_id, @@ -3482,6 +3448,8 @@ bool LayerTreeHostImpl::InitializeFrameSink( has_valid_layer_tree_frame_sink_ = true; auto* context_provider = layer_tree_frame_sink_->context_provider(); + frame_trackers_.StartSequence(FrameSequenceTrackerType::kUniversal); + if (context_provider) { max_texture_size_ = context_provider->ContextCapabilities().max_texture_size; @@ -3940,7 +3908,7 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin( ElementId current_native_scrolling_element = scroll_state->data()->current_native_scrolling_element(); - if (current_native_scrolling_element.GetInternalValue() != 0) { + if (current_native_scrolling_element.GetStableId() != 0) { auto& scroll_tree = active_tree_->property_trees()->scroll_tree; scrolling_node = scroll_tree.FindNodeFromElementId(current_native_scrolling_element); @@ -4240,8 +4208,7 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( } bool scrolls_main_viewport_scroll_layer = - viewport()->MainScrollLayer() && - viewport()->MainScrollLayer()->scroll_tree_index() == scroll_node->id; + scroll_node == viewport()->MainScrollNode(); if (scrolls_main_viewport_scroll_layer) { // Flash the overlay scrollbar even if the scroll dalta is 0. if (settings_.scrollbar_flash_after_any_scroll_update) { @@ -4728,11 +4695,6 @@ InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( if (did_scroll_content) { ShowScrollbarsForImplScroll(current_scrolling_node->element_id); - // If we are scrolling with an active scroll handler, forward latency - // tracking information to the main thread so the delay introduced by the - // handler is accounted for. - if (scroll_affects_scroll_handler()) - NotifySwapPromiseMonitorsOfForwardingToMainThread(); client_->SetNeedsCommitOnImplThread(); SetNeedsRedraw(); client_->RenewTreePriority(); @@ -4830,7 +4792,7 @@ void LayerTreeHostImpl::SetSynchronousInputHandlerRootScrollOffset( if (!changed) return; - ShowScrollbarsForImplScroll(OuterViewportScrollLayer()->element_id()); + ShowScrollbarsForImplScroll(OuterViewportScrollNode()->element_id); client_->SetNeedsCommitOnImplThread(); // After applying the synchronous input handler's scroll offset, tell it what // we ended up with. @@ -4859,6 +4821,8 @@ bool LayerTreeHostImpl::SnapAtScrollEnd() { ScrollOffsetToVector2dF(snap_position - current_position); bool scrolls_main_viewport_scroll_layer = scroll_node == ViewportMainScrollNode(); + + bool did_animate = false; if (scrolls_main_viewport_scroll_layer) { // Flash the overlay scrollbar even if the scroll dalta is 0. if (settings_.scrollbar_flash_after_any_scroll_update) { @@ -4871,27 +4835,23 @@ bool LayerTreeHostImpl::SnapAtScrollEnd() { } gfx::Vector2dF scaled_delta(delta); scaled_delta.Scale(active_tree()->page_scale_factor_for_scroll()); - viewport()->ScrollAnimated(scaled_delta, base::TimeDelta()); + gfx::Vector2dF consumed_delta = + viewport()->ScrollAnimated(scaled_delta, base::TimeDelta()); + did_animate = !consumed_delta.IsZero(); } else { - ScrollAnimationCreate(scroll_node, delta, base::TimeDelta()); + did_animate = ScrollAnimationCreate(scroll_node, delta, base::TimeDelta()); } DCHECK(!is_animating_for_snap_); - is_animating_for_snap_ = true; - return true; + is_animating_for_snap_ = did_animate; + return did_animate; } gfx::ScrollOffset LayerTreeHostImpl::GetVisualScrollOffset( const ScrollNode& scroll_node) const { - const ScrollTree& scroll_tree = active_tree()->property_trees()->scroll_tree; - - bool scrolls_main_viewport_scroll_layer = - viewport()->MainScrollLayer() && - viewport()->MainScrollLayer()->scroll_tree_index() == scroll_node.id; - - if (scrolls_main_viewport_scroll_layer) + if (&scroll_node == viewport()->MainScrollNode()) return viewport()->TotalScrollOffset(); - else - return scroll_tree.current_scroll_offset(scroll_node.element_id); + return active_tree()->property_trees()->scroll_tree.current_scroll_offset( + scroll_node.element_id); } bool LayerTreeHostImpl::GetSnapFlingInfo( @@ -4968,7 +4928,8 @@ void LayerTreeHostImpl::ScrollEnd(ScrollState* scroll_state, bool should_snap) { } InputHandlerPointerResult LayerTreeHostImpl::MouseDown( - const gfx::PointF& viewport_point) { + const gfx::PointF& viewport_point, + bool shift_modifier) { ScrollbarAnimationController* animation_controller = ScrollbarAnimationControllerForElementId( scroll_element_id_mouse_currently_over_); @@ -4979,8 +4940,10 @@ InputHandlerPointerResult LayerTreeHostImpl::MouseDown( } InputHandlerPointerResult result; - if (settings().compositor_threaded_scrollbar_scrolling) - result = scrollbar_controller_->HandlePointerDown(viewport_point); + if (settings().compositor_threaded_scrollbar_scrolling) { + result = scrollbar_controller_->HandlePointerDown(viewport_point, + shift_modifier); + } return result; } @@ -5008,9 +4971,10 @@ InputHandlerPointerResult LayerTreeHostImpl::MouseUp( InputHandlerPointerResult LayerTreeHostImpl::MouseMoveAt( const gfx::Point& viewport_point) { InputHandlerPointerResult result; - if (settings().compositor_threaded_scrollbar_scrolling) + if (settings().compositor_threaded_scrollbar_scrolling) { result = - scrollbar_controller_->HandleMouseMove(gfx::PointF(viewport_point)); + scrollbar_controller_->HandlePointerMove(gfx::PointF(viewport_point)); + } // Early out if there are no animation controllers and avoid the hit test. // This happens on platforms without animated scrollbars. @@ -5039,9 +5003,9 @@ InputHandlerPointerResult LayerTreeHostImpl::MouseMoveAt( scroll_element_id = scroll_node->element_id; // Scrollbars for the viewport are registered with the outer viewport layer. - if (InnerViewportScrollNode() && OuterViewportScrollLayer() && + if (InnerViewportScrollNode() && OuterViewportScrollNode() && scroll_element_id == InnerViewportScrollNode()->element_id) - scroll_element_id = OuterViewportScrollLayer()->element_id(); + scroll_element_id = OuterViewportScrollNode()->element_id; } ScrollbarAnimationController* new_animation_controller = @@ -5139,8 +5103,8 @@ void LayerTreeHostImpl::CollectScrollbarUpdates( ScrollAndScaleSet* scroll_info) const { scroll_info->scrollbars.reserve(scrollbar_animation_controllers_.size()); for (auto& pair : scrollbar_animation_controllers_) { - scroll_info->scrollbars.push_back(LayerTreeHostCommon::ScrollbarsUpdateInfo( - pair.first, pair.second->ScrollbarsHidden())); + scroll_info->scrollbars.push_back( + {pair.first, pair.second->ScrollbarsHidden()}); } } @@ -5367,16 +5331,16 @@ LayerTreeHostImpl::ScrollbarAnimationControllerForElementId( // The viewport layers have only one set of scrollbars. On Android, these are // registered with the inner viewport, otherwise they're registered with the // outer viewport. If a controller for one exists, the other shouldn't. - if (InnerViewportScrollNode() && OuterViewportScrollLayer()) { + if (InnerViewportScrollNode() && OuterViewportScrollNode()) { if (scroll_element_id == InnerViewportScrollNode()->element_id || - scroll_element_id == OuterViewportScrollLayer()->element_id()) { + scroll_element_id == OuterViewportScrollNode()->element_id) { auto itr = scrollbar_animation_controllers_.find( InnerViewportScrollNode()->element_id); if (itr != scrollbar_animation_controllers_.end()) return itr->second.get(); itr = scrollbar_animation_controllers_.find( - OuterViewportScrollLayer()->element_id()); + OuterViewportScrollNode()->element_id); if (itr != scrollbar_animation_controllers_.end()) return itr->second.get(); @@ -5872,12 +5836,6 @@ void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { (*it)->OnSetNeedsRedrawOnImpl(); } -void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfForwardingToMainThread() { - auto it = swap_promise_monitor_.begin(); - for (; it != swap_promise_monitor_.end(); it++) - (*it)->OnForwardScrollUpdateToMainThreadOnImpl(); -} - void LayerTreeHostImpl::UpdateRootLayerStateForSynchronousInputHandler() { if (!input_handler_client_) return; |