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

Unified Diff: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp

Issue 2503193002: [SPv2] Refactor PaintArtifactorCompositor root node creation (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
index af8e61be5658f630005182a97ce6acdc5be2d2b4..3ff56b2c1667d58a2a10b899ad302369a2aeb73a 100644
--- a/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
+++ b/third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositor.cpp
@@ -269,52 +269,13 @@ scoped_refptr<cc::Layer> foreignLayerForPaintChunk(
return layer;
}
+constexpr int kInvalidNodeId = -1;
// cc's property trees use 0 for the root node (always non-null).
constexpr int kRealRootNodeId = 0;
// cc allocates special nodes for root effects such as the device scale.
constexpr int kSecondaryRootNodeId = 1;
constexpr int kPropertyTreeSequenceNumber = 1;
-// Creates a minimal set of property trees for the compositor.
-void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId) {
- // cc is hardcoded to use transform node index 1 for device scale and
- // transform.
- cc::TransformTree& transformTree = propertyTrees->transform_tree;
- transformTree.clear();
- cc::TransformNode& transformNode = *transformTree.Node(
- transformTree.Insert(cc::TransformNode(), kRealRootNodeId));
- DCHECK_EQ(transformNode.id, kSecondaryRootNodeId);
- transformNode.source_node_id = transformNode.parent_id;
- transformTree.SetTargetId(transformNode.id, kRealRootNodeId);
- transformTree.SetContentTargetId(transformNode.id, kRealRootNodeId);
-
- // cc is hardcoded to use clip node index 1 for viewport clip.
- cc::ClipTree& clipTree = propertyTrees->clip_tree;
- clipTree.clear();
- cc::ClipNode& clipNode =
- *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId));
- DCHECK_EQ(clipNode.id, kSecondaryRootNodeId);
- clipNode.owner_id = ownerId;
-
- // cc is hardcoded to use effect node index 1 for root render surface.
- cc::EffectTree& effectTree = propertyTrees->effect_tree;
- effectTree.clear();
- cc::EffectNode& effectNode =
- *effectTree.Node(effectTree.Insert(cc::EffectNode(), kRealRootNodeId));
- DCHECK_EQ(effectNode.id, kSecondaryRootNodeId);
- effectNode.owner_id = ownerId;
- effectNode.clip_id = clipNode.id;
- effectNode.has_render_surface = true;
-
- cc::ScrollTree& scrollTree = propertyTrees->scroll_tree;
- scrollTree.clear();
- cc::ScrollNode& scrollNode =
- *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId));
- DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId);
- scrollNode.owner_id = ownerId;
- scrollNode.transform_id = kRealRootNodeId;
-}
-
} // namespace
std::unique_ptr<PaintArtifactCompositor::ContentLayerClientImpl>
@@ -394,16 +355,17 @@ class PropertyTreeManager {
PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer)
: m_propertyTrees(propertyTrees),
m_rootLayer(rootLayer)
-#if DCHECK_IS_ON()
- ,
- m_isFirstEffectEver(true)
-#endif
{
- m_effectStack.append(BlinkEffectAndCcIdPair{nullptr, kSecondaryRootNodeId});
+ setupRootTransformNode();
+ setupRootClipNode();
+ setupRootEffectNode();
+ setupRootScrollNode();
}
- // TODO(pdr): This will need to be unified with how viewport scale works.
- void setDeviceScaleFactor(float);
+ void setupRootTransformNode();
+ void setupRootClipNode();
+ void setupRootEffectNode();
+ void setupRootScrollNode();
int compositorIdForTransformNode(const TransformPaintPropertyNode*);
int compositorIdForClipNode(const ClipPaintPropertyNode*);
@@ -448,26 +410,92 @@ class PropertyTreeManager {
#if DCHECK_IS_ON()
HashSet<const EffectPaintPropertyNode*> m_effectNodesConverted;
- bool m_isFirstEffectEver;
#endif
};
-void PropertyTreeManager::setDeviceScaleFactor(float deviceScaleFactor) {
+void PropertyTreeManager::setupRootTransformNode() {
+ // cc is hardcoded to use transform node index 1 for device scale and
+ // transform.
+ cc::TransformTree& transformTree = m_propertyTrees.transform_tree;
+ transformTree.clear();
+ cc::TransformNode& transformNode = *transformTree.Node(
+ transformTree.Insert(cc::TransformNode(), kRealRootNodeId));
+ DCHECK_EQ(transformNode.id, kSecondaryRootNodeId);
+ transformNode.source_node_id = transformNode.parent_id;
+ transformTree.SetTargetId(transformNode.id, kRealRootNodeId);
+ transformTree.SetContentTargetId(transformNode.id, kRealRootNodeId);
+
// TODO(jaydasika): We shouldn't set ToScreeen and FromScreen of root
// transform node here. They should be set while updating transform tree in
// cc.
+ float deviceScaleFactor = m_rootLayer->GetLayerTree()->device_scale_factor();
gfx::Transform toScreen;
toScreen.Scale(deviceScaleFactor, deviceScaleFactor);
- transformTree().SetToScreen(kRealRootNodeId, toScreen);
+ transformTree.SetToScreen(kRealRootNodeId, toScreen);
gfx::Transform fromScreen;
bool invertible = toScreen.GetInverse(&fromScreen);
DCHECK(invertible);
- transformTree().SetFromScreen(kRealRootNodeId, fromScreen);
- transformTree().set_needs_update(true);
+ transformTree.SetFromScreen(kRealRootNodeId, fromScreen);
+ transformTree.set_needs_update(true);
+
+ m_transformNodeMap.set(TransformPaintPropertyNode::root(), transformNode.id);
+ m_rootLayer->SetTransformTreeIndex(transformNode.id);
+}
+
+void PropertyTreeManager::setupRootClipNode() {
+ // cc is hardcoded to use clip node index 1 for viewport clip.
+ cc::ClipTree& clipTree = m_propertyTrees.clip_tree;
+ clipTree.clear();
+ cc::ClipNode& clipNode =
+ *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRealRootNodeId));
+ DCHECK_EQ(clipNode.id, kSecondaryRootNodeId);
+
+ clipNode.resets_clip = true;
+ clipNode.owner_id = m_rootLayer->id();
+ clipNode.clip_type = cc::ClipNode::ClipType::APPLIES_LOCAL_CLIP;
+ clipNode.clip = gfx::RectF(
+ gfx::SizeF(m_rootLayer->GetLayerTree()->device_viewport_size()));
+ clipNode.transform_id = kRealRootNodeId;
+ clipNode.target_transform_id = kRealRootNodeId;
+
+ m_clipNodeMap.set(ClipPaintPropertyNode::root(), clipNode.id);
+ m_rootLayer->SetClipTreeIndex(clipNode.id);
+}
+
+void PropertyTreeManager::setupRootEffectNode() {
+ // cc is hardcoded to use effect node index 1 for root render surface.
+ cc::EffectTree& effectTree = m_propertyTrees.effect_tree;
+ effectTree.clear();
+ cc::EffectNode& effectNode =
+ *effectTree.Node(effectTree.Insert(cc::EffectNode(), kInvalidNodeId));
+ DCHECK_EQ(effectNode.id, kSecondaryRootNodeId);
+ effectNode.owner_id = m_rootLayer->id();
+ effectNode.transform_id = kRealRootNodeId;
+ effectNode.clip_id = kSecondaryRootNodeId;
+ effectNode.has_render_surface = true;
+
+ m_effectStack.append(
+ BlinkEffectAndCcIdPair{EffectPaintPropertyNode::root(), effectNode.id});
+ m_rootLayer->SetEffectTreeIndex(effectNode.id);
+}
+
+void PropertyTreeManager::setupRootScrollNode() {
+ cc::ScrollTree& scrollTree = m_propertyTrees.scroll_tree;
+ scrollTree.clear();
+ cc::ScrollNode& scrollNode =
+ *scrollTree.Node(scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId));
+ DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId);
+ scrollNode.owner_id = m_rootLayer->id();
+ scrollNode.transform_id = kSecondaryRootNodeId;
+
+ m_scrollNodeMap.set(ScrollPaintPropertyNode::root(), scrollNode.id);
+ m_rootLayer->SetScrollTreeIndex(scrollNode.id);
}
int PropertyTreeManager::compositorIdForTransformNode(
const TransformPaintPropertyNode* transformNode) {
+ DCHECK(transformNode);
+ // TODO(crbug.com/645615): Remove the failsafe here.
if (!transformNode)
return kSecondaryRootNodeId;
@@ -511,6 +539,8 @@ int PropertyTreeManager::compositorIdForTransformNode(
int PropertyTreeManager::compositorIdForClipNode(
const ClipPaintPropertyNode* clipNode) {
+ DCHECK(clipNode);
+ // TODO(crbug.com/645615): Remove the failsafe here.
if (!clipNode)
return kSecondaryRootNodeId;
@@ -550,6 +580,8 @@ int PropertyTreeManager::compositorIdForClipNode(
int PropertyTreeManager::compositorIdForScrollNode(
const ScrollPaintPropertyNode* scrollNode) {
+ DCHECK(scrollNode);
+ // TODO(crbug.com/645615): Remove the failsafe here.
if (!scrollNode)
return kSecondaryRootNodeId;
@@ -639,17 +671,11 @@ int PropertyTreeManager::switchToEffectNode(
const EffectPaintPropertyNode& nextEffect) {
const EffectPaintPropertyNode* ancestor =
lowestCommonAncestor(currentEffectNode(), &nextEffect);
+ DCHECK(ancestor) << "Malformed effect tree. All nodes must be descendant of "
+ "EffectPaintPropertyNode::root().";
while (currentEffectNode() != ancestor)
m_effectStack.pop_back();
-#if DCHECK_IS_ON()
- DCHECK(m_isFirstEffectEver || currentEffectNode())
- << "Malformed effect tree. Nodes in the same property tree should have "
- "common root. "
- << &nextEffect;
- m_isFirstEffectEver = false;
-#endif
-
// Now the current effect is the lowest common ancestor of previous effect
// and the next effect. That implies it is an existing node that already has
// at least one paint chunk or child effect, and we are going to either attach
@@ -738,18 +764,11 @@ void PaintArtifactCompositor::update(
if (m_extraDataForTestingEnabled)
m_extraDataForTesting = wrapUnique(new ExtraDataForTesting);
- setMinimalPropertyTrees(layerTree->property_trees(), m_rootLayer->id());
-
m_rootLayer->RemoveAllChildren();
m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
- m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
- m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId);
- m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
- m_rootLayer->SetScrollTreeIndex(kRealRootNodeId);
PropertyTreeManager propertyTreeManager(*layerTree->property_trees(),
m_rootLayer.get());
- propertyTreeManager.setDeviceScaleFactor(layerTree->device_scale_factor());
Vector<std::unique_ptr<ContentLayerClientImpl>> newContentLayerClients;
newContentLayerClients.reserveCapacity(paintArtifact.paintChunks().size());
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698