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

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

Issue 2138663002: Revert of 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: 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp » ('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 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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 return layer; 338 return layer;
339 } 339 }
340 340
341 namespace { 341 namespace {
342 342
343 class PropertyTreeManager { 343 class PropertyTreeManager {
344 WTF_MAKE_NONCOPYABLE(PropertyTreeManager); 344 WTF_MAKE_NONCOPYABLE(PropertyTreeManager);
345 public: 345 public:
346 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer) 346 PropertyTreeManager(cc::PropertyTrees& propertyTrees, cc::Layer* rootLayer)
347 : m_propertyTrees(propertyTrees) 347 : m_propertyTrees(propertyTrees)
348 , m_rootLayer(rootLayer) 348 , m_rootLayer(rootLayer) {}
349 #if DCHECK_IS_ON()
350 , m_isFirstEffectEver(true)
351 #endif
352 {
353 m_effectStack.append(BlinkEffectAndCcIdPair{nullptr, kSecondaryRootNodeI d});
354 }
355 349
356 int compositorIdForTransformNode(const TransformPaintPropertyNode*); 350 int compositorIdForTransformNode(const TransformPaintPropertyNode*);
357 int compositorIdForClipNode(const ClipPaintPropertyNode*); 351 int compositorIdForClipNode(const ClipPaintPropertyNode*);
358 int switchToEffectNode(const EffectPaintPropertyNode& nextEffect);
359 int compositorIdForCurrentEffectNode() const { return m_effectStack.last().i d; }
360 352
361 private: 353 private:
362 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect);
363
364 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } 354 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; }
365 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } 355 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; }
366 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; }
367
368 const EffectPaintPropertyNode* currentEffectNode() const { return m_effectSt ack.last().effect; }
369 356
370 // Property trees which should be updated by the manager. 357 // Property trees which should be updated by the manager.
371 cc::PropertyTrees& m_propertyTrees; 358 cc::PropertyTrees& m_propertyTrees;
372 359
373 // Layer to which transform "owner" layers should be added. These will not 360 // Layer to which transform "owner" layers should be added. These will not
374 // have any actual children, but at present must exist in the tree. 361 // have any actual children, but at present must exist in the tree.
375 cc::Layer* m_rootLayer; 362 cc::Layer* m_rootLayer;
376 363
377 // Maps from Blink-side property tree nodes to cc property node indices. 364 // Maps from Blink-side property tree nodes to cc property node indices.
378 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; 365 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap;
379 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; 366 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap;
380
381 struct BlinkEffectAndCcIdPair {
382 const EffectPaintPropertyNode* effect;
383 int id;
384 };
385 Vector<BlinkEffectAndCcIdPair> m_effectStack;
386
387 #if DCHECK_IS_ON()
388 HashSet<const EffectPaintPropertyNode*> m_effectNodesConverted;
389 bool m_isFirstEffectEver;
390 #endif
391 }; 367 };
392 368
393 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper tyNode* transformNode) 369 int PropertyTreeManager::compositorIdForTransformNode(const TransformPaintProper tyNode* transformNode)
394 { 370 {
395 if (!transformNode) 371 if (!transformNode)
396 return kSecondaryRootNodeId; 372 return kSecondaryRootNodeId;
397 373
398 auto it = m_transformNodeMap.find(transformNode); 374 auto it = m_transformNodeMap.find(transformNode);
399 if (it != m_transformNodeMap.end()) 375 if (it != m_transformNodeMap.end())
400 return it->value; 376 return it->value;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 435 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
460 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); 436 dummyLayer->SetScrollTreeIndex(kRealRootNodeId);
461 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 437 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
462 438
463 auto result = m_clipNodeMap.set(clipNode, id); 439 auto result = m_clipNodeMap.set(clipNode, id);
464 DCHECK(result.isNewEntry); 440 DCHECK(result.isNewEntry);
465 clipTree().set_needs_update(true); 441 clipTree().set_needs_update(true);
466 return id; 442 return id;
467 } 443 }
468 444
469 unsigned depth(const EffectPaintPropertyNode* node)
470 {
471 unsigned result = 0;
472 for (; node; node = node->parent())
473 result++;
474 return result;
475 }
476
477 const EffectPaintPropertyNode* lowestCommonAncestor(const EffectPaintPropertyNod e* nodeA, const EffectPaintPropertyNode* nodeB)
478 {
479 // Optimized common case.
480 if (nodeA == nodeB)
481 return nodeA;
482
483 unsigned depthA = depth(nodeA), depthB = depth(nodeB);
484 while (depthA > depthB) {
485 nodeA = nodeA->parent();
486 depthA--;
487 }
488 while (depthB > depthA) {
489 nodeB = nodeB->parent();
490 depthB--;
491 }
492 DCHECK_EQ(depthA, depthB);
493 while (nodeA != nodeB) {
494 nodeA = nodeA->parent();
495 nodeB = nodeB->parent();
496 }
497 return nodeA;
498 }
499
500 int PropertyTreeManager::switchToEffectNode(const EffectPaintPropertyNode& nextE ffect)
501 {
502 const EffectPaintPropertyNode* ancestor = lowestCommonAncestor(currentEffect Node(), &nextEffect);
503 while (currentEffectNode() != ancestor)
504 m_effectStack.removeLast();
505
506 #if DCHECK_IS_ON()
507 DCHECK(m_isFirstEffectEver || currentEffectNode()) << "Malformed effect tree . Nodes in the same property tree should have common root.";
508 m_isFirstEffectEver = false;
509 #endif
510 buildEffectNodesRecursively(&nextEffect);
511
512 return compositorIdForCurrentEffectNode();
513 }
514
515 void PropertyTreeManager::buildEffectNodesRecursively(const EffectPaintPropertyN ode* nextEffect)
516 {
517 if (nextEffect == currentEffectNode())
518 return;
519 DCHECK(nextEffect);
520
521 buildEffectNodesRecursively(nextEffect->parent());
522 DCHECK_EQ(nextEffect->parent(), currentEffectNode());
523
524 #if DCHECK_IS_ON()
525 DCHECK(!m_effectNodesConverted.contains(nextEffect)) << "Malformed paint art ifact. Paint chunks under the same effect should be contiguous.";
526 m_effectNodesConverted.add(nextEffect);
527 #endif
528
529 // We currently create dummy layers to host effect nodes and corresponding r ender surface.
530 // This should be removed once cc implements better support for freestanding property trees.
531 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create();
532 m_rootLayer->AddChild(dummyLayer);
533
534 // Also cc assumes a clip node is always created by a layer that creates ren der surface.
535 cc::ClipNode& dummyClip = *clipTree().Node(clipTree().Insert(cc::ClipNode(), kSecondaryRootNodeId));
536 dummyClip.owner_id = dummyLayer->id();
537 dummyClip.transform_id = kRealRootNodeId;
538 dummyClip.target_transform_id = kRealRootNodeId;
539
540 cc::EffectNode& effectNode = *effectTree().Node(effectTree().Insert(cc::Effe ctNode(), compositorIdForCurrentEffectNode()));
541 effectNode.owner_id = dummyLayer->id();
542 effectNode.clip_id = dummyClip.id;
543 effectNode.has_render_surface = true;
544 effectNode.opacity = nextEffect->opacity();
545 m_effectStack.append(BlinkEffectAndCcIdPair{nextEffect, effectNode.id});
546
547 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
548 dummyLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
549 dummyLayer->SetClipTreeIndex(dummyClip.id);
550 dummyLayer->SetEffectTreeIndex(effectNode.id);
551 dummyLayer->SetScrollTreeIndex(kRealRootNodeId);
552 }
553
554 } // namespace 445 } // namespace
555 446
556 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact) 447 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact)
557 { 448 {
558 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); 449 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host();
559 450
560 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); 451 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id());
561 m_rootLayer->RemoveAllChildren(); 452 m_rootLayer->RemoveAllChildren();
562 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 453 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
563 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); 454 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
564 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); 455 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId);
565 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 456 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
566 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId); 457 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId);
567 458
568 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer .get()); 459 PropertyTreeManager propertyTreeManager(*host->property_trees(), m_rootLayer .get());
569 m_contentLayerClients.clear(); 460 m_contentLayerClients.clear();
570 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); 461 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size());
571 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { 462 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) {
572 gfx::Vector2dF layerOffset; 463 gfx::Vector2dF layerOffset;
573 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); 464 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset);
574 465
575 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get()); 466 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get());
576 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get()); 467 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get());
577 int effectId = propertyTreeManager.switchToEffectNode(*paintChunk.proper ties.effect.get());
578 468
579 layer->set_offset_to_transform_parent(layerOffset); 469 layer->set_offset_to_transform_parent(layerOffset);
580 470
581 m_rootLayer->AddChild(layer); 471 m_rootLayer->AddChild(layer);
582 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 472 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
583 layer->SetTransformTreeIndex(transformId); 473 layer->SetTransformTreeIndex(transformId);
584 layer->SetClipTreeIndex(clipId); 474 layer->SetClipTreeIndex(clipId);
585 layer->SetEffectTreeIndex(effectId); 475 layer->SetEffectTreeIndex(kSecondaryRootNodeId);
586 layer->SetScrollTreeIndex(kRealRootNodeId); 476 layer->SetScrollTreeIndex(kRealRootNodeId);
587 477
588 if (m_extraDataForTestingEnabled) 478 if (m_extraDataForTestingEnabled)
589 m_extraDataForTesting->contentLayers.append(layer); 479 m_extraDataForTesting->contentLayers.append(layer);
590 } 480 }
591 481
592 // Mark the property trees as having been rebuilt. 482 // Mark the property trees as having been rebuilt.
593 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; 483 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber;
594 host->property_trees()->needs_rebuild = false; 484 host->property_trees()->needs_rebuild = false;
595 } 485 }
596 486
597 } // namespace blink 487 } // namespace blink
OLDNEW
« 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