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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 |
OLD | NEW |