1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "cc/trees/layer_tree_impl.h"
7 #include "base/debug/trace_event.h"
8 #include "cc/animation/keyframed_animation_curve.h"
9 #include "cc/animation/scrollbar_animation_controller.h"
10 #include "cc/base/math_util.h"
11 #include "cc/base/util.h"
12 #include "cc/debug/traced_value.h"
13 #include "cc/layers/heads_up_display_layer_impl.h"
14 #include "cc/layers/layer.h"
15 #include "cc/layers/layer_iterator.h"
16 #include "cc/layers/render_surface_impl.h"
17 #include "cc/layers/scrollbar_layer_impl_base.h"
18 #include "cc/resources/ui_resource_request.h"
19 #include "cc/trees/layer_tree_host_common.h"
20 #include "cc/trees/layer_tree_host_impl.h"
21 #include "ui/gfx/size_conversions.h"
22 #include "ui/gfx/vector2d_conversions.h"
26 // This class exists to split the LayerScrollOffsetDelegate between the
27 // InnerViewportScrollLayer and the OuterViewportScrollLayer in a manner
28 // that never requires the embedder or LayerImpl to know about.
29 class LayerScrollOffsetDelegateProxy : public LayerScrollOffsetDelegate {
31 LayerScrollOffsetDelegateProxy(LayerImpl* layer,
32 LayerScrollOffsetDelegate* delegate,
33 LayerTreeImpl* layer_tree)
34 : layer_(layer), delegate_(delegate), layer_tree_impl_(layer_tree) {}
36 gfx::Vector2dF last_set_scroll_offset() const {
37 return last_set_scroll_offset_;
40 // LayerScrollOffsetDelegate implementation.
42 virtual void SetTotalScrollOffset(const gfx::Vector2dF& new_offset) OVERRIDE {
43 last_set_scroll_offset_ = new_offset;
44 layer_tree_impl_->UpdateScrollOffsetDelegate();
47 virtual gfx::Vector2dF GetTotalScrollOffset() OVERRIDE {
48 return layer_tree_impl_->GetDelegatedScrollOffset(layer_);
51 virtual bool IsExternalFlingActive() const OVERRIDE {
52 return delegate_->IsExternalFlingActive();
55 // Functions below this point are never called by LayerImpl on its
56 // LayerScrollOffsetDelegate, and so are not implemented.
57 virtual void SetMaxScrollOffset(const gfx::Vector2dF&) OVERRIDE {
61 virtual void SetTotalPageScaleFactorAndLimits(float, float, float) OVERRIDE {
65 virtual void SetScrollableSize(const gfx::SizeF& scrollable_size) OVERRIDE {
71 LayerScrollOffsetDelegate* delegate_;
72 LayerTreeImpl* layer_tree_impl_;
73 gfx::Vector2dF last_set_scroll_offset_;
76 LayerTreeImpl::LayerTreeImpl(LayerTreeHostImpl* layer_tree_host_impl)
77 : layer_tree_host_impl_(layer_tree_host_impl),
78 source_frame_number_(-1),
80 currently_scrolling_layer_(NULL),
81 root_layer_scroll_offset_delegate_(NULL),
83 has_transparent_background_(false),
84 page_scale_layer_(NULL),
85 inner_viewport_scroll_layer_(NULL),
86 outer_viewport_scroll_layer_(NULL),
87 page_scale_factor_(1),
89 sent_page_scale_delta_(1),
90 min_page_scale_factor_(0),
91 max_page_scale_factor_(0),
92 scrolling_layer_id_from_previous_tree_(0),
93 contents_textures_purged_(false),
94 requires_high_res_to_draw_(false),
95 viewport_size_invalid_(false),
96 needs_update_draw_properties_(true),
97 needs_full_tree_sync_(true),
98 next_activation_forces_redraw_(false) {}
100 LayerTreeImpl::~LayerTreeImpl() {
101 // Need to explicitly clear the tree prior to destroying this so that
102 // the LayerTreeImpl pointer is still valid in the LayerImpl dtor.
103 DCHECK(!root_layer_);
104 DCHECK(layers_with_copy_output_request_.empty());
107 void LayerTreeImpl::Shutdown() { root_layer_.reset(); }
109 void LayerTreeImpl::SetRootLayer(scoped_ptr<LayerImpl> layer) {
110 if (inner_viewport_scroll_layer_)
111 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
112 if (outer_viewport_scroll_layer_)
113 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
114 inner_viewport_scroll_delegate_proxy_.reset();
115 outer_viewport_scroll_delegate_proxy_.reset();
117 root_layer_ = layer.Pass();
118 currently_scrolling_layer_ = NULL;
119 inner_viewport_scroll_layer_ = NULL;
120 outer_viewport_scroll_layer_ = NULL;
121 page_scale_layer_ = NULL;
123 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
126 LayerImpl* LayerTreeImpl::InnerViewportScrollLayer() const {
127 return inner_viewport_scroll_layer_;
130 LayerImpl* LayerTreeImpl::OuterViewportScrollLayer() const {
131 return outer_viewport_scroll_layer_;
134 gfx::Vector2dF LayerTreeImpl::TotalScrollOffset() const {
135 gfx::Vector2dF offset;
137 if (inner_viewport_scroll_layer_)
138 offset += inner_viewport_scroll_layer_->TotalScrollOffset();
140 if (outer_viewport_scroll_layer_)
141 offset += outer_viewport_scroll_layer_->TotalScrollOffset();
146 gfx::Vector2dF LayerTreeImpl::TotalMaxScrollOffset() const {
147 gfx::Vector2dF offset;
149 if (inner_viewport_scroll_layer_)
150 offset += inner_viewport_scroll_layer_->MaxScrollOffset();
152 if (outer_viewport_scroll_layer_)
153 offset += outer_viewport_scroll_layer_->MaxScrollOffset();
157 gfx::Vector2dF LayerTreeImpl::TotalScrollDelta() const {
158 DCHECK(inner_viewport_scroll_layer_);
159 gfx::Vector2dF delta = inner_viewport_scroll_layer_->ScrollDelta();
161 if (outer_viewport_scroll_layer_)
162 delta += outer_viewport_scroll_layer_->ScrollDelta();
167 scoped_ptr<LayerImpl> LayerTreeImpl::DetachLayerTree() {
168 // Clear all data structures that have direct references to the layer tree.
169 scrolling_layer_id_from_previous_tree_ =
170 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0;
171 if (inner_viewport_scroll_layer_)
172 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
173 if (outer_viewport_scroll_layer_)
174 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(NULL);
175 inner_viewport_scroll_delegate_proxy_.reset();
176 outer_viewport_scroll_delegate_proxy_.reset();
177 inner_viewport_scroll_layer_ = NULL;
178 outer_viewport_scroll_layer_ = NULL;
179 page_scale_layer_ = NULL;
180 currently_scrolling_layer_ = NULL;
182 render_surface_layer_list_.clear();
183 set_needs_update_draw_properties();
184 return root_layer_.Pass();
187 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
188 // The request queue should have been processed and does not require a push.
189 DCHECK_EQ(ui_resource_request_queue_.size(), 0u);
191 if (next_activation_forces_redraw_) {
192 layer_tree_host_impl_->SetFullRootLayerDamage();
193 next_activation_forces_redraw_ = false;
196 target_tree->PassSwapPromises(&swap_promise_list_);
198 target_tree->SetPageScaleFactorAndLimits(
199 page_scale_factor(), min_page_scale_factor(), max_page_scale_factor());
200 target_tree->SetPageScaleDelta(
201 target_tree->page_scale_delta() / target_tree->sent_page_scale_delta());
202 target_tree->set_sent_page_scale_delta(1);
204 if (page_scale_layer_ && inner_viewport_scroll_layer_) {
205 target_tree->SetViewportLayersFromIds(
206 page_scale_layer_->id(),
207 inner_viewport_scroll_layer_->id(),
208 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id()
209 : Layer::INVALID_ID);
211 target_tree->ClearViewportLayers();
213 // This should match the property synchronization in
214 // LayerTreeHost::finishCommitOnImplThread().
215 target_tree->set_source_frame_number(source_frame_number());
216 target_tree->set_background_color(background_color());
217 target_tree->set_has_transparent_background(has_transparent_background());
219 if (ContentsTexturesPurged())
220 target_tree->SetContentsTexturesPurged();
222 target_tree->ResetContentsTexturesPurged();
224 // Always reset this flag on activation, as we would only have activated
225 // if we were in a good state.
226 target_tree->ResetRequiresHighResToDraw();
228 if (ViewportSizeInvalid())
229 target_tree->SetViewportSizeInvalid();
231 target_tree->ResetViewportSizeInvalid();
234 target_tree->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(
235 LayerTreeHostCommon::FindLayerInSubtree(
236 target_tree->root_layer(), hud_layer()->id())));
238 target_tree->set_hud_layer(NULL);
241 LayerImpl* LayerTreeImpl::InnerViewportContainerLayer() const {
242 return inner_viewport_scroll_layer_
243 ? inner_viewport_scroll_layer_->scroll_clip_layer()
247 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const {
248 DCHECK(IsActiveTree());
249 return currently_scrolling_layer_;
252 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) {
253 if (currently_scrolling_layer_ == layer)
256 if (currently_scrolling_layer_ &&
257 currently_scrolling_layer_->scrollbar_animation_controller())
258 currently_scrolling_layer_->scrollbar_animation_controller()
259 ->DidScrollGestureEnd(CurrentFrameTimeTicks());
260 currently_scrolling_layer_ = layer;
261 if (layer && layer->scrollbar_animation_controller())
262 layer->scrollbar_animation_controller()->DidScrollGestureBegin();
265 void LayerTreeImpl::ClearCurrentlyScrollingLayer() {
266 SetCurrentlyScrollingLayer(NULL);
267 scrolling_layer_id_from_previous_tree_ = 0;
270 float LayerTreeImpl::VerticalAdjust(const int clip_layer_id) const {
271 LayerImpl* container_layer = InnerViewportContainerLayer();
272 if (!container_layer || clip_layer_id != container_layer->id())
275 return layer_tree_host_impl_->VerticalAdjust();
280 void ForceScrollbarParameterUpdateAfterScaleChange(LayerImpl* current_layer) {
284 while (current_layer) {
285 current_layer->ScrollbarParametersDidChange();
286 current_layer = current_layer->parent();
292 void LayerTreeImpl::SetPageScaleFactorAndLimits(float page_scale_factor,
293 float min_page_scale_factor, float max_page_scale_factor) {
294 if (!page_scale_factor)
297 if (min_page_scale_factor == min_page_scale_factor_ &&
298 max_page_scale_factor == max_page_scale_factor_ &&
299 page_scale_factor == page_scale_factor_)
302 min_page_scale_factor_ = min_page_scale_factor;
303 max_page_scale_factor_ = max_page_scale_factor;
304 page_scale_factor_ = page_scale_factor;
306 if (root_layer_scroll_offset_delegate_) {
307 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits(
308 total_page_scale_factor(),
309 this->min_page_scale_factor(),
310 this->max_page_scale_factor());
313 ForceScrollbarParameterUpdateAfterScaleChange(page_scale_layer());
316 void LayerTreeImpl::SetPageScaleDelta(float delta) {
317 // Clamp to the current min/max limits.
318 float total = page_scale_factor_ * delta;
319 if (min_page_scale_factor_ && total < min_page_scale_factor_)
320 delta = min_page_scale_factor_ / page_scale_factor_;
321 else if (max_page_scale_factor_ && total > max_page_scale_factor_)
322 delta = max_page_scale_factor_ / page_scale_factor_;
324 if (delta == page_scale_delta_)
327 page_scale_delta_ = delta;
329 if (IsActiveTree()) {
330 LayerTreeImpl* pending_tree = layer_tree_host_impl_->pending_tree();
332 DCHECK_EQ(1, pending_tree->sent_page_scale_delta());
333 pending_tree->SetPageScaleDelta(
334 page_scale_delta_ / sent_page_scale_delta_);
338 set_needs_update_draw_properties();
340 if (root_layer_scroll_offset_delegate_) {
341 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits(
342 total_page_scale_factor(),
343 min_page_scale_factor(),
344 max_page_scale_factor());
348 gfx::SizeF LayerTreeImpl::ScrollableViewportSize() const {
349 if (outer_viewport_scroll_layer_)
350 return layer_tree_host_impl_->UnscaledScrollableViewportSize();
352 return gfx::ScaleSize(
353 layer_tree_host_impl_->UnscaledScrollableViewportSize(),
354 1.0f / total_page_scale_factor());
357 gfx::Rect LayerTreeImpl::RootScrollLayerDeviceViewportBounds() const {
358 LayerImpl* root_scroll_layer = OuterViewportScrollLayer()
359 ? OuterViewportScrollLayer()
360 : InnerViewportScrollLayer();
361 if (!root_scroll_layer || root_scroll_layer->children().empty())
363 LayerImpl* layer = root_scroll_layer->children()[0];
364 return MathUtil::MapEnclosingClippedRect(layer->screen_space_transform(),
365 gfx::Rect(layer->content_bounds()));
368 static void ApplySentScrollDeltasFromAbortedCommitTo(LayerImpl* layer) {
369 layer->ApplySentScrollDeltasFromAbortedCommit();
372 void LayerTreeImpl::ApplySentScrollAndScaleDeltasFromAbortedCommit() {
373 DCHECK(IsActiveTree());
375 page_scale_factor_ *= sent_page_scale_delta_;
376 page_scale_delta_ /= sent_page_scale_delta_;
377 sent_page_scale_delta_ = 1.f;
382 LayerTreeHostCommon::CallFunctionForSubtree(
383 root_layer(), base::Bind(&ApplySentScrollDeltasFromAbortedCommitTo));
386 static void ApplyScrollDeltasSinceBeginMainFrameTo(LayerImpl* layer) {
387 layer->ApplyScrollDeltasSinceBeginMainFrame();
390 void LayerTreeImpl::ApplyScrollDeltasSinceBeginMainFrame() {
391 DCHECK(IsPendingTree());
395 LayerTreeHostCommon::CallFunctionForSubtree(
396 root_layer(), base::Bind(&ApplyScrollDeltasSinceBeginMainFrameTo));
399 void LayerTreeImpl::SetViewportLayersFromIds(
400 int page_scale_layer_id,
401 int inner_viewport_scroll_layer_id,
402 int outer_viewport_scroll_layer_id) {
403 page_scale_layer_ = LayerById(page_scale_layer_id);
404 DCHECK(page_scale_layer_);
406 inner_viewport_scroll_layer_ =
407 LayerById(inner_viewport_scroll_layer_id);
408 DCHECK(inner_viewport_scroll_layer_);
410 outer_viewport_scroll_layer_ =
411 LayerById(outer_viewport_scroll_layer_id);
412 DCHECK(outer_viewport_scroll_layer_ ||
413 outer_viewport_scroll_layer_id == Layer::INVALID_ID);
415 if (!root_layer_scroll_offset_delegate_)
418 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
419 new LayerScrollOffsetDelegateProxy(inner_viewport_scroll_layer_,
420 root_layer_scroll_offset_delegate_,
423 if (outer_viewport_scroll_layer_)
424 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
425 new LayerScrollOffsetDelegateProxy(outer_viewport_scroll_layer_,
426 root_layer_scroll_offset_delegate_,
430 void LayerTreeImpl::ClearViewportLayers() {
431 page_scale_layer_ = NULL;
432 inner_viewport_scroll_layer_ = NULL;
433 outer_viewport_scroll_layer_ = NULL;
436 void LayerTreeImpl::UpdateDrawProperties() {
437 needs_update_draw_properties_ = false;
438 render_surface_layer_list_.clear();
440 // For max_texture_size.
441 if (!layer_tree_host_impl_->renderer())
449 "LayerTreeImpl::UpdateDrawProperties",
453 source_frame_number_);
454 LayerImpl* page_scale_layer =
455 page_scale_layer_ ? page_scale_layer_ : InnerViewportContainerLayer();
456 bool can_render_to_separate_surface =
457 !output_surface()->ForcedDrawToSoftwareDevice();
458 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
461 layer_tree_host_impl_->DrawTransform(),
462 device_scale_factor(),
463 total_page_scale_factor(),
466 settings().can_use_lcd_text,
467 can_render_to_separate_surface,
468 settings().layer_transforms_should_scale_layer_contents,
469 &render_surface_layer_list_);
470 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
475 "LayerTreeImpl::UpdateTilePriorities",
479 source_frame_number_);
480 // LayerIterator is used here instead of CallFunctionForSubtree to only
481 // UpdateTilePriorities on layers that will be visible (and thus have valid
482 // draw properties) and not because any ordering is required.
483 typedef LayerIterator<LayerImpl> LayerIteratorType;
484 LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_);
485 for (LayerIteratorType it =
486 LayerIteratorType::Begin(&render_surface_layer_list_);
489 if (!it.represents_itself())
491 LayerImpl* layer = *it;
493 layer->UpdateTilePriorities();
494 if (layer->mask_layer())
495 layer->mask_layer()->UpdateTilePriorities();
496 if (layer->replica_layer() && layer->replica_layer()->mask_layer())
497 layer->replica_layer()->mask_layer()->UpdateTilePriorities();
501 DCHECK(!needs_update_draw_properties_) <<
502 "CalcDrawProperties should not set_needs_update_draw_properties()";
505 const LayerImplList& LayerTreeImpl::RenderSurfaceLayerList() const {
506 // If this assert triggers, then the list is dirty.
507 DCHECK(!needs_update_draw_properties_);
508 return render_surface_layer_list_;
511 gfx::Size LayerTreeImpl::ScrollableSize() const {
512 LayerImpl* root_scroll_layer = OuterViewportScrollLayer()
513 ? OuterViewportScrollLayer()
514 : InnerViewportScrollLayer();
515 if (!root_scroll_layer || root_scroll_layer->children().empty())
517 return root_scroll_layer->children()[0]->bounds();
520 LayerImpl* LayerTreeImpl::LayerById(int id) {
521 LayerIdMap::iterator iter = layer_id_map_.find(id);
522 return iter != layer_id_map_.end() ? iter->second : NULL;
525 void LayerTreeImpl::RegisterLayer(LayerImpl* layer) {
526 DCHECK(!LayerById(layer->id()));
527 layer_id_map_[layer->id()] = layer;
530 void LayerTreeImpl::UnregisterLayer(LayerImpl* layer) {
531 DCHECK(LayerById(layer->id()));
532 layer_id_map_.erase(layer->id());
535 void LayerTreeImpl::PushPersistedState(LayerTreeImpl* pending_tree) {
536 pending_tree->SetCurrentlyScrollingLayer(
537 LayerTreeHostCommon::FindLayerInSubtree(pending_tree->root_layer(),
538 currently_scrolling_layer_ ? currently_scrolling_layer_->id() : 0));
541 static void DidBecomeActiveRecursive(LayerImpl* layer) {
542 layer->DidBecomeActive();
543 for (size_t i = 0; i < layer->children().size(); ++i)
544 DidBecomeActiveRecursive(layer->children()[i]);
547 void LayerTreeImpl::DidBecomeActive() {
551 if (scrolling_layer_id_from_previous_tree_) {
552 currently_scrolling_layer_ = LayerTreeHostCommon::FindLayerInSubtree(
553 root_layer_.get(), scrolling_layer_id_from_previous_tree_);
556 DidBecomeActiveRecursive(root_layer());
559 bool LayerTreeImpl::ContentsTexturesPurged() const {
560 return contents_textures_purged_;
563 void LayerTreeImpl::SetContentsTexturesPurged() {
564 if (contents_textures_purged_)
566 contents_textures_purged_ = true;
567 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
570 void LayerTreeImpl::ResetContentsTexturesPurged() {
571 if (!contents_textures_purged_)
573 contents_textures_purged_ = false;
574 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
577 void LayerTreeImpl::SetRequiresHighResToDraw() {
578 requires_high_res_to_draw_ = true;
581 void LayerTreeImpl::ResetRequiresHighResToDraw() {
582 requires_high_res_to_draw_ = false;
585 bool LayerTreeImpl::RequiresHighResToDraw() const {
586 return requires_high_res_to_draw_;
589 bool LayerTreeImpl::ViewportSizeInvalid() const {
590 return viewport_size_invalid_;
593 void LayerTreeImpl::SetViewportSizeInvalid() {
594 viewport_size_invalid_ = true;
595 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
598 void LayerTreeImpl::ResetViewportSizeInvalid() {
599 viewport_size_invalid_ = false;
600 layer_tree_host_impl_->OnCanDrawStateChangedForTree();
603 Proxy* LayerTreeImpl::proxy() const {
604 return layer_tree_host_impl_->proxy();
607 const LayerTreeSettings& LayerTreeImpl::settings() const {
608 return layer_tree_host_impl_->settings();
611 const RendererCapabilitiesImpl& LayerTreeImpl::GetRendererCapabilities() const {
612 return layer_tree_host_impl_->GetRendererCapabilities();
615 ContextProvider* LayerTreeImpl::context_provider() const {
616 return output_surface()->context_provider();
619 OutputSurface* LayerTreeImpl::output_surface() const {
620 return layer_tree_host_impl_->output_surface();
623 ResourceProvider* LayerTreeImpl::resource_provider() const {
624 return layer_tree_host_impl_->resource_provider();
627 TileManager* LayerTreeImpl::tile_manager() const {
628 return layer_tree_host_impl_->tile_manager();
631 FrameRateCounter* LayerTreeImpl::frame_rate_counter() const {
632 return layer_tree_host_impl_->fps_counter();
635 PaintTimeCounter* LayerTreeImpl::paint_time_counter() const {
636 return layer_tree_host_impl_->paint_time_counter();
639 MemoryHistory* LayerTreeImpl::memory_history() const {
640 return layer_tree_host_impl_->memory_history();
643 bool LayerTreeImpl::device_viewport_valid_for_tile_management() const {
644 return layer_tree_host_impl_->device_viewport_valid_for_tile_management();
647 bool LayerTreeImpl::IsActiveTree() const {
648 return layer_tree_host_impl_->active_tree() == this;
651 bool LayerTreeImpl::IsPendingTree() const {
652 return layer_tree_host_impl_->pending_tree() == this;
655 bool LayerTreeImpl::IsRecycleTree() const {
656 return layer_tree_host_impl_->recycle_tree() == this;
659 LayerImpl* LayerTreeImpl::FindActiveTreeLayerById(int id) {
660 LayerTreeImpl* tree = layer_tree_host_impl_->active_tree();
663 return tree->LayerById(id);
666 LayerImpl* LayerTreeImpl::FindPendingTreeLayerById(int id) {
667 LayerTreeImpl* tree = layer_tree_host_impl_->pending_tree();
670 return tree->LayerById(id);
673 int LayerTreeImpl::MaxTextureSize() const {
674 return layer_tree_host_impl_->GetRendererCapabilities().max_texture_size;
677 bool LayerTreeImpl::PinchGestureActive() const {
678 return layer_tree_host_impl_->pinch_gesture_active();
681 base::TimeTicks LayerTreeImpl::CurrentFrameTimeTicks() const {
682 return layer_tree_host_impl_->CurrentFrameTimeTicks();
685 void LayerTreeImpl::SetNeedsCommit() {
686 layer_tree_host_impl_->SetNeedsCommit();
689 gfx::Size LayerTreeImpl::DrawViewportSize() const {
690 return layer_tree_host_impl_->DrawViewportSize();
693 void LayerTreeImpl::StartScrollbarAnimation() {
694 layer_tree_host_impl_->StartScrollbarAnimation();
697 void LayerTreeImpl::DidAnimateScrollOffset() {
698 layer_tree_host_impl_->DidAnimateScrollOffset();
701 void LayerTreeImpl::SetNeedsRedraw() {
702 layer_tree_host_impl_->SetNeedsRedraw();
705 const LayerTreeDebugState& LayerTreeImpl::debug_state() const {
706 return layer_tree_host_impl_->debug_state();
709 float LayerTreeImpl::device_scale_factor() const {
710 return layer_tree_host_impl_->device_scale_factor();
713 DebugRectHistory* LayerTreeImpl::debug_rect_history() const {
714 return layer_tree_host_impl_->debug_rect_history();
717 AnimationRegistrar* LayerTreeImpl::animationRegistrar() const {
718 return layer_tree_host_impl_->animation_registrar();
721 scoped_ptr<base::Value> LayerTreeImpl::AsValue() const {
722 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
723 TracedValue::MakeDictIntoImplicitSnapshot(
724 state.get(), "cc::LayerTreeImpl", this);
726 state->Set("root_layer", root_layer_->AsValue().release());
728 scoped_ptr<base::ListValue> render_surface_layer_list(new base::ListValue());
729 typedef LayerIterator<LayerImpl> LayerIteratorType;
730 LayerIteratorType end = LayerIteratorType::End(&render_surface_layer_list_);
731 for (LayerIteratorType it = LayerIteratorType::Begin(
732 &render_surface_layer_list_); it != end; ++it) {
733 if (!it.represents_itself())
735 render_surface_layer_list->Append(TracedValue::CreateIDRef(*it).release());
738 state->Set("render_surface_layer_list",
739 render_surface_layer_list.release());
740 return state.PassAs<base::Value>();
743 void LayerTreeImpl::SetRootLayerScrollOffsetDelegate(
744 LayerScrollOffsetDelegate* root_layer_scroll_offset_delegate) {
745 if (root_layer_scroll_offset_delegate_ == root_layer_scroll_offset_delegate)
748 if (!root_layer_scroll_offset_delegate) {
749 // Make sure we remove the proxies from their layers before
751 if (InnerViewportScrollLayer())
752 InnerViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
753 if (OuterViewportScrollLayer())
754 OuterViewportScrollLayer()->SetScrollOffsetDelegate(NULL);
755 inner_viewport_scroll_delegate_proxy_.reset();
756 outer_viewport_scroll_delegate_proxy_.reset();
759 root_layer_scroll_offset_delegate_ = root_layer_scroll_offset_delegate;
761 if (root_layer_scroll_offset_delegate_) {
762 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(
763 TotalScrollOffset());
764 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
765 TotalMaxScrollOffset());
766 root_layer_scroll_offset_delegate_->SetScrollableSize(ScrollableSize());
767 root_layer_scroll_offset_delegate_->SetTotalPageScaleFactorAndLimits(
768 total_page_scale_factor(),
769 min_page_scale_factor(),
770 max_page_scale_factor());
772 if (inner_viewport_scroll_layer_) {
773 inner_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
774 new LayerScrollOffsetDelegateProxy(InnerViewportScrollLayer(),
775 root_layer_scroll_offset_delegate_,
777 inner_viewport_scroll_layer_->SetScrollOffsetDelegate(
778 inner_viewport_scroll_delegate_proxy_.get());
781 if (outer_viewport_scroll_layer_) {
782 outer_viewport_scroll_delegate_proxy_ = make_scoped_ptr(
783 new LayerScrollOffsetDelegateProxy(OuterViewportScrollLayer(),
784 root_layer_scroll_offset_delegate_,
786 outer_viewport_scroll_layer_->SetScrollOffsetDelegate(
787 outer_viewport_scroll_delegate_proxy_.get());
792 void LayerTreeImpl::UpdateScrollOffsetDelegate() {
793 DCHECK(InnerViewportScrollLayer());
794 DCHECK(root_layer_scroll_offset_delegate_);
796 gfx::Vector2dF offset =
797 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
799 if (OuterViewportScrollLayer())
800 offset += outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
802 root_layer_scroll_offset_delegate_->SetTotalScrollOffset(offset);
803 root_layer_scroll_offset_delegate_->SetMaxScrollOffset(
804 TotalMaxScrollOffset());
807 gfx::Vector2dF LayerTreeImpl::GetDelegatedScrollOffset(LayerImpl* layer) {
808 DCHECK(root_layer_scroll_offset_delegate_);
809 DCHECK(InnerViewportScrollLayer());
810 if (layer == InnerViewportScrollLayer() && !OuterViewportScrollLayer())
811 return root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
813 // If we get here, we have both inner/outer viewports, and need to distribute
814 // the scroll offset between them.
815 DCHECK(inner_viewport_scroll_delegate_proxy_);
816 DCHECK(outer_viewport_scroll_delegate_proxy_);
817 gfx::Vector2dF inner_viewport_offset =
818 inner_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
819 gfx::Vector2dF outer_viewport_offset =
820 outer_viewport_scroll_delegate_proxy_->last_set_scroll_offset();
822 // It may be nothing has changed.
823 gfx::Vector2dF delegate_offset =
824 root_layer_scroll_offset_delegate_->GetTotalScrollOffset();
825 if (inner_viewport_offset + outer_viewport_offset == delegate_offset) {
826 if (layer == InnerViewportScrollLayer())
827 return inner_viewport_offset;
829 return outer_viewport_offset;
832 gfx::Vector2d max_outer_viewport_scroll_offset =
833 OuterViewportScrollLayer()->MaxScrollOffset();
835 outer_viewport_offset = delegate_offset - inner_viewport_offset;
836 outer_viewport_offset.SetToMin(max_outer_viewport_scroll_offset);
837 outer_viewport_offset.SetToMax(gfx::Vector2d());
839 if (layer == OuterViewportScrollLayer())
840 return outer_viewport_offset;
842 inner_viewport_offset = delegate_offset - outer_viewport_offset;
844 return inner_viewport_offset;
847 void LayerTreeImpl::QueueSwapPromise(scoped_ptr<SwapPromise> swap_promise) {
848 DCHECK(swap_promise);
849 if (swap_promise_list_.size() > kMaxQueuedSwapPromiseNumber)
850 BreakSwapPromises(SwapPromise::SWAP_PROMISE_LIST_OVERFLOW);
851 swap_promise_list_.push_back(swap_promise.Pass());
854 void LayerTreeImpl::PassSwapPromises(
855 ScopedPtrVector<SwapPromise>* new_swap_promise) {
856 swap_promise_list_.insert_and_take(swap_promise_list_.end(),
858 new_swap_promise->clear();
861 void LayerTreeImpl::FinishSwapPromises(CompositorFrameMetadata* metadata) {
862 for (size_t i = 0; i < swap_promise_list_.size(); i++)
863 swap_promise_list_[i]->DidSwap(metadata);
864 swap_promise_list_.clear();
867 void LayerTreeImpl::BreakSwapPromises(SwapPromise::DidNotSwapReason reason) {
868 for (size_t i = 0; i < swap_promise_list_.size(); i++)
869 swap_promise_list_[i]->DidNotSwap(reason);
870 swap_promise_list_.clear();
873 void LayerTreeImpl::DidModifyTilePriorities() {
874 layer_tree_host_impl_->DidModifyTilePriorities();
877 void LayerTreeImpl::set_ui_resource_request_queue(
878 const UIResourceRequestQueue& queue) {
879 ui_resource_request_queue_ = queue;
882 ResourceProvider::ResourceId LayerTreeImpl::ResourceIdForUIResource(
883 UIResourceId uid) const {
884 return layer_tree_host_impl_->ResourceIdForUIResource(uid);
887 bool LayerTreeImpl::IsUIResourceOpaque(UIResourceId uid) const {
888 return layer_tree_host_impl_->IsUIResourceOpaque(uid);
891 void LayerTreeImpl::ProcessUIResourceRequestQueue() {
892 while (ui_resource_request_queue_.size() > 0) {
893 UIResourceRequest req = ui_resource_request_queue_.front();
894 ui_resource_request_queue_.pop_front();
896 switch (req.GetType()) {
897 case UIResourceRequest::UIResourceCreate:
898 layer_tree_host_impl_->CreateUIResource(req.GetId(), req.GetBitmap());
900 case UIResourceRequest::UIResourceDelete:
901 layer_tree_host_impl_->DeleteUIResource(req.GetId());
903 case UIResourceRequest::UIResourceInvalidRequest:
909 // If all UI resource evictions were not recreated by processing this queue,
910 // then another commit is required.
911 if (layer_tree_host_impl_->EvictedUIResourcesExist())
912 layer_tree_host_impl_->SetNeedsCommit();
915 void LayerTreeImpl::AddLayerWithCopyOutputRequest(LayerImpl* layer) {
916 // Only the active tree needs to know about layers with copy requests, as
917 // they are aborted if not serviced during draw.
918 DCHECK(IsActiveTree());
920 // DCHECK(std::find(layers_with_copy_output_request_.begin(),
921 // layers_with_copy_output_request_.end(),
922 // layer) == layers_with_copy_output_request_.end());
923 // TODO(danakj): Remove this once crash is found crbug.com/309777
924 for (size_t i = 0; i < layers_with_copy_output_request_.size(); ++i) {
925 CHECK(layers_with_copy_output_request_[i] != layer)
926 << i << " of " << layers_with_copy_output_request_.size();
928 layers_with_copy_output_request_.push_back(layer);
931 void LayerTreeImpl::RemoveLayerWithCopyOutputRequest(LayerImpl* layer) {
932 // Only the active tree needs to know about layers with copy requests, as
933 // they are aborted if not serviced during draw.
934 DCHECK(IsActiveTree());
936 std::vector<LayerImpl*>::iterator it = std::find(
937 layers_with_copy_output_request_.begin(),
938 layers_with_copy_output_request_.end(),
940 DCHECK(it != layers_with_copy_output_request_.end());
941 layers_with_copy_output_request_.erase(it);
943 // TODO(danakj): Remove this once crash is found crbug.com/309777
944 for (size_t i = 0; i < layers_with_copy_output_request_.size(); ++i) {
945 CHECK(layers_with_copy_output_request_[i] != layer)
946 << i << " of " << layers_with_copy_output_request_.size();
950 const std::vector<LayerImpl*>& LayerTreeImpl::LayersWithCopyOutputRequest()
952 // Only the active tree needs to know about layers with copy requests, as
953 // they are aborted if not serviced during draw.
954 DCHECK(IsActiveTree());
956 return layers_with_copy_output_request_;