| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index 2f4d9a9b057cdbb9c21264f24606b5cc6b671726..f81a3b1d74f84ca0fca917b7f1830bb3687af138 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -708,10 +708,11 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
| return DRAW_SUCCESS;
|
| }
|
|
|
| - TRACE_EVENT1("cc",
|
| - "LayerTreeHostImpl::CalculateRenderPasses",
|
| - "render_surface_layer_list.size()",
|
| - static_cast<uint64>(frame->render_surface_layer_list->size()));
|
| + TRACE_EVENT_BEGIN2(
|
| + "cc", "LayerTreeHostImpl::CalculateRenderPasses",
|
| + "render_surface_layer_list.size()",
|
| + static_cast<uint64>(frame->render_surface_layer_list->size()),
|
| + "RequiresHighResToDraw", RequiresHighResToDraw());
|
|
|
| // Create the render passes in dependency order.
|
| for (int surface_index = frame->render_surface_layer_list->size() - 1;
|
| @@ -754,9 +755,6 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
| // due to an impl-animation, we drop the frame to avoid flashing due to the
|
| // texture suddenly appearing in the future.
|
| DrawResult draw_result = DRAW_SUCCESS;
|
| - // When we have a copy request for a layer, we need to draw no matter
|
| - // what, as the layer may disappear after this frame.
|
| - bool have_copy_request = false;
|
|
|
| int layers_drawn = 0;
|
|
|
| @@ -764,6 +762,8 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
|
|
| int num_missing_tiles = 0;
|
| int num_incomplete_tiles = 0;
|
| + bool have_copy_request = false;
|
| + bool have_missing_animated_tiles = false;
|
|
|
| auto end = LayerIterator<LayerImpl>::End(frame->render_surface_layer_list);
|
| for (auto it =
|
| @@ -848,18 +848,34 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
| it->screen_space_transform_is_animating() ||
|
| it->draw_transform_is_animating();
|
| if (layer_has_animating_transform)
|
| - draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
|
| + have_missing_animated_tiles = true;
|
| }
|
| + }
|
|
|
| - if (append_quads_data.num_incomplete_tiles ||
|
| - append_quads_data.num_missing_tiles) {
|
| - if (RequiresHighResToDraw())
|
| - draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
|
| - }
|
| + if (have_missing_animated_tiles)
|
| + draw_result = DRAW_ABORTED_CHECKERBOARD_ANIMATIONS;
|
| +
|
| + // When we have a copy request for a layer, we need to draw even if there
|
| + // would be animating checkerboards, because failing under those conditions
|
| + // triggers a new main frame, which may cause the copy request layer to be
|
| + // destroyed.
|
| + // TODO(danakj): Leaking scheduler internals into LayerTreeHostImpl here.
|
| + if (have_copy_request)
|
| + draw_result = DRAW_SUCCESS;
|
| +
|
| + // When we require high res to draw, abort the draw (almost) always. This does
|
| + // not cause the scheduler to do a main frame, instead it will continue to try
|
| + // drawing until we finally complete, so the copy request will not be lost.
|
| + if (num_incomplete_tiles || num_missing_tiles) {
|
| + if (RequiresHighResToDraw())
|
| + draw_result = DRAW_ABORTED_MISSING_HIGH_RES_CONTENT;
|
| }
|
|
|
| - if (have_copy_request ||
|
| - output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
|
| + // When this capability is set we don't have control over the surface the
|
| + // compositor draws to, so even though the frame may not be complete, the
|
| + // previous frame has already been potentially lost, so an incomplete frame is
|
| + // better than nothing, so this takes highest precidence.
|
| + if (output_surface_->capabilities().draw_and_swap_full_viewport_every_frame)
|
| draw_result = DRAW_SUCCESS;
|
|
|
| #if DCHECK_IS_ON()
|
| @@ -910,6 +926,10 @@ DrawResult LayerTreeHostImpl::CalculateRenderPasses(
|
| frame->render_passes.size() == 1u)
|
| << frame->render_passes.size();
|
|
|
| + TRACE_EVENT_END2("cc", "LayerTreeHostImpl::CalculateRenderPasses",
|
| + "draw_result", draw_result, "missing tiles",
|
| + num_missing_tiles);
|
| +
|
| return draw_result;
|
| }
|
|
|
| @@ -1055,7 +1075,7 @@ DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) {
|
| // This will cause NotifyTileStateChanged() to be called for any visible tiles
|
| // that completed, which will add damage to the frame for them so they appear
|
| // as part of the current frame being drawn.
|
| - if (settings().impl_side_painting)
|
| + if (tile_manager_)
|
| tile_manager_->UpdateVisibleTiles(global_tile_state_);
|
|
|
| frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList();
|
| @@ -1528,7 +1548,7 @@ void LayerTreeHostImpl::DrawLayers(FrameData* frame,
|
|
|
| if (draw_mode == DRAW_MODE_RESOURCELESS_SOFTWARE) {
|
| bool disable_picture_quad_image_filtering =
|
| - IsActivelyScrolling() || needs_animate_layers();
|
| + IsActivelyScrolling() || animation_registrar_->needs_animate_layers();
|
|
|
| scoped_ptr<SoftwareRenderer> temp_software_renderer =
|
| SoftwareRenderer::Create(this, &settings_.renderer_settings,
|
| @@ -1656,6 +1676,18 @@ void LayerTreeHostImpl::UpdateViewportContainerSizes() {
|
| if (!inner_container)
|
| return;
|
|
|
| + // TODO(bokan): This code is currently specific to top controls. It should be
|
| + // made general. crbug.com/464814.
|
| + if (!TopControlsHeight()) {
|
| + if (outer_container)
|
| + outer_container->SetBoundsDelta(gfx::Vector2dF());
|
| +
|
| + inner_container->SetBoundsDelta(gfx::Vector2dF());
|
| + active_tree_->InnerViewportScrollLayer()->SetBoundsDelta(gfx::Vector2dF());
|
| +
|
| + return;
|
| + }
|
| +
|
| ViewportAnchor anchor(InnerViewportScrollLayer(),
|
| OuterViewportScrollLayer());
|
|
|
| @@ -1693,7 +1725,8 @@ void LayerTreeHostImpl::UpdateViewportContainerSizes() {
|
| void LayerTreeHostImpl::SynchronouslyInitializeAllTiles() {
|
| // Only valid for the single-threaded non-scheduled/synchronous case
|
| // using the zero copy raster worker pool.
|
| - single_thread_synchronous_task_graph_runner_->RunUntilIdle();
|
| + if (tile_manager_)
|
| + single_thread_synchronous_task_graph_runner_->RunUntilIdle();
|
| }
|
|
|
| void LayerTreeHostImpl::DidLoseOutputSurface() {
|
| @@ -2057,6 +2090,11 @@ void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool(
|
| }
|
| }
|
|
|
| + // Synchronous single-threaded mode depends on tiles being ready to
|
| + // draw when raster is complete. Therefore, it must use one of zero
|
| + // copy, software raster, or GPU raster (in the branches above).
|
| + DCHECK(!IsSynchronousSingleThreaded());
|
| +
|
| *resource_pool = ResourcePool::Create(
|
| resource_provider_.get(), GL_TEXTURE_2D);
|
|
|
| @@ -2119,7 +2157,7 @@ bool LayerTreeHostImpl::InitializeRenderer(
|
|
|
| CreateAndSetRenderer();
|
|
|
| - if (settings_.impl_side_painting)
|
| + if (settings_.impl_side_painting && settings_.raster_enabled)
|
| CreateAndSetTileManager();
|
| RecreateTreeResources();
|
|
|
| @@ -3112,52 +3150,35 @@ void LayerTreeHostImpl::AnimateScrollbars(base::TimeTicks monotonic_time) {
|
| }
|
|
|
| void LayerTreeHostImpl::AnimateLayers(base::TimeTicks monotonic_time) {
|
| - if (!settings_.accelerated_animation_enabled ||
|
| - !needs_animate_layers() ||
|
| - !active_tree_->root_layer())
|
| + if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer())
|
| return;
|
|
|
| - TRACE_EVENT0("cc", "LayerTreeHostImpl::AnimateLayers");
|
| - AnimationRegistrar::AnimationControllerMap controllers_copy =
|
| - animation_registrar_->active_animation_controllers();
|
| - for (auto& it : controllers_copy)
|
| - it.second->Animate(monotonic_time);
|
| -
|
| - SetNeedsAnimate();
|
| + if (animation_registrar_->AnimateLayers(monotonic_time))
|
| + SetNeedsAnimate();
|
| }
|
|
|
| void LayerTreeHostImpl::UpdateAnimationState(bool start_ready_animations) {
|
| - if (!settings_.accelerated_animation_enabled || !needs_animate_layers() ||
|
| - !active_tree_->root_layer())
|
| + if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer())
|
| return;
|
|
|
| - TRACE_EVENT0("cc", "LayerTreeHostImpl::UpdateAnimationState");
|
| scoped_ptr<AnimationEventsVector> events =
|
| - make_scoped_ptr(new AnimationEventsVector);
|
| - AnimationRegistrar::AnimationControllerMap active_controllers_copy =
|
| - animation_registrar_->active_animation_controllers();
|
| - for (auto& it : active_controllers_copy)
|
| - it.second->UpdateState(start_ready_animations, events.get());
|
| + animation_registrar_->CreateEvents();
|
| + const bool has_active_animations = animation_registrar_->UpdateAnimationState(
|
| + start_ready_animations, events.get());
|
|
|
| - if (!events->empty()) {
|
| + if (!events->empty())
|
| client_->PostAnimationEventsToMainThreadOnImplThread(events.Pass());
|
| - }
|
|
|
| - SetNeedsAnimate();
|
| + if (has_active_animations)
|
| + SetNeedsAnimate();
|
| }
|
|
|
| void LayerTreeHostImpl::ActivateAnimations() {
|
| - if (!settings_.accelerated_animation_enabled || !needs_animate_layers() ||
|
| - !active_tree_->root_layer())
|
| + if (!settings_.accelerated_animation_enabled || !active_tree_->root_layer())
|
| return;
|
|
|
| - TRACE_EVENT0("cc", "LayerTreeHostImpl::ActivateAnimations");
|
| - AnimationRegistrar::AnimationControllerMap active_controllers_copy =
|
| - animation_registrar_->active_animation_controllers();
|
| - for (auto& it : active_controllers_copy)
|
| - it.second->ActivateAnimations();
|
| -
|
| - SetNeedsAnimate();
|
| + if (animation_registrar_->ActivateAnimations())
|
| + SetNeedsAnimate();
|
| }
|
|
|
| std::string LayerTreeHostImpl::LayerTreeAsJson() const {
|
| @@ -3234,11 +3255,6 @@ BeginFrameArgs LayerTreeHostImpl::CurrentBeginFrameArgs() const {
|
| }
|
|
|
| scoped_refptr<base::trace_event::ConvertableToTraceFormat>
|
| -LayerTreeHostImpl::AsValue() const {
|
| - return AsValueWithFrame(NULL);
|
| -}
|
| -
|
| -scoped_refptr<base::trace_event::ConvertableToTraceFormat>
|
| LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const {
|
| scoped_refptr<base::trace_event::TracedValue> state =
|
| new base::trace_event::TracedValue();
|
| @@ -3246,11 +3262,6 @@ LayerTreeHostImpl::AsValueWithFrame(FrameData* frame) const {
|
| return state;
|
| }
|
|
|
| -void LayerTreeHostImpl::AsValueInto(
|
| - base::trace_event::TracedValue* value) const {
|
| - return AsValueWithFrameInto(NULL, value);
|
| -}
|
| -
|
| void LayerTreeHostImpl::AsValueWithFrameInto(
|
| FrameData* frame,
|
| base::trace_event::TracedValue* state) const {
|
| @@ -3299,14 +3310,6 @@ void LayerTreeHostImpl::AsValueWithFrameInto(
|
| }
|
| }
|
|
|
| -scoped_refptr<base::trace_event::ConvertableToTraceFormat>
|
| -LayerTreeHostImpl::ActivationStateAsValue() const {
|
| - scoped_refptr<base::trace_event::TracedValue> state =
|
| - new base::trace_event::TracedValue();
|
| - ActivationStateAsValueInto(state.get());
|
| - return state;
|
| -}
|
| -
|
| void LayerTreeHostImpl::ActivationStateAsValueInto(
|
| base::trace_event::TracedValue* state) const {
|
| TracedValue::SetIDRef(this, state, "lthi");
|
|
|