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

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

Issue 2334403002: Construct cc scroll tree from blink [spv2] (Closed)
Patch Set: Fix horizontal scroll direction Created 4 years, 3 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 | third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp » ('j') | 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"
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/platform/graphics/compositing/PaintArtifactCompositorTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698