Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(543)

Side by Side Diff: cc/layers/layer.cc

Issue 1010663002: CC Animations: Redirect all compositor animation requests to AnimationHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@introduce
Patch Set: Rebase and fix conflicts (HasPotentiallyRunningTransformAnimation) Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/layers/layer.h ('k') | cc/layers/layer_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/layer.h" 5 #include "cc/layers/layer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/atomic_sequence_num.h" 9 #include "base/atomic_sequence_num.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 mask_layer_->SetLayerTreeHost(host); 136 mask_layer_->SetLayerTreeHost(host);
137 if (replica_layer_.get()) 137 if (replica_layer_.get())
138 replica_layer_->SetLayerTreeHost(host); 138 replica_layer_->SetLayerTreeHost(host);
139 139
140 if (host) { 140 if (host) {
141 RegisterForAnimations(host->animation_registrar(), host->settings()); 141 RegisterForAnimations(host->animation_registrar(), host->settings());
142 if (host->settings().layer_transforms_should_scale_layer_contents) 142 if (host->settings().layer_transforms_should_scale_layer_contents)
143 reset_raster_scale_to_unknown(); 143 reset_raster_scale_to_unknown();
144 } 144 }
145 145
146 if (host && layer_animation_controller_->has_any_animation()) 146 bool has_any_animation = false;
147 if (layer_animation_controller_)
148 has_any_animation = layer_animation_controller_->has_any_animation();
149 else if (layer_tree_host_)
150 has_any_animation = layer_tree_host_->HasAnyAnimation(this);
151
152 if (host && has_any_animation)
147 host->SetNeedsCommit(); 153 host->SetNeedsCommit();
148 } 154 }
149 155
150 void Layer::SetNeedsUpdate() { 156 void Layer::SetNeedsUpdate() {
151 if (layer_tree_host_ && !ignore_set_needs_commit_) 157 if (layer_tree_host_ && !ignore_set_needs_commit_)
152 layer_tree_host_->SetNeedsUpdateLayers(); 158 layer_tree_host_->SetNeedsUpdateLayers();
153 } 159 }
154 160
155 void Layer::SetNeedsCommit() { 161 void Layer::SetNeedsCommit() {
156 if (!layer_tree_host_) 162 if (!layer_tree_host_)
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 506
501 void Layer::SetFilters(const FilterOperations& filters) { 507 void Layer::SetFilters(const FilterOperations& filters) {
502 DCHECK(IsPropertyChangeAllowed()); 508 DCHECK(IsPropertyChangeAllowed());
503 if (filters_ == filters) 509 if (filters_ == filters)
504 return; 510 return;
505 filters_ = filters; 511 filters_ = filters;
506 SetNeedsCommit(); 512 SetNeedsCommit();
507 } 513 }
508 514
509 bool Layer::FilterIsAnimating() const { 515 bool Layer::FilterIsAnimating() const {
510 return layer_animation_controller_->IsAnimatingProperty(Animation::FILTER); 516 DCHECK(layer_tree_host_);
517 return layer_animation_controller_
518 ? layer_animation_controller_->IsAnimatingProperty(
519 Animation::FILTER)
520 : layer_tree_host_->IsAnimatingFilterProperty(this);
511 } 521 }
512 522
513 void Layer::SetBackgroundFilters(const FilterOperations& filters) { 523 void Layer::SetBackgroundFilters(const FilterOperations& filters) {
514 DCHECK(IsPropertyChangeAllowed()); 524 DCHECK(IsPropertyChangeAllowed());
515 if (background_filters_ == filters) 525 if (background_filters_ == filters)
516 return; 526 return;
517 background_filters_ = filters; 527 background_filters_ = filters;
518 SetNeedsCommit(); 528 SetNeedsCommit();
519 } 529 }
520 530
521 void Layer::SetOpacity(float opacity) { 531 void Layer::SetOpacity(float opacity) {
522 DCHECK(IsPropertyChangeAllowed()); 532 DCHECK(IsPropertyChangeAllowed());
523 if (opacity_ == opacity) 533 if (opacity_ == opacity)
524 return; 534 return;
525 opacity_ = opacity; 535 opacity_ = opacity;
526 SetNeedsCommit(); 536 SetNeedsCommit();
527 } 537 }
528 538
529 bool Layer::OpacityIsAnimating() const { 539 bool Layer::OpacityIsAnimating() const {
530 return layer_animation_controller_->IsAnimatingProperty(Animation::OPACITY); 540 DCHECK(layer_tree_host_);
541 return layer_animation_controller_
542 ? layer_animation_controller_->IsAnimatingProperty(
543 Animation::OPACITY)
544 : layer_tree_host_->IsAnimatingOpacityProperty(this);
545 }
546
547 bool Layer::HasPotentiallyRunningOpacityAnimation() const {
548 if (layer_animation_controller_) {
549 if (Animation* animation =
550 layer_animation_controller()->GetAnimation(Animation::OPACITY)) {
551 return !animation->is_finished();
552 }
553 return false;
554 } else {
555 DCHECK(layer_tree_host_);
556 return layer_tree_host_->HasPotentiallyRunningOpacityAnimation(this);
557 }
531 } 558 }
532 559
533 bool Layer::OpacityCanAnimateOnImplThread() const { 560 bool Layer::OpacityCanAnimateOnImplThread() const {
534 return false; 561 return false;
535 } 562 }
536 563
537 void Layer::SetBlendMode(SkXfermode::Mode blend_mode) { 564 void Layer::SetBlendMode(SkXfermode::Mode blend_mode) {
538 DCHECK(IsPropertyChangeAllowed()); 565 DCHECK(IsPropertyChangeAllowed());
539 if (blend_mode_ == blend_mode) 566 if (blend_mode_ == blend_mode)
540 return; 567 return;
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); 731 layer_tree_host_->property_trees()->transform_tree.set_needs_update(true);
705 SetNeedsCommitNoRebuild(); 732 SetNeedsCommitNoRebuild();
706 return; 733 return;
707 } 734 }
708 } 735 }
709 736
710 SetNeedsCommit(); 737 SetNeedsCommit();
711 } 738 }
712 739
713 bool Layer::AnimationsPreserveAxisAlignment() const { 740 bool Layer::AnimationsPreserveAxisAlignment() const {
714 return layer_animation_controller_->AnimationsPreserveAxisAlignment(); 741 DCHECK(layer_tree_host_);
742 return layer_animation_controller_
743 ? layer_animation_controller_->AnimationsPreserveAxisAlignment()
744 : layer_tree_host_->AnimationsPreserveAxisAlignment(this);
715 } 745 }
716 746
717 bool Layer::TransformIsAnimating() const { 747 bool Layer::TransformIsAnimating() const {
718 return layer_animation_controller_->IsAnimatingProperty(Animation::TRANSFORM); 748 DCHECK(layer_tree_host_);
749 return layer_animation_controller_
750 ? layer_animation_controller_->IsAnimatingProperty(
751 Animation::TRANSFORM)
752 : layer_tree_host_->IsAnimatingTransformProperty(this);
753 }
754
755 bool Layer::HasPotentiallyRunningTransformAnimation() const {
756 if (layer_animation_controller_) {
757 if (Animation* animation =
758 layer_animation_controller()->GetAnimation(Animation::TRANSFORM)) {
759 return !animation->is_finished();
760 }
761 return false;
762 } else {
763 DCHECK(layer_tree_host_);
764 return layer_tree_host_->HasPotentiallyRunningTransformAnimation(this);
765 }
766 }
767
768 bool Layer::ScrollOffsetAnimationWasInterrupted() const {
769 DCHECK(layer_tree_host_);
770 return layer_animation_controller_
771 ? layer_animation_controller_
772 ->scroll_offset_animation_was_interrupted()
773 : layer_tree_host_->ScrollOffsetAnimationWasInterrupted(this);
719 } 774 }
720 775
721 void Layer::SetScrollParent(Layer* parent) { 776 void Layer::SetScrollParent(Layer* parent) {
722 DCHECK(IsPropertyChangeAllowed()); 777 DCHECK(IsPropertyChangeAllowed());
723 if (scroll_parent_ == parent) 778 if (scroll_parent_ == parent)
724 return; 779 return;
725 780
726 if (scroll_parent_) 781 if (scroll_parent_)
727 scroll_parent_->RemoveScrollChild(this); 782 scroll_parent_->RemoveScrollChild(this);
728 783
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 } 1189 }
1135 layer->SetClipChildren(clip_children); 1190 layer->SetClipChildren(clip_children);
1136 } else { 1191 } else {
1137 layer->SetClipChildren(nullptr); 1192 layer->SetClipChildren(nullptr);
1138 } 1193 }
1139 1194
1140 // When a scroll offset animation is interrupted the new scroll position on 1195 // When a scroll offset animation is interrupted the new scroll position on
1141 // the pending tree will clobber any impl-side scrolling occuring on the 1196 // the pending tree will clobber any impl-side scrolling occuring on the
1142 // active tree. To do so, avoid scrolling the pending tree along with it 1197 // active tree. To do so, avoid scrolling the pending tree along with it
1143 // instead of trying to undo that scrolling later. 1198 // instead of trying to undo that scrolling later.
1144 if (layer_animation_controller_->scroll_offset_animation_was_interrupted()) 1199 if (ScrollOffsetAnimationWasInterrupted())
1145 layer->PushScrollOffsetFromMainThreadAndClobberActiveValue(scroll_offset_); 1200 layer->PushScrollOffsetFromMainThreadAndClobberActiveValue(scroll_offset_);
1146 else 1201 else
1147 layer->PushScrollOffsetFromMainThread(scroll_offset_); 1202 layer->PushScrollOffsetFromMainThread(scroll_offset_);
1148 layer->SetScrollCompensationAdjustment(ScrollCompensationAdjustment()); 1203 layer->SetScrollCompensationAdjustment(ScrollCompensationAdjustment());
1149 1204
1150 // Wrap the copy_requests_ in a PostTask to the main thread. 1205 // Wrap the copy_requests_ in a PostTask to the main thread.
1151 ScopedPtrVector<CopyOutputRequest> main_thread_copy_requests; 1206 ScopedPtrVector<CopyOutputRequest> main_thread_copy_requests;
1152 for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin(); 1207 for (ScopedPtrVector<CopyOutputRequest>::iterator it = copy_requests_.begin();
1153 it != copy_requests_.end(); 1208 it != copy_requests_.end();
1154 ++it) { 1209 ++it) {
(...skipping 16 matching lines...) Expand all
1171 1226
1172 // If the main thread commits multiple times before the impl thread actually 1227 // If the main thread commits multiple times before the impl thread actually
1173 // draws, then damage tracking will become incorrect if we simply clobber the 1228 // draws, then damage tracking will become incorrect if we simply clobber the
1174 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e. 1229 // update_rect here. The LayerImpl's update_rect needs to accumulate (i.e.
1175 // union) any update changes that have occurred on the main thread. 1230 // union) any update changes that have occurred on the main thread.
1176 update_rect_.Union(layer->update_rect()); 1231 update_rect_.Union(layer->update_rect());
1177 layer->SetUpdateRect(update_rect_); 1232 layer->SetUpdateRect(update_rect_);
1178 1233
1179 layer->SetStackingOrderChanged(stacking_order_changed_); 1234 layer->SetStackingOrderChanged(stacking_order_changed_);
1180 1235
1181 layer_animation_controller_->PushAnimationUpdatesTo( 1236 if (layer->layer_animation_controller() && layer_animation_controller_)
1182 layer->layer_animation_controller()); 1237 layer_animation_controller_->PushAnimationUpdatesTo(
1238 layer->layer_animation_controller());
1183 1239
1184 if (frame_timing_requests_dirty_) { 1240 if (frame_timing_requests_dirty_) {
1185 layer->PassFrameTimingRequests(&frame_timing_requests_); 1241 layer->PassFrameTimingRequests(&frame_timing_requests_);
1186 frame_timing_requests_dirty_ = false; 1242 frame_timing_requests_dirty_ = false;
1187 } 1243 }
1188 1244
1189 // Reset any state that should be cleared for the next update. 1245 // Reset any state that should be cleared for the next update.
1190 stacking_order_changed_ = false; 1246 stacking_order_changed_ = false;
1191 update_rect_ = gfx::Rect(); 1247 update_rect_ = gfx::Rect();
1192 1248
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
1360 return false; 1416 return false;
1361 1417
1362 UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer", 1418 UMA_HISTOGRAM_BOOLEAN("Renderer.AnimationAddedToOrphanLayer",
1363 !layer_tree_host_); 1419 !layer_tree_host_);
1364 layer_animation_controller_->AddAnimation(animation.Pass()); 1420 layer_animation_controller_->AddAnimation(animation.Pass());
1365 SetNeedsCommit(); 1421 SetNeedsCommit();
1366 return true; 1422 return true;
1367 } 1423 }
1368 1424
1369 void Layer::PauseAnimation(int animation_id, double time_offset) { 1425 void Layer::PauseAnimation(int animation_id, double time_offset) {
1426 DCHECK(layer_animation_controller_);
1370 layer_animation_controller_->PauseAnimation( 1427 layer_animation_controller_->PauseAnimation(
1371 animation_id, base::TimeDelta::FromSecondsD(time_offset)); 1428 animation_id, base::TimeDelta::FromSecondsD(time_offset));
1372 SetNeedsCommit(); 1429 SetNeedsCommit();
1373 } 1430 }
1374 1431
1375 void Layer::RemoveAnimation(int animation_id) { 1432 void Layer::RemoveAnimation(int animation_id) {
1433 DCHECK(layer_animation_controller_);
1376 layer_animation_controller_->RemoveAnimation(animation_id); 1434 layer_animation_controller_->RemoveAnimation(animation_id);
1377 SetNeedsCommit(); 1435 SetNeedsCommit();
1378 } 1436 }
1379 1437
1380 void Layer::RemoveAnimation(int animation_id, 1438 void Layer::RemoveAnimation(int animation_id,
1381 Animation::TargetProperty property) { 1439 Animation::TargetProperty property) {
1440 DCHECK(layer_animation_controller_);
1382 layer_animation_controller_->RemoveAnimation(animation_id, property); 1441 layer_animation_controller_->RemoveAnimation(animation_id, property);
1383 SetNeedsCommit(); 1442 SetNeedsCommit();
1384 } 1443 }
1385 1444
1386 void Layer::SetLayerAnimationControllerForTest( 1445 void Layer::SetLayerAnimationControllerForTest(
1387 scoped_refptr<LayerAnimationController> controller) { 1446 scoped_refptr<LayerAnimationController> controller) {
1447 DCHECK(layer_animation_controller_);
1388 layer_animation_controller_->RemoveValueObserver(this); 1448 layer_animation_controller_->RemoveValueObserver(this);
1389 layer_animation_controller_ = controller; 1449 layer_animation_controller_ = controller;
1390 layer_animation_controller_->AddValueObserver(this); 1450 layer_animation_controller_->AddValueObserver(this);
1391 SetNeedsCommit(); 1451 SetNeedsCommit();
1392 } 1452 }
1393 1453
1394 bool Layer::HasActiveAnimation() const { 1454 bool Layer::HasActiveAnimation() const {
1395 return layer_animation_controller_->HasActiveAnimation(); 1455 DCHECK(layer_tree_host_);
1456 return layer_animation_controller_
1457 ? layer_animation_controller_->HasActiveAnimation()
1458 : layer_tree_host_->HasActiveAnimation(this);
1396 } 1459 }
1397 1460
1398 void Layer::RegisterForAnimations(AnimationRegistrar* registrar, 1461 void Layer::RegisterForAnimations(AnimationRegistrar* registrar,
1399 const LayerTreeSettings& settings) { 1462 const LayerTreeSettings& settings) {
1400 if (!layer_animation_controller_) { 1463 if (!settings.use_compositor_animation_timelines &&
1464 !layer_animation_controller_) {
1401 layer_animation_controller_ = LayerAnimationController::Create(layer_id_); 1465 layer_animation_controller_ = LayerAnimationController::Create(layer_id_);
1402 layer_animation_controller_->AddValueObserver(this); 1466 layer_animation_controller_->AddValueObserver(this);
1403 layer_animation_controller_->set_value_provider(this); 1467 layer_animation_controller_->set_value_provider(this);
1404 } 1468 }
1405 1469
1406 layer_animation_controller_->SetAnimationRegistrar(registrar); 1470 if (layer_animation_controller_)
1471 layer_animation_controller_->SetAnimationRegistrar(registrar);
1407 } 1472 }
1408 1473
1409 void Layer::AddLayerAnimationEventObserver( 1474 void Layer::AddLayerAnimationEventObserver(
1410 LayerAnimationEventObserver* animation_observer) { 1475 LayerAnimationEventObserver* animation_observer) {
1411 DCHECK(layer_animation_controller_); 1476 DCHECK(layer_animation_controller_);
1412 layer_animation_controller_->AddEventObserver(animation_observer); 1477 layer_animation_controller_->AddEventObserver(animation_observer);
1413 } 1478 }
1414 1479
1415 void Layer::RemoveLayerAnimationEventObserver( 1480 void Layer::RemoveLayerAnimationEventObserver(
1416 LayerAnimationEventObserver* animation_observer) { 1481 LayerAnimationEventObserver* animation_observer) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1482 1547
1483 void Layer::DidBeginTracing() { 1548 void Layer::DidBeginTracing() {
1484 // We'll be dumping layer trees as part of trace, so make sure 1549 // We'll be dumping layer trees as part of trace, so make sure
1485 // PushPropertiesTo() propagates layer debug info to the impl 1550 // PushPropertiesTo() propagates layer debug info to the impl
1486 // side -- otherwise this won't happen for the the layers that 1551 // side -- otherwise this won't happen for the the layers that
1487 // remain unchanged since tracing started. 1552 // remain unchanged since tracing started.
1488 SetNeedsPushProperties(); 1553 SetNeedsPushProperties();
1489 } 1554 }
1490 1555
1491 } // namespace cc 1556 } // namespace cc
OLDNEW
« no previous file with comments | « cc/layers/layer.h ('k') | cc/layers/layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698