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

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

Issue 2052743002: Add effect node support in PaintArtifactCompositor for layer list mode [3/4] (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@pac_layer_list_step_2
Patch Set: rebase 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 | no next file » | 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 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 return nullptr; 251 return nullptr;
252 252
253 const auto& foreignLayerDisplayItem = static_cast<const ForeignLayerDisplayI tem&>(displayItem); 253 const auto& foreignLayerDisplayItem = static_cast<const ForeignLayerDisplayI tem&>(displayItem);
254 layerOffset = gfx::Vector2dF(foreignLayerDisplayItem.location().x(), foreign LayerDisplayItem.location().y()); 254 layerOffset = gfx::Vector2dF(foreignLayerDisplayItem.location().x(), foreign LayerDisplayItem.location().y());
255 scoped_refptr<cc::Layer> layer = foreignLayerDisplayItem.layer(); 255 scoped_refptr<cc::Layer> layer = foreignLayerDisplayItem.layer();
256 layer->SetBounds(foreignLayerDisplayItem.bounds()); 256 layer->SetBounds(foreignLayerDisplayItem.bounds());
257 layer->SetIsDrawable(true); 257 layer->SetIsDrawable(true);
258 return layer; 258 return layer;
259 } 259 }
260 260
261 static const int kInvalidNodeId = -1; 261
262 static const int kRealRootNodeId = 0; 262 constexpr int kRealRootNodeId = 0;
263 static const int kSecondaryRootNodeId = 1; 263 constexpr int kSecondaryRootNodeId = 1;
264 static const int kPropertyTreeSequenceNumber = 1; 264 constexpr int kPropertyTreeSequenceNumber = 1;
265 265
266 // Creates a minimal set of property trees for the compositor. 266 // Creates a minimal set of property trees for the compositor.
267 void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId) 267 void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId)
268 { 268 {
269 // cc's property trees expect a child of the actual root to be used. So we 269 // cc is hardcoded to use transform node index 1 for device scale and transf orm.
270 // need to create and populate an additional node for each type of tree.
271
272 cc::TransformTree& transformTree = propertyTrees->transform_tree; 270 cc::TransformTree& transformTree = propertyTrees->transform_tree;
273 transformTree.clear(); 271 transformTree.clear();
274 transformTree.Insert(cc::TransformNode(), kRealRootNodeId); 272 cc::TransformNode& transformNode = *transformTree.Node(transformTree.Insert( cc::TransformNode(), kRealRootNodeId));
275 cc::TransformNode& transformNode = *transformTree.back(); 273 DCHECK_EQ(transformNode.id, kSecondaryRootNodeId);
274 transformNode.data.source_node_id = transformNode.parent_id;
276 transformTree.SetTargetId(transformNode.id, kRealRootNodeId); 275 transformTree.SetTargetId(transformNode.id, kRealRootNodeId);
277 transformTree.SetContentTargetId(transformNode.id, kSecondaryRootNodeId); 276 transformTree.SetContentTargetId(transformNode.id, kRealRootNodeId);
278 transformNode.data.source_node_id = kRealRootNodeId;
279 transformNode.data.needs_local_transform_update = true;
280 transformNode.owner_id = ownerId;
281 transformTree.set_needs_update(true);
282 277
278 // cc is hardcoded to use clip node index 1 for viewport clip.
283 cc::ClipTree& clipTree = propertyTrees->clip_tree; 279 cc::ClipTree& clipTree = propertyTrees->clip_tree;
284 clipTree.clear(); 280 clipTree.clear();
285 clipTree.Insert(cc::ClipNode(), kRealRootNodeId); 281 cc::ClipNode& clipNode = *clipTree.Node(clipTree.Insert(cc::ClipNode(), kRea lRootNodeId));
286 cc::ClipNode& clipNode = *clipTree.back(); 282 DCHECK_EQ(clipNode.id, kSecondaryRootNodeId);
287 clipNode.data.transform_id = kSecondaryRootNodeId;
288 clipNode.data.target_id = kSecondaryRootNodeId;
289 clipNode.owner_id = ownerId; 283 clipNode.owner_id = ownerId;
290 clipTree.set_needs_update(true);
291 284
285 // cc is hardcoded to use effect node index 1 for root render surface.
292 cc::EffectTree& effectTree = propertyTrees->effect_tree; 286 cc::EffectTree& effectTree = propertyTrees->effect_tree;
293 effectTree.clear(); 287 effectTree.clear();
294 // This matches what cc does right now: the secondary root isn't a child 288 cc::EffectNode& effectNode = *effectTree.Node(effectTree.Insert(cc::EffectNo de(), kRealRootNodeId));
295 // of the first root (at index 0). This may not have been intentional. 289 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId);
296 effectTree.Insert(cc::EffectNode(), kInvalidNodeId); 290 effectNode.owner_id = ownerId;
297 cc::EffectNode& effectNode = *effectTree.back(); 291 effectNode.data.clip_id = clipNode.id;
298 effectNode.data.has_render_surface = true; 292 effectNode.data.has_render_surface = true;
299 effectNode.data.transform_id = kRealRootNodeId;
300 effectNode.data.clip_id = kRealRootNodeId;
301 effectNode.owner_id = ownerId;
302 effectTree.set_needs_update(true);
303 293
304 cc::ScrollTree& scrollTree = propertyTrees->scroll_tree; 294 cc::ScrollTree& scrollTree = propertyTrees->scroll_tree;
305 scrollTree.clear(); 295 scrollTree.clear();
306 scrollTree.Insert(cc::ScrollNode(), kRealRootNodeId);
307 cc::ScrollNode& scrollNode = *scrollTree.back();
308 scrollNode.data.scrollable = false;
309 scrollNode.data.transform_id = kSecondaryRootNodeId;
310 scrollNode.owner_id = ownerId;
311 scrollTree.set_needs_update(true);
312 } 296 }
313 297
314 } // namespace 298 } // namespace
315 299
316 void PaintArtifactCompositor::update(const PaintArtifact& paintArtifact) 300 void PaintArtifactCompositor::update(const PaintArtifact& paintArtifact)
317 { 301 {
318 DCHECK(m_rootLayer); 302 DCHECK(m_rootLayer);
319 303
320 if (m_extraDataForTestingEnabled) 304 if (m_extraDataForTestingEnabled)
321 m_extraDataForTesting = wrapUnique(new ExtraDataForTesting); 305 m_extraDataForTesting = wrapUnique(new ExtraDataForTesting);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 layer->SetContentsOpaque(true); 368 layer->SetContentsOpaque(true);
385 m_contentLayerClients.append(std::move(contentLayerClient)); 369 m_contentLayerClients.append(std::move(contentLayerClient));
386 return layer; 370 return layer;
387 } 371 }
388 372
389 namespace { 373 namespace {
390 374
391 class TransformTreeManager { 375 class TransformTreeManager {
392 WTF_MAKE_NONCOPYABLE(TransformTreeManager); 376 WTF_MAKE_NONCOPYABLE(TransformTreeManager);
393 public: 377 public:
394 TransformTreeManager(cc::TransformTree& transformTree, cc::Layer* rootLayer) 378 TransformTreeManager(cc::TransformTree& transformTree)
395 : m_transformTree(transformTree) 379 : m_transformTree(transformTree) {}
396 , m_rootLayer(rootLayer) {}
397 380
398 int compositorIdForNode(const TransformPaintPropertyNode*); 381 int compositorIdForNode(const TransformPaintPropertyNode*);
399 382
400 private: 383 private:
401 // Transform tree which should be updated by the manager. 384 // Transform tree which should be updated by the manager.
402 cc::TransformTree& m_transformTree; 385 cc::TransformTree& m_transformTree;
403 386
404 // Layer to which transform "owner" layers should be added. These will not
405 // have any actual children, but at present must exist in the tree.
406 cc::Layer* m_rootLayer;
407
408 // Map from Blink-side transform nodes to cc transform node indices. 387 // Map from Blink-side transform nodes to cc transform node indices.
409 HashMap<const TransformPaintPropertyNode*, int> m_nodeMap; 388 HashMap<const TransformPaintPropertyNode*, int> m_nodeMap;
410 }; 389 };
411 390
412 int TransformTreeManager::compositorIdForNode(const TransformPaintPropertyNode* transformNode) 391 int TransformTreeManager::compositorIdForNode(const TransformPaintPropertyNode* transformNode)
413 { 392 {
414 if (!transformNode) 393 if (!transformNode)
415 return kSecondaryRootNodeId; 394 return kSecondaryRootNodeId;
416 395
417 auto it = m_nodeMap.find(transformNode); 396 auto it = m_nodeMap.find(transformNode);
418 if (it != m_nodeMap.end()) 397 if (it != m_nodeMap.end())
419 return it->value; 398 return it->value;
420 399
421 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create();
422 int parentId = compositorIdForNode(transformNode->parent()); 400 int parentId = compositorIdForNode(transformNode->parent());
423 int id = m_transformTree.Insert(cc::TransformNode(), parentId); 401 int id = m_transformTree.Insert(cc::TransformNode(), parentId);
424 402
425 cc::TransformNode& compositorNode = *m_transformTree.Node(id); 403 cc::TransformNode& compositorNode = *m_transformTree.Node(id);
426 m_transformTree.SetTargetId(id, kSecondaryRootNodeId); 404 m_transformTree.SetTargetId(id, kRealRootNodeId);
427 m_transformTree.SetContentTargetId(id, kSecondaryRootNodeId); 405 m_transformTree.SetContentTargetId(id, kRealRootNodeId);
428 compositorNode.owner_id = dummyLayer->id();
429 compositorNode.data.source_node_id = parentId; 406 compositorNode.data.source_node_id = parentId;
430 compositorNode.data.needs_local_transform_update = true;
431 407
432 FloatPoint3D origin = transformNode->origin(); 408 FloatPoint3D origin = transformNode->origin();
433 compositorNode.data.pre_local.matrix().setTranslate( 409 compositorNode.data.pre_local.matrix().setTranslate(
434 -origin.x(), -origin.y(), -origin.z()); 410 -origin.x(), -origin.y(), -origin.z());
435 compositorNode.data.local.matrix() = TransformationMatrix::toSkMatrix44(tran sformNode->matrix()); 411 compositorNode.data.local.matrix() = TransformationMatrix::toSkMatrix44(tran sformNode->matrix());
436 compositorNode.data.post_local.matrix().setTranslate( 412 compositorNode.data.post_local.matrix().setTranslate(
437 origin.x(), origin.y(), origin.z()); 413 origin.x(), origin.y(), origin.z());
438 compositorNode.data.needs_local_transform_update = true; 414 compositorNode.data.needs_local_transform_update = true;
439 415
440 m_rootLayer->AddChild(dummyLayer);
jbroman 2016/06/29 15:25:34 Why delete these? There is code that expects to be
ajuma 2016/06/29 15:33:22 Yeah, it's safer to leave these in for now (until
trchen 2016/06/29 20:22:30 I feel that's going backward because we are suppos
441 dummyLayer->SetTransformTreeIndex(id);
442 dummyLayer->SetClipTreeIndex(kSecondaryRootNodeId);
443 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
444 dummyLayer->SetScrollTreeIndex(kSecondaryRootNodeId);
445 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
446
447 auto result = m_nodeMap.set(transformNode, id); 416 auto result = m_nodeMap.set(transformNode, id);
448 DCHECK(result.isNewEntry); 417 DCHECK(result.isNewEntry);
449 m_transformTree.set_needs_update(true); 418 m_transformTree.set_needs_update(true);
450 return id; 419 return id;
451 } 420 }
452 421
453 } // namespace 422 } // namespace
454 423
455 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact) 424 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact)
456 { 425 {
457 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); 426 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host();
458 427
459 // The root layer must be the owner so that the render surface
460 // validation works. It's expected to own at least the effect node.
461 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id()); 428 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id());
462 m_rootLayer->RemoveAllChildren(); 429 m_rootLayer->RemoveAllChildren();
463 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 430 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
464 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); 431 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
465 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); 432 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId);
466 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 433 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
467 m_rootLayer->SetScrollTreeIndex(kSecondaryRootNodeId); 434 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId);
468 435
469 TransformTreeManager transformTreeManager(host->property_trees()->transform_ tree, m_rootLayer.get()); 436 TransformTreeManager transformTreeManager(host->property_trees()->transform_ tree);
470 m_contentLayerClients.clear(); 437 m_contentLayerClients.clear();
471 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); 438 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size());
472 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { 439 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) {
473 gfx::Vector2dF layerOffset; 440 gfx::Vector2dF layerOffset;
474 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); 441 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset);
475 442
476 int transformId = transformTreeManager.compositorIdForNode(paintChunk.pr operties.transform.get()); 443 int transformId = transformTreeManager.compositorIdForNode(paintChunk.pr operties.transform.get());
477 layer->set_offset_to_transform_parent(layerOffset); 444 layer->set_offset_to_transform_parent(layerOffset);
478 445
479 m_rootLayer->AddChild(layer); 446 m_rootLayer->AddChild(layer);
480 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 447 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
481 layer->SetTransformTreeIndex(transformId); 448 layer->SetTransformTreeIndex(transformId);
482 layer->SetClipTreeIndex(kSecondaryRootNodeId); 449 layer->SetClipTreeIndex(kSecondaryRootNodeId);
483 layer->SetEffectTreeIndex(kSecondaryRootNodeId); 450 layer->SetEffectTreeIndex(kSecondaryRootNodeId);
484 layer->SetScrollTreeIndex(kSecondaryRootNodeId); 451 layer->SetScrollTreeIndex(kRealRootNodeId);
485 452
486 if (m_extraDataForTestingEnabled) 453 if (m_extraDataForTestingEnabled)
487 m_extraDataForTesting->contentLayers.append(layer); 454 m_extraDataForTesting->contentLayers.append(layer);
488 } 455 }
489 456
490 // Mark the property trees as having been rebuilt. 457 // Mark the property trees as having been rebuilt.
491 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; 458 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber;
492 host->property_trees()->needs_rebuild = false; 459 host->property_trees()->needs_rebuild = false;
493 } 460 }
494 461
495 } // namespace blink 462 } // namespace blink
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698