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" |
11 #include "cc/playback/display_item_list_settings.h" | 11 #include "cc/playback/display_item_list_settings.h" |
12 #include "cc/playback/drawing_display_item.h" | 12 #include "cc/playback/drawing_display_item.h" |
13 #include "cc/playback/transform_display_item.h" | 13 #include "cc/playback/transform_display_item.h" |
14 #include "cc/trees/clip_node.h" | 14 #include "cc/trees/clip_node.h" |
15 #include "cc/trees/effect_node.h" | 15 #include "cc/trees/effect_node.h" |
16 #include "cc/trees/layer_tree_host.h" | 16 #include "cc/trees/layer_tree_host.h" |
17 #include "cc/trees/property_tree.h" | 17 #include "cc/trees/property_tree.h" |
18 #include "cc/trees/scroll_node.h" | |
18 #include "cc/trees/transform_node.h" | 19 #include "cc/trees/transform_node.h" |
19 #include "platform/RuntimeEnabledFeatures.h" | 20 #include "platform/RuntimeEnabledFeatures.h" |
20 #include "platform/graphics/paint/ClipPaintPropertyNode.h" | 21 #include "platform/graphics/paint/ClipPaintPropertyNode.h" |
21 #include "platform/graphics/paint/DisplayItem.h" | 22 #include "platform/graphics/paint/DisplayItem.h" |
22 #include "platform/graphics/paint/DrawingDisplayItem.h" | 23 #include "platform/graphics/paint/DrawingDisplayItem.h" |
23 #include "platform/graphics/paint/ForeignLayerDisplayItem.h" | 24 #include "platform/graphics/paint/ForeignLayerDisplayItem.h" |
24 #include "platform/graphics/paint/PaintArtifact.h" | 25 #include "platform/graphics/paint/PaintArtifact.h" |
25 #include "platform/graphics/paint/PropertyTreeState.h" | 26 #include "platform/graphics/paint/PropertyTreeState.h" |
27 #include "platform/graphics/paint/ScrollPaintPropertyNode.h" | |
26 #include "platform/graphics/paint/TransformPaintPropertyNode.h" | 28 #include "platform/graphics/paint/TransformPaintPropertyNode.h" |
27 #include "public/platform/Platform.h" | 29 #include "public/platform/Platform.h" |
28 #include "public/platform/WebCompositorSupport.h" | 30 #include "public/platform/WebCompositorSupport.h" |
29 #include "public/platform/WebLayer.h" | 31 #include "public/platform/WebLayer.h" |
30 #include "ui/gfx/geometry/point.h" | 32 #include "ui/gfx/geometry/point.h" |
31 #include "ui/gfx/geometry/point_f.h" | 33 #include "ui/gfx/geometry/point_f.h" |
32 #include "ui/gfx/geometry/rect.h" | 34 #include "ui/gfx/geometry/rect.h" |
33 #include "ui/gfx/geometry/rect_f.h" | 35 #include "ui/gfx/geometry/rect_f.h" |
34 #include "ui/gfx/geometry/size.h" | 36 #include "ui/gfx/geometry/size.h" |
35 #include "ui/gfx/geometry/size_conversions.h" | 37 #include "ui/gfx/geometry/size_conversions.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
134 | 136 |
135 const auto& foreignLayerDisplayItem = static_cast<const ForeignLayerDisplayI tem&>(displayItem); | 137 const auto& foreignLayerDisplayItem = static_cast<const ForeignLayerDisplayI tem&>(displayItem); |
136 layerOffset = gfx::Vector2dF(foreignLayerDisplayItem.location().x(), foreign LayerDisplayItem.location().y()); | 138 layerOffset = gfx::Vector2dF(foreignLayerDisplayItem.location().x(), foreign LayerDisplayItem.location().y()); |
137 scoped_refptr<cc::Layer> layer = foreignLayerDisplayItem.layer(); | 139 scoped_refptr<cc::Layer> layer = foreignLayerDisplayItem.layer(); |
138 layer->SetBounds(foreignLayerDisplayItem.bounds()); | 140 layer->SetBounds(foreignLayerDisplayItem.bounds()); |
139 layer->SetIsDrawable(true); | 141 layer->SetIsDrawable(true); |
140 return layer; | 142 return layer; |
141 } | 143 } |
142 | 144 |
143 | 145 |
144 constexpr int kRealRootNodeId = 0; | 146 constexpr int kRealRootNodeId = 0; |
chrishtr
2016/09/14 17:23:46
Please add comments about what these constants are
| |
145 constexpr int kSecondaryRootNodeId = 1; | 147 constexpr int kSecondaryRootNodeId = 1; |
146 constexpr int kPropertyTreeSequenceNumber = 1; | 148 constexpr int kPropertyTreeSequenceNumber = 1; |
147 | 149 |
148 // Creates a minimal set of property trees for the compositor. | 150 // Creates a minimal set of property trees for the compositor. |
149 void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId) | 151 void setMinimalPropertyTrees(cc::PropertyTrees* propertyTrees, int ownerId) |
150 { | 152 { |
151 // cc is hardcoded to use transform node index 1 for device scale and transf orm. | 153 // cc is hardcoded to use transform node index 1 for device scale and transf orm. |
152 cc::TransformTree& transformTree = propertyTrees->transform_tree; | 154 cc::TransformTree& transformTree = propertyTrees->transform_tree; |
153 transformTree.clear(); | 155 transformTree.clear(); |
154 cc::TransformNode& transformNode = *transformTree.Node(transformTree.Insert( cc::TransformNode(), kRealRootNodeId)); | 156 cc::TransformNode& transformNode = *transformTree.Node(transformTree.Insert( cc::TransformNode(), kRealRootNodeId)); |
(...skipping 13 matching lines...) Expand all Loading... | |
168 cc::EffectTree& effectTree = propertyTrees->effect_tree; | 170 cc::EffectTree& effectTree = propertyTrees->effect_tree; |
169 effectTree.clear(); | 171 effectTree.clear(); |
170 cc::EffectNode& effectNode = *effectTree.Node(effectTree.Insert(cc::EffectNo de(), kRealRootNodeId)); | 172 cc::EffectNode& effectNode = *effectTree.Node(effectTree.Insert(cc::EffectNo de(), kRealRootNodeId)); |
171 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); | 173 DCHECK_EQ(effectNode.id, kSecondaryRootNodeId); |
172 effectNode.owner_id = ownerId; | 174 effectNode.owner_id = ownerId; |
173 effectNode.clip_id = clipNode.id; | 175 effectNode.clip_id = clipNode.id; |
174 effectNode.has_render_surface = true; | 176 effectNode.has_render_surface = true; |
175 | 177 |
176 cc::ScrollTree& scrollTree = propertyTrees->scroll_tree; | 178 cc::ScrollTree& scrollTree = propertyTrees->scroll_tree; |
177 scrollTree.clear(); | 179 scrollTree.clear(); |
180 cc::ScrollNode& scrollNode = *scrollTree.Node(scrollTree.Insert(cc::ScrollNo de(), kRealRootNodeId)); | |
181 DCHECK_EQ(scrollNode.id, kSecondaryRootNodeId); | |
182 scrollNode.owner_id = ownerId; | |
183 scrollNode.transform_id = kRealRootNodeId; | |
178 } | 184 } |
179 | 185 |
180 } // namespace | 186 } // namespace |
181 | 187 |
182 scoped_refptr<cc::Layer> PaintArtifactCompositor::layerForPaintChunk(const Paint Artifact& paintArtifact, const PaintChunk& paintChunk, gfx::Vector2dF& layerOffs et) | 188 scoped_refptr<cc::Layer> PaintArtifactCompositor::layerForPaintChunk(const Paint Artifact& paintArtifact, const PaintChunk& paintChunk, gfx::Vector2dF& layerOffs et) |
183 { | 189 { |
184 DCHECK(paintChunk.size()); | 190 DCHECK(paintChunk.size()); |
185 | 191 |
186 // If the paint chunk is a foreign layer, just return that layer. | 192 // If the paint chunk is a foreign layer, just return that layer. |
187 if (scoped_refptr<cc::Layer> foreignLayer = foreignLayerForPaintChunk(paintA rtifact, paintChunk, layerOffset)) | 193 if (scoped_refptr<cc::Layer> foreignLayer = foreignLayerForPaintChunk(paintA rtifact, paintChunk, layerOffset)) |
(...skipping 30 matching lines...) Expand all Loading... | |
218 m_effectStack.append(BlinkEffectAndCcIdPair{nullptr, kSecondaryRootNodeI d}); | 224 m_effectStack.append(BlinkEffectAndCcIdPair{nullptr, kSecondaryRootNodeI d}); |
219 } | 225 } |
220 | 226 |
221 // TODO(pdr): This will need to be unified with how viewport scale works. | 227 // TODO(pdr): This will need to be unified with how viewport scale works. |
222 void setDeviceScaleFactor(float); | 228 void setDeviceScaleFactor(float); |
223 | 229 |
224 int compositorIdForTransformNode(const TransformPaintPropertyNode*); | 230 int compositorIdForTransformNode(const TransformPaintPropertyNode*); |
225 int compositorIdForClipNode(const ClipPaintPropertyNode*); | 231 int compositorIdForClipNode(const ClipPaintPropertyNode*); |
226 int switchToEffectNode(const EffectPaintPropertyNode& nextEffect); | 232 int switchToEffectNode(const EffectPaintPropertyNode& nextEffect); |
227 int compositorIdForCurrentEffectNode() const { return m_effectStack.last().i d; } | 233 int compositorIdForCurrentEffectNode() const { return m_effectStack.last().i d; } |
234 int compositorIdForScrollNode(const ScrollPaintPropertyNode*); | |
235 | |
236 // Scroll offset has special treatment in the transform and scroll trees. | |
237 void updateScrollOffset(int layerId, int scrollId); | |
228 | 238 |
229 private: | 239 private: |
230 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect); | 240 void buildEffectNodesRecursively(const EffectPaintPropertyNode* nextEffect); |
231 | 241 |
232 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } | 242 cc::TransformTree& transformTree() { return m_propertyTrees.transform_tree; } |
233 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } | 243 cc::ClipTree& clipTree() { return m_propertyTrees.clip_tree; } |
234 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; } | 244 cc::EffectTree& effectTree() { return m_propertyTrees.effect_tree; } |
245 cc::ScrollTree& scrollTree() { return m_propertyTrees.scroll_tree; } | |
235 | 246 |
236 const EffectPaintPropertyNode* currentEffectNode() const { return m_effectSt ack.last().effect; } | 247 const EffectPaintPropertyNode* currentEffectNode() const { return m_effectSt ack.last().effect; } |
237 | 248 |
238 // Property trees which should be updated by the manager. | 249 // Property trees which should be updated by the manager. |
239 cc::PropertyTrees& m_propertyTrees; | 250 cc::PropertyTrees& m_propertyTrees; |
240 | 251 |
241 // Layer to which transform "owner" layers should be added. These will not | 252 // Layer to which transform "owner" layers should be added. These will not |
242 // have any actual children, but at present must exist in the tree. | 253 // have any actual children, but at present must exist in the tree. |
243 cc::Layer* m_rootLayer; | 254 cc::Layer* m_rootLayer; |
244 | 255 |
245 // Maps from Blink-side property tree nodes to cc property node indices. | 256 // Maps from Blink-side property tree nodes to cc property node indices. |
246 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; | 257 HashMap<const TransformPaintPropertyNode*, int> m_transformNodeMap; |
247 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; | 258 HashMap<const ClipPaintPropertyNode*, int> m_clipNodeMap; |
259 HashMap<const ScrollPaintPropertyNode*, int> m_scrollNodeMap; | |
248 | 260 |
249 struct BlinkEffectAndCcIdPair { | 261 struct BlinkEffectAndCcIdPair { |
250 const EffectPaintPropertyNode* effect; | 262 const EffectPaintPropertyNode* effect; |
251 int id; | 263 int id; |
252 }; | 264 }; |
253 Vector<BlinkEffectAndCcIdPair> m_effectStack; | 265 Vector<BlinkEffectAndCcIdPair> m_effectStack; |
254 | 266 |
255 #if DCHECK_IS_ON() | 267 #if DCHECK_IS_ON() |
256 HashSet<const EffectPaintPropertyNode*> m_effectNodesConverted; | 268 HashSet<const EffectPaintPropertyNode*> m_effectNodesConverted; |
257 bool m_isFirstEffectEver; | 269 bool m_isFirstEffectEver; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
335 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); | 347 dummyLayer->SetEffectTreeIndex(kSecondaryRootNodeId); |
336 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); | 348 dummyLayer->SetScrollTreeIndex(kRealRootNodeId); |
337 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 349 dummyLayer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
338 | 350 |
339 auto result = m_clipNodeMap.set(clipNode, id); | 351 auto result = m_clipNodeMap.set(clipNode, id); |
340 DCHECK(result.isNewEntry); | 352 DCHECK(result.isNewEntry); |
341 clipTree().set_needs_update(true); | 353 clipTree().set_needs_update(true); |
342 return id; | 354 return id; |
343 } | 355 } |
344 | 356 |
357 int PropertyTreeManager::compositorIdForScrollNode(const ScrollPaintPropertyNode * scrollNode) | |
358 { | |
359 if (!scrollNode) | |
360 return kSecondaryRootNodeId; | |
361 | |
362 auto it = m_scrollNodeMap.find(scrollNode); | |
363 if (it != m_scrollNodeMap.end()) | |
364 return it->value; | |
365 | |
366 int parentId = compositorIdForScrollNode(scrollNode->parent()); | |
367 int id = scrollTree().Insert(cc::ScrollNode(), parentId); | |
368 | |
369 cc::ScrollNode& compositorNode = *scrollTree().Node(id); | |
370 compositorNode.owner_id = parentId; | |
371 | |
372 compositorNode.scrollable = true; | |
373 | |
374 // TODO(pdr): Set main thread scrolling reasons. | |
375 compositorNode.scroll_clip_layer_bounds.SetSize(scrollNode->clip().width(), scrollNode->clip().height()); | |
376 compositorNode.bounds.SetSize(scrollNode->bounds().width(), scrollNode->boun ds().height()); | |
377 compositorNode.user_scrollable_horizontal = scrollNode->userScrollableHorizo ntal(); | |
378 compositorNode.user_scrollable_vertical = scrollNode->userScrollableVertical (); | |
379 compositorNode.transform_id = compositorIdForTransformNode(scrollNode->scrol lOffsetTranslation()); | |
380 | |
381 auto result = m_scrollNodeMap.set(scrollNode, id); | |
382 DCHECK(result.isNewEntry); | |
383 scrollTree().set_needs_update(true); | |
384 | |
385 return id; | |
386 } | |
387 | |
388 void PropertyTreeManager::updateScrollOffset(int layerId, int scrollId) | |
389 { | |
390 cc::ScrollNode& scrollNode = *scrollTree().Node(scrollId); | |
391 cc::TransformNode& transformNode = *transformTree().Node(scrollNode.transfor m_id); | |
392 | |
393 transformNode.scrolls = true; | |
394 | |
395 // Blink creates a 2d transform node just for scroll offset whereas cc's | |
396 // transform node has a special scroll offset field. To handle this we | |
397 // adjust cc's transform node to remove the 2d scroll translation and | |
398 // let the cc scroll tree update the cc scroll offset. | |
399 DCHECK(transformNode.local.IsIdentityOr2DTranslation()); | |
400 auto offset = transformNode.local.To2dTranslation(); | |
401 transformNode.local.MakeIdentity(); | |
402 scrollTree().SetScrollOffset(layerId, gfx::ScrollOffset(-offset.x(), -offset .y())); | |
403 scrollTree().set_needs_update(true); | |
404 } | |
405 | |
345 unsigned depth(const EffectPaintPropertyNode* node) | 406 unsigned depth(const EffectPaintPropertyNode* node) |
346 { | 407 { |
347 unsigned result = 0; | 408 unsigned result = 0; |
348 for (; node; node = node->parent()) | 409 for (; node; node = node->parent()) |
349 result++; | 410 result++; |
350 return result; | 411 return result; |
351 } | 412 } |
352 | 413 |
353 const EffectPaintPropertyNode* lowestCommonAncestor(const EffectPaintPropertyNod e* nodeA, const EffectPaintPropertyNode* nodeB) | 414 const EffectPaintPropertyNode* lowestCommonAncestor(const EffectPaintPropertyNod e* nodeA, const EffectPaintPropertyNode* nodeB) |
354 { | 415 { |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
454 PropertyTreeManager propertyTreeManager(*host->GetLayerTree()->property_tree s(), m_rootLayer.get()); | 515 PropertyTreeManager propertyTreeManager(*host->GetLayerTree()->property_tree s(), m_rootLayer.get()); |
455 propertyTreeManager.setDeviceScaleFactor(host->GetLayerTree()->device_scale_ factor()); | 516 propertyTreeManager.setDeviceScaleFactor(host->GetLayerTree()->device_scale_ factor()); |
456 | 517 |
457 m_contentLayerClients.clear(); | 518 m_contentLayerClients.clear(); |
458 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); | 519 m_contentLayerClients.reserveCapacity(paintArtifact.paintChunks().size()); |
459 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { | 520 for (const PaintChunk& paintChunk : paintArtifact.paintChunks()) { |
460 gfx::Vector2dF layerOffset; | 521 gfx::Vector2dF layerOffset; |
461 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); | 522 scoped_refptr<cc::Layer> layer = layerForPaintChunk(paintArtifact, paint Chunk, layerOffset); |
462 | 523 |
463 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get()); | 524 int transformId = propertyTreeManager.compositorIdForTransformNode(paint Chunk.properties.transform.get()); |
525 int scrollId = propertyTreeManager.compositorIdForScrollNode(paintChunk. properties.scroll.get()); | |
464 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get()); | 526 int clipId = propertyTreeManager.compositorIdForClipNode(paintChunk.prop erties.clip.get()); |
465 int effectId = propertyTreeManager.switchToEffectNode(*paintChunk.proper ties.effect.get()); | 527 int effectId = propertyTreeManager.switchToEffectNode(*paintChunk.proper ties.effect.get()); |
466 | 528 |
529 propertyTreeManager.updateScrollOffset(layer->id(), scrollId); | |
530 | |
467 layer->set_offset_to_transform_parent(layerOffset); | 531 layer->set_offset_to_transform_parent(layerOffset); |
468 | 532 |
469 m_rootLayer->AddChild(layer); | 533 m_rootLayer->AddChild(layer); |
470 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); | 534 layer->set_property_tree_sequence_number(kPropertyTreeSequenceNumber); |
471 layer->SetTransformTreeIndex(transformId); | 535 layer->SetTransformTreeIndex(transformId); |
472 layer->SetClipTreeIndex(clipId); | 536 layer->SetClipTreeIndex(clipId); |
473 layer->SetEffectTreeIndex(effectId); | 537 layer->SetEffectTreeIndex(effectId); |
474 layer->SetScrollTreeIndex(kRealRootNodeId); | 538 layer->SetScrollTreeIndex(scrollId); |
475 | 539 |
476 // TODO(jbroman): This probably shouldn't be necessary, but it is still | 540 // TODO(jbroman): This probably shouldn't be necessary, but it is still |
477 // queried by RenderSurfaceImpl. | 541 // queried by RenderSurfaceImpl. |
478 layer->Set3dSortingContextId(host->GetLayerTree()->property_trees()->tra nsform_tree.Node(transformId)->sorting_context_id); | 542 layer->Set3dSortingContextId(host->GetLayerTree()->property_trees()->tra nsform_tree.Node(transformId)->sorting_context_id); |
479 | 543 |
480 layer->SetShouldCheckBackfaceVisibility(paintChunk.properties.backfaceHi dden); | 544 layer->SetShouldCheckBackfaceVisibility(paintChunk.properties.backfaceHi dden); |
481 | 545 |
482 if (m_extraDataForTestingEnabled) | 546 if (m_extraDataForTestingEnabled) |
483 m_extraDataForTesting->contentLayers.append(layer); | 547 m_extraDataForTesting->contentLayers.append(layer); |
484 } | 548 } |
485 | 549 |
486 // Mark the property trees as having been rebuilt. | 550 // Mark the property trees as having been rebuilt. |
487 host->GetLayerTree()->property_trees()->sequence_number = kPropertyTreeSeque nceNumber; | 551 host->GetLayerTree()->property_trees()->sequence_number = kPropertyTreeSeque nceNumber; |
488 host->GetLayerTree()->property_trees()->needs_rebuild = false; | 552 host->GetLayerTree()->property_trees()->needs_rebuild = false; |
489 } | 553 } |
490 | 554 |
491 } // namespace blink | 555 } // namespace blink |
OLD | NEW |