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

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: add back dummy layers 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 400
417 auto it = m_nodeMap.find(transformNode); 401 auto it = m_nodeMap.find(transformNode);
418 if (it != m_nodeMap.end()) 402 if (it != m_nodeMap.end())
419 return it->value; 403 return it->value;
420 404
421 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create(); 405 scoped_refptr<cc::Layer> dummyLayer = cc::Layer::Create();
422 int parentId = compositorIdForNode(transformNode->parent()); 406 int parentId = compositorIdForNode(transformNode->parent());
423 int id = m_transformTree.Insert(cc::TransformNode(), parentId); 407 int id = m_transformTree.Insert(cc::TransformNode(), parentId);
424 408
425 cc::TransformNode& compositorNode = *m_transformTree.Node(id); 409 cc::TransformNode& compositorNode = *m_transformTree.Node(id);
426 m_transformTree.SetTargetId(id, kSecondaryRootNodeId); 410 m_transformTree.SetTargetId(id, kRealRootNodeId);
427 m_transformTree.SetContentTargetId(id, kSecondaryRootNodeId); 411 m_transformTree.SetContentTargetId(id, kRealRootNodeId);
428 compositorNode.owner_id = dummyLayer->id();
429 compositorNode.data.source_node_id = parentId; 412 compositorNode.data.source_node_id = parentId;
430 compositorNode.data.needs_local_transform_update = true;
431 413
432 FloatPoint3D origin = transformNode->origin(); 414 FloatPoint3D origin = transformNode->origin();
433 compositorNode.data.pre_local.matrix().setTranslate( 415 compositorNode.data.pre_local.matrix().setTranslate(
434 -origin.x(), -origin.y(), -origin.z()); 416 -origin.x(), -origin.y(), -origin.z());
435 compositorNode.data.local.matrix() = TransformationMatrix::toSkMatrix44(tran sformNode->matrix()); 417 compositorNode.data.local.matrix() = TransformationMatrix::toSkMatrix44(tran sformNode->matrix());
436 compositorNode.data.post_local.matrix().setTranslate( 418 compositorNode.data.post_local.matrix().setTranslate(
437 origin.x(), origin.y(), origin.z()); 419 origin.x(), origin.y(), origin.z());
438 compositorNode.data.needs_local_transform_update = true; 420 compositorNode.data.needs_local_transform_update = true;
439 421
440 m_rootLayer->AddChild(dummyLayer); 422 m_rootLayer->AddChild(dummyLayer);
441 dummyLayer->SetTransformTreeIndex(id); 423 dummyLayer->SetTransformTreeIndex(id);
442 dummyLayer->SetClipTreeIndex(kSecondaryRootNodeId); 424 dummyLayer->SetClipTreeIndex(kSecondaryRootNodeId);
443 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 425 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
444 dummyLayer->SetScrollTreeIndex(kSecondaryRootNodeId); 426 dummyLayer->SetScrollTreeIndex(kRealRootNodeId);
445 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 427 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
446 428
447 auto result = m_nodeMap.set(transformNode, id); 429 auto result = m_nodeMap.set(transformNode, id);
448 DCHECK(result.isNewEntry); 430 DCHECK(result.isNewEntry);
449 m_transformTree.set_needs_update(true); 431 m_transformTree.set_needs_update(true);
450 return id; 432 return id;
451 } 433 }
452 434
453 } // namespace 435 } // namespace
454 436
455 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact) 437 void PaintArtifactCompositor::updateInLayerListMode(const PaintArtifact& paintAr tifact)
456 { 438 {
457 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host(); 439 cc::LayerTreeHost* host = m_rootLayer->layer_tree_host();
458 440
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()); 441 setMinimalPropertyTrees(host->property_trees(), m_rootLayer->id());
462 m_rootLayer->RemoveAllChildren(); 442 m_rootLayer->RemoveAllChildren();
463 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 443 m_rootLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
464 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId); 444 m_rootLayer->SetTransformTreeIndex(kSecondaryRootNodeId);
465 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId); 445 m_rootLayer->SetClipTreeIndex(kSecondaryRootNodeId);
466 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId); 446 m_rootLayer->SetEffectTreeIndex(kSecondaryRootNodeId);
467 m_rootLayer->SetScrollTreeIndex(kSecondaryRootNodeId); 447 m_rootLayer->SetScrollTreeIndex(kRealRootNodeId);
468 448
469 TransformTreeManager transformTreeManager(host->property_trees()->transform_ tree, m_rootLayer.get()); 449 TransformTreeManager transformTreeManager(host->property_trees()->transform_ tree, m_rootLayer.get());
470 m_contentLayerClients.clear(); 450 m_contentLayerClients.clear();
471 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); 451 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size());
472 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { 452 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) {
473 gfx::Vector2dF layerOffset; 453 gfx::Vector2dF layerOffset;
474 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); 454 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset);
475 455
476 int transformId = transformTreeManager.compositorIdForNode(paintChunk.pr operties.transform.get()); 456 int transformId = transformTreeManager.compositorIdForNode(paintChunk.pr operties.transform.get());
477 layer->set_offset_to_transform_parent(layerOffset); 457 layer->set_offset_to_transform_parent(layerOffset);
478 458
479 m_rootLayer->AddChild(layer); 459 m_rootLayer->AddChild(layer);
480 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); 460 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber);
481 layer->SetTransformTreeIndex(transformId); 461 layer->SetTransformTreeIndex(transformId);
482 layer->SetClipTreeIndex(kSecondaryRootNodeId); 462 layer->SetClipTreeIndex(kSecondaryRootNodeId);
483 layer->SetEffectTreeIndex(kSecondaryRootNodeId); 463 layer->SetEffectTreeIndex(kSecondaryRootNodeId);
484 layer->SetScrollTreeIndex(kSecondaryRootNodeId); 464 layer->SetScrollTreeIndex(kRealRootNodeId);
485 465
486 if (m_extraDataForTestingEnabled) 466 if (m_extraDataForTestingEnabled)
487 m_extraDataForTesting->contentLayers.append(layer); 467 m_extraDataForTesting->contentLayers.append(layer);
488 } 468 }
489 469
490 // Mark the property trees as having been rebuilt. 470 // Mark the property trees as having been rebuilt.
491 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber; 471 host->property_trees()->sequence_number = kPropertyTreeSequenceNumber;
492 host->property_trees()->needs_rebuild = false; 472 host->property_trees()->needs_rebuild = false;
493 } 473 }
494 474
495 } // namespace blink 475 } // 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