| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |