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

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

Issue 2052763002: Add effect node support in PaintArtifactCompositor for layer list mode [4/4] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@pac_layer_list_step_3
Patch Set: rebase & meld into PropertyTreeManager Created 4 years, 5 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "platform/graphics/compositing/PaintArtifactCompositor.h" 5 #include "platform/graphics/compositing/PaintArtifactCompositor.h"
6 6
7 #include "cc/layers/content_layer_client.h" 7 #include "cc/layers/content_layer_client.h"
8 #include "cc/layers/layer.h" 8 #include "cc/layers/layer.h"
9 #include "cc/layers/picture_layer.h" 9 #include "cc/layers/picture_layer.h"
10 #include "cc/playback/display_item_list.h" 10 #include "cc/playback/display_item_list.h"
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 return layer; 335 return layer;
336 } 336 }
337 337
338 namespace { 338 namespace {
339 339
340 class PropertyTreeManager { 340 class PropertyTreeManager {
341 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); 341 WTF_MAKE_NONCOPYABLE(PropertyTreeManager);
342 public: 342 public:
343 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer) 343 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer)
344 : m_propertyTrees(propertyTrees) 344 : m_propertyTrees(propertyTrees)
345 , m_rootLayer(rootLayer) {} 345 , m_rootLayer(rootLayer)
346 #if DCHECK_IS_ON()
347 , m_isFirstEffectEver(true)
348 #endif
349 {
350 m_effectStack.append(BlinkEffectAndCcIdPair{nullptr, kSecondaryRootNodeI d});
351 }
346 352
347 int compositorIdForTransformNode(const TransformPaintPropertyNode*); 353 int compositorIdForTransformNode(const TransformPaintPropertyNode*);
348 int compositorIdForClipNode(const ClipPaintPropertyNode*); 354 int compositorIdForClipNode(const ClipPaintPropertyNode*);
355 void switchToEffectNode(const EffectPaintPropertyNode& nextEffect);
356 int compositorIdForCurrentEffectNode() const { return m_effectStack.last().i d; }
349 357
350 private: 358 private:
359 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect);
360
351 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } 361 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; }
352 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } 362 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; }
363 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; }
364
365 const EffectPaintPropertyNode* currentEffectNode() { return m_effectStack.la st().effect; }
jbroman 2016/07/08 18:32:34 super-nit: for consistency with compositorIdForCur
trchen 2016/07/09 01:09:24 Done.
353 366
354 // Property trees which should be updated by the manager. 367 // Property trees which should be updated by the manager.
355 cc::PropertyTrees& m_propertyTrees; 368 cc::PropertyTrees& m_propertyTrees;
356 369
357 // Layer to which transform "owner" layers should be added. These will not 370 // Layer to which transform "owner" layers should be added. These will not
358 // have any actual children, but at present must exist in the tree. 371 // have any actual children, but at present must exist in the tree.
359 cc::Layer* m_rootLayer; 372 cc::Layer* m_rootLayer;
360 373
361 // Maps from Blink-side property tree nodes to cc property node indices. 374 // Maps from Blink-side property tree nodes to cc property node indices.
362 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; 375 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap;
363 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; 376 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap;
377
378 struct BlinkEffectAndCcIdPair {
379 const EffectPaintPropertyNode* effect;
380 int id;
381 };
382 Vector<BlinkEffectAndCcIdPair> m_effectStack;
383
384 #if DCHECK_IS_ON()
385 HashSet<const EffectPaintPropertyNode*> m_effectNodesConverted;
386 bool m_isFirstEffectEver;
387 #endif
364 }; 388 };
365 389
366 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper tyNode* transformNode) 390 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper tyNode* transformNode)
367 { 391 {
368 if (!transformNode) 392 if (!transformNode)
369 return kSecondaryRootNodeId; 393 return kSecondaryRootNodeId;
370 394
371 auto it = m_transformNodeMap.find(transformNode); 395 auto it = m_transformNodeMap.find(transformNode);
372 if (it != m_transformNodeMap.end()) 396 if (it != m_transformNodeMap.end())
373 return it->value; 397 return it->value;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 456 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
433 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); 457 dummyLayer->SetScrollTreeIndex(kRealRootNodeId);
434 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 458 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
435 459
436 auto result = m_clipNodeMap.set(clipNode, id); 460 auto result = m_clipNodeMap.set(clipNode, id);
437 DCHECK(result.isNewEntry); 461 DCHECK(result.isNewEntry);
438 clipTree().set_needs_update(true); 462 clipTree().set_needs_update(true);
439 return id; 463 return id;
440 } 464 }
441 465
466 unsigned depth(const EffectPaintPropertyNode* node)
467 {
468 unsigned result = 0;
469 for (; node; node = node->parent())
470 result++;
471 return result;
472 }
473 const EffectPaintPropertyNode* lowestCommonAncestor(const EffectPaintPropertyNod e* nodeA, const EffectPaintPropertyNode* nodeB)
jbroman 2016/07/08 18:32:34 super-nit: blank line above this function please
trchen 2016/07/09 01:09:25 Done.
474 {
475 // Optimized common case.
476 if (nodeA == nodeB)
477 return nodeA;
478
479 unsigned depthA = depth(nodeA), depthB = depth(nodeB);
480 while (depthA > depthB) {
481 nodeA = nodeA->parent();
482 depthA--;
483 }
484 while (depthB > depthA) {
485 nodeB = nodeB->parent();
486 depthB--;
487 }
488 DCHECK_EQ(depthA, depthB);
489 while (nodeA != nodeB) {
490 nodeA = nodeA->parent();
491 nodeB = nodeB->parent();
492 }
493 return nodeA;
494 }
495
496 void PropertyTreeManager::switchToEffectNode(const EffectPaintPropertyNode& next Effect)
497 {
498 const EffectPaintPropertyNode* ancestor = lowestCommonAncestor(currentEffect Node(), &nextEffect);
499 while (currentEffectNode() != ancestor)
500 m_effectStack.removeLast();
501
502 #if DCHECK_IS_ON()
503 DCHECK(m_isFirstEffectEver || currentEffectNode()) << "Malformed effect tree . Nodes in the same property tree should have common root.";
504 m_isFirstEffectEver = false;
505 #endif
506 buildEffectNodesRecursively(&nextEffect);
507 }
508
509 void PropertyTreeManager::buildEffectNodesRecursively(const EffectPaintPropertyN ode* nextEffect)
510 {
511 if (nextEffect == currentEffectNode())
512 return;
513 DCHECK(nextEffect);
514
515 buildEffectNodesRecursively(nextEffect->parent());
516 DCHECK_EQ(nextEffect->parent(), currentEffectNode());
517
518 #if DCHECK_IS_ON()
519 DCHECK(!m_effectNodesConverted.contains(nextEffect)) << "Malformed paint art ifact. Paint chunks under the same effect should be contiguous.";
520 m_effectNodesConverted.add(nextEffect);
521 #endif
522
523 // We currently create dummy layers to host effect nodes and corresponding r ender surface.
524 // This should be removed once cc implements better support for freestanding property trees.
525 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create();
526 m_rootLayer->AddChild(dummyLayer);
527
528 // Also cc assumes a clip node is always created by a layer that creates ren der surface.
529 cc::ClipNode& dummyClip = *clipTree().Node(clipTree().Insert(cc::ClipNode(), kSecondaryRootNodeId));
530 dummyClip.owner_id = dummyLayer->id();
531 dummyClip.data.transform_id = kRealRootNodeId;
jbroman 2016/07/08 18:32:34 It looks like they don't yet exist on EffectPaintP
trchen 2016/07/09 01:09:25 I don't think the dummy clip should even exist. Mo
jbroman 2016/07/09 20:25:24 That's fair, but the effect will have an associate
532 dummyClip.data.target_id = kRealRootNodeId;
533
534 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert(cc::Effe ctNode(), compositorIdForCurrentEffectNode()));
535 effectNode.owner_id = dummyLayer->id();
536 effectNode.data.clip_id = dummyClip.id;
537 effectNode.data.has_render_surface = true;
538 effectNode.data.opacity = nextEffect->opacity();
539 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id});
540
541 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
542 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
543 dummyLayer->SetClipTreeIndex(dummyClip.id);
544 dummyLayer->SetEffectTreeIndex(effectNode.id);
545 dummyLayer->SetScrollTreeIndex(kRealRootNodeId);
546 }
547
442 } // namespace 548 } // namespace
443 549
444 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact) 550 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact)
445 { 551 {
446 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); 552 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host();
447 553
448 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); 554 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id());
449 m_rootLayer->RemoveAllChildren(); 555 m_rootLayer->RemoveAllChildren();
450 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 556 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
451 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); 557 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
452 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); 558 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId);
453 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 559 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
454 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); 560 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId);
455 561
456 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer .get()); 562 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer .get());
457 m_contentLayerClients.clear(); 563 m_contentLayerClients.clear();
458 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); 564 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size());
459 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { 565 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) {
566 propertyTreeManager.switchToEffectNode(*paintChunk.properties.effect.get ());
jbroman 2016/07/08 18:32:34 nit: is there a reason this has to happen above th
trchen 2016/07/09 01:09:25 Done.
460 gfx::Vector2dF layerOffset; 567 gfx::Vector2dF layerOffset;
461 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); 568 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset);
462 569
463 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get()); 570 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get());
464 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get()); 571 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get());
465 572
466 layer->set_offset_to_transform_parent(layerOffset); 573 layer->set_offset_to_transform_parent(layerOffset);
467 574
468 m_rootLayer->AddChild(layer); 575 m_rootLayer->AddChild(layer);
469 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 576 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
470 layer->SetTransformTreeIndex(transformId); 577 layer->SetTransformTreeIndex(transformId);
471 layer->SetClipTreeIndex(clipId); 578 layer->SetClipTreeIndex(clipId);
472 layer->SetEffectTreeIndex(kSecondaryRootNodeId); 579 layer->SetEffectTreeIndex(propertyTreeManager.compositorIdForCurrentEffe ctNode());
473 layer->SetScrollTreeIndex(kRealRootNodeId); 580 layer->SetScrollTreeIndex(kRealRootNodeId);
474 581
475 if (m_extraDataForTestingEnabled) 582 if (m_extraDataForTestingEnabled)
476 m_extraDataForTesting->contentLayers.append(layer); 583 m_extraDataForTesting->contentLayers.append(layer);
477 } 584 }
478 585
479 // Mark the property trees as having been rebuilt. 586 // Mark the property trees as having been rebuilt.
480 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; 587 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber;
481 host->property_trees()->needs_rebuild = false; 588 host->property_trees()->needs_rebuild = false;
482 } 589 }
483 590
484 } // namespace blink 591 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698