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

Unified Diff: cc/layers/layer.cc

Issue 1088773003: Reuse property trees (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: no more first tick nonsense. Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: cc/layers/layer.cc
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 938449cb968e2e57ac3e792c1c4d9d6ddd1c548b..2acf5f0dbdc865f49c03806482fbfe7f709eb868 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -118,6 +118,9 @@ void Layer::SetLayerTreeHost(LayerTreeHost* host) {
if (layer_tree_host_ == host)
return;
+ if (layer_tree_host_)
+ layer_tree_host_->property_trees()->needs_rebuild = true;
+
layer_tree_host_ = host;
// When changing hosts, the layer needs to commit its properties to the impl
@@ -154,6 +157,19 @@ void Layer::SetNeedsCommit() {
return;
SetNeedsPushProperties();
+ layer_tree_host_->property_trees()->needs_rebuild = true;
+
+ if (ignore_set_needs_commit_)
+ return;
+
+ layer_tree_host_->SetNeedsCommit();
+}
+
+void Layer::SetNeedsCommitNoRebuild() {
+ if (!layer_tree_host_)
+ return;
+
+ SetNeedsPushProperties();
if (ignore_set_needs_commit_)
return;
@@ -165,6 +181,7 @@ void Layer::SetNeedsFullTreeSync() {
if (!layer_tree_host_)
return;
+ layer_tree_host_->property_trees()->needs_rebuild = true;
ajuma 2015/04/16 14:52:14 LayerTreeHost::SetNeedsFullTreeSync will trigger a
enne (OOO) 2015/04/16 21:49:33 That's kind of subtle to skip it. I think I'd pre
layer_tree_host_->SetNeedsFullTreeSync();
}
@@ -335,8 +352,20 @@ void Layer::SetBounds(const gfx::Size& size) {
DCHECK(IsPropertyChangeAllowed());
if (bounds() == size)
return;
-
bounds_ = size;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (ClipNode* clip_node = layer_tree_host_->property_trees()->clip_tree.Node(
+ clip_tree_index())) {
+ if (clip_node->owner_id == id()) {
+ clip_node->data.clip.set_size(size);
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
ajuma 2015/04/16 14:52:14 In what situations will changing bounds change whe
Ian Vollick 2015/04/17 14:56:22 None! I've gotten rid of the early out and we now
}
@@ -577,6 +606,22 @@ void Layer::SetPosition(const gfx::PointF& position) {
if (position_ == position)
return;
position_ = position;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.update_post_local_transform(position,
+ transform_origin());
+ transform_node->data.needs_local_transform_update = true;
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
ajuma 2015/04/16 14:52:13 Can setting position change whether a transform no
Ian Vollick 2015/04/17 14:56:22 The latter, yeah.
}
@@ -594,6 +639,21 @@ void Layer::SetTransform(const gfx::Transform& transform) {
return;
transform_ = transform;
transform_is_invertible_ = transform.IsInvertible();
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.local = transform;
+ transform_node->data.needs_local_transform_update = true;
ajuma 2015/04/16 14:52:14 Could changing a transform's value affect whether
Ian Vollick 2015/04/17 14:56:22 Yeah, it could. I've updated this code to check fo
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
ajuma 2015/04/16 14:52:14 As a future optimization (not in this CL), we coul
ajuma 2015/04/16 14:55:04 Actually, I take this back; a 2d translation would
Ian Vollick 2015/04/17 14:56:22 We've talked about the offset_to_transform_parent
}
@@ -602,6 +662,22 @@ void Layer::SetTransformOrigin(const gfx::Point3F& transform_origin) {
if (transform_origin_ == transform_origin)
return;
transform_origin_ = transform_origin;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.update_post_local_transform(position(),
+ transform_origin);
+ transform_node->data.needs_local_transform_update = true;
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
}
@@ -679,6 +755,22 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
if (scroll_offset_ == scroll_offset)
return;
scroll_offset_ = scroll_offset;
+
+ if (!layer_tree_host_)
+ return;
+
+ if (TransformNode* transform_node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.scroll_offset =
+ gfx::ScrollOffsetToVector2dF(CurrentScrollOffset());
+ transform_node->data.needs_local_transform_update = true;
+ SetNeedsCommitNoRebuild();
+ return;
+ }
+ }
+
SetNeedsCommit();
}
@@ -694,8 +786,8 @@ gfx::Vector2dF Layer::ScrollCompensationAdjustment() const {
return scroll_compensation_adjustment_;
}
-void Layer::SetScrollOffsetFromImplSide(
- const gfx::ScrollOffset& scroll_offset) {
+void Layer::SetScrollOffsetFromImplSide(const gfx::ScrollOffset& scroll_offset,
+ LayerTreeHost* host) {
ajuma 2015/04/16 14:52:14 Will this ever get called with a |host| that's not
Ian Vollick 2015/04/17 14:56:22 Nope. Removed.
DCHECK(IsPropertyChangeAllowed());
// This function only gets called during a BeginMainFrame, so there
// is no need to call SetNeedsUpdate here.
@@ -704,6 +796,21 @@ void Layer::SetScrollOffsetFromImplSide(
return;
scroll_offset_ = scroll_offset;
SetNeedsPushProperties();
+
+ bool needs_rebuild = true;
+ if (TransformNode* transform_node =
+ host->property_trees()->transform_tree.Node(transform_tree_index())) {
+ if (transform_node->owner_id == id()) {
+ transform_node->data.scroll_offset =
+ gfx::ScrollOffsetToVector2dF(CurrentScrollOffset());
+ transform_node->data.needs_local_transform_update = true;
+ needs_rebuild = false;
+ }
+ }
+
+ if (needs_rebuild)
+ host->property_trees()->needs_rebuild = true;
+
if (!did_scroll_callback_.is_null())
did_scroll_callback_.Run();
// The callback could potentially change the layer structure:
@@ -1019,6 +1126,8 @@ void Layer::PushPropertiesTo(LayerImpl* layer) {
base::Passed(&original_request)));
main_thread_copy_requests.push_back(main_thread_request.Pass());
}
+ if (!copy_requests_.empty() && layer_tree_host_)
+ layer_tree_host_->property_trees()->needs_rebuild = true;
copy_requests_.clear();
layer->PassCopyRequests(&main_thread_copy_requests);
@@ -1157,6 +1266,14 @@ void Layer::OnFilterAnimated(const FilterOperations& filters) {
void Layer::OnOpacityAnimated(float opacity) {
opacity_ = opacity;
+ if (layer_tree_host_) {
+ if (OpacityNode* node =
+ layer_tree_host_->property_trees()->opacity_tree.Node(
+ opacity_tree_index_)) {
+ if (node->owner_id == id())
+ node->data = opacity;
+ }
+ }
}
void Layer::OnTransformAnimated(const gfx::Transform& transform) {
@@ -1164,6 +1281,17 @@ void Layer::OnTransformAnimated(const gfx::Transform& transform) {
return;
transform_ = transform;
transform_is_invertible_ = transform.IsInvertible();
+ if (layer_tree_host_) {
+ if (TransformNode* node =
+ layer_tree_host_->property_trees()->transform_tree.Node(
+ transform_tree_index_)) {
+ if (node->owner_id == id()) {
+ node->data.local = transform;
+ node->data.needs_local_transform_update = true;
+ node->data.is_animated = true;
+ }
+ }
+ }
}
void Layer::OnScrollOffsetAnimated(const gfx::ScrollOffset& scroll_offset) {

Powered by Google App Engine
This is Rietveld 408576698