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

Side by Side Diff: Source/core/rendering/RenderLayerCompositor.cpp

Issue 23903012: Set up scroll and clip parents (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Make WebLayer additions pure virtual. Created 7 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/rendering/RenderLayerCompositor.h ('k') | Source/core/testing/Internals.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved. 2 * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 m_secondaryBackingStoreBytes = 0; 432 m_secondaryBackingStoreBytes = 0;
433 433
434 Frame& frame = m_renderView->frameView()->frame(); 434 Frame& frame = m_renderView->frameView()->frame();
435 LOG(Compositing, "\nUpdate %d of %s.\n", m_rootLayerUpdateCount, isMainF rame() ? "main frame" : frame.tree()->uniqueName().string().utf8().data()); 435 LOG(Compositing, "\nUpdate %d of %s.\n", m_rootLayerUpdateCount, isMainF rame() ? "main frame" : frame.tree()->uniqueName().string().utf8().data());
436 } 436 }
437 #endif 437 #endif
438 438
439 if (needHierarchyUpdate) { 439 if (needHierarchyUpdate) {
440 // Update the hierarchy of the compositing layers. 440 // Update the hierarchy of the compositing layers.
441 Vector<GraphicsLayer*> childList; 441 Vector<GraphicsLayer*> childList;
442 HashSet<RenderLayer*> visited;
442 { 443 {
443 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::rebuildCompo sitingLayerTree"); 444 TRACE_EVENT0("blink_rendering", "RenderLayerCompositor::rebuildCompo sitingLayerTree");
444 rebuildCompositingLayerTree(updateRoot, childList, 0); 445 rebuildCompositingLayerTree(updateRoot, childList, visited, 0);
445 } 446 }
446 447
447 // Host the document layer in the RenderView's root layer. 448 // Host the document layer in the RenderView's root layer.
448 if (isFullUpdate) { 449 if (isFullUpdate) {
449 // Even when childList is empty, don't drop out of compositing mode if there are 450 // Even when childList is empty, don't drop out of compositing mode if there are
450 // composited layers that we didn't hit in our traversal (e.g. becau se of visibility:hidden). 451 // composited layers that we didn't hit in our traversal (e.g. becau se of visibility:hidden).
451 if (childList.isEmpty() && !hasAnyAdditionalCompositedLayers(updateR oot)) 452 if (childList.isEmpty() && !hasAnyAdditionalCompositedLayers(updateR oot))
452 destroyRootLayer(); 453 destroyRootLayer();
453 else 454 else
454 m_rootContentLayer->setChildren(childList); 455 m_rootContentLayer->setChildren(childList);
455 } 456 }
456 } else if (needGeometryUpdate) { 457 } else if (needGeometryUpdate) {
457 // We just need to do a geometry update. This is only used for position: fixed scrolling; 458 // We just need to do a geometry update. This is only used for position: fixed scrolling;
458 // most of the time, geometry is updated via RenderLayer::styleChanged() . 459 // most of the time, geometry is updated via RenderLayer::styleChanged() .
459 updateLayerTreeGeometry(updateRoot, 0); 460 HashSet<RenderLayer*> visited;
461 updateLayerTreeGeometry(updateRoot, visited, 0);
460 } 462 }
461 463
462 #if !LOG_DISABLED 464 #if !LOG_DISABLED
463 if (compositingLogEnabled() && isFullUpdate && (needHierarchyUpdate || needG eometryUpdate)) { 465 if (compositingLogEnabled() && isFullUpdate && (needHierarchyUpdate || needG eometryUpdate)) {
464 double endTime = currentTime(); 466 double endTime = currentTime();
465 LOG(Compositing, "Total layers primary secondary obligatory backin g (KB) secondary backing(KB) total backing (KB) update time (ms)\n"); 467 LOG(Compositing, "Total layers primary secondary obligatory backin g (KB) secondary backing(KB) total backing (KB) update time (ms)\n");
466 468
467 LOG(Compositing, "%8d %11d %9d %20.2f %22.2f %22.2f %18.2f\n", 469 LOG(Compositing, "%8d %11d %9d %20.2f %22.2f %22.2f %18.2f\n",
468 m_obligateCompositedLayerCount + m_secondaryCompositedLayerCount, m_ obligateCompositedLayerCount, 470 m_obligateCompositedLayerCount + m_secondaryCompositedLayerCount, m_ obligateCompositedLayerCount,
469 m_secondaryCompositedLayerCount, m_obligatoryBackingStoreBytes / 102 4, m_secondaryBackingStoreBytes / 1024, (m_obligatoryBackingStoreBytes + m_secon daryBackingStoreBytes) / 1024, 1000.0 * (endTime - startTime)); 471 m_secondaryCompositedLayerCount, m_obligatoryBackingStoreBytes / 102 4, m_secondaryBackingStoreBytes / 1024, (m_obligatoryBackingStoreBytes + m_secon daryBackingStoreBytes) / 1024, 1000.0 * (endTime - startTime));
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 } 1040 }
1039 1041
1040 bool RenderLayerCompositor::canAccelerateVideoRendering(RenderVideo* o) const 1042 bool RenderLayerCompositor::canAccelerateVideoRendering(RenderVideo* o) const
1041 { 1043 {
1042 if (!m_hasAcceleratedCompositing) 1044 if (!m_hasAcceleratedCompositing)
1043 return false; 1045 return false;
1044 1046
1045 return o->supportsAcceleratedRendering(); 1047 return o->supportsAcceleratedRendering();
1046 } 1048 }
1047 1049
1048 void RenderLayerCompositor::rebuildCompositingLayerTree(RenderLayer* layer, Vect or<GraphicsLayer*>& childLayersOfEnclosingLayer, int depth) 1050 // The purpose of this function is to ensure that we call rebuildCompostingLayer Tree on curLayer's
1051 // scroll parent (if it has one) before we call it on curLayer. This is necessar y because rebuilding the
1052 // compositing layer tree for curLayer will use values we computed for the scrol l parent. More specifically,
1053 // rebuildCompositingLayreTree will call RenderLayerBacking::updateGraphicsLayer Geometry, and it's this
1054 // function that will pull values from a scroll parent's graphics layers. Unfort unately,
1055 // the childList needs to be populated as if we'd visited all the layers in pain t order. To work around
1056 // this, when we visit a scroll parent out of order, we'll set its additions to childList aside (in
1057 // scrollParentChildLists), and add them to the real childList when we visit the scroll parent in paint
1058 // order.
1059 void RenderLayerCompositor::rebuildCompositingLayerTreeForLayerAndScrollParents( RenderLayer* curLayer, Vector<GraphicsLayer*>& childList, HashSet<RenderLayer*>& visited, HashMap<RenderLayer*, Vector<GraphicsLayer*> >& scrollParentChildLists , int depth)
1060 {
1061 ASSERT(curLayer->zIndex() >= 0 || !visited.contains(curLayer));
1062 if (visited.contains(curLayer)) {
1063 // We've already processed this layer, but since we processed it out of order, its
1064 // contribution to childList was not added. We must do that now.
1065 HashMap<RenderLayer*, Vector<GraphicsLayer*> >::iterator it = scrollPare ntChildLists.find(curLayer);
1066 ASSERT(it != scrollParentChildLists.end());
1067 childList.append(it->value);
1068 scrollParentChildLists.remove(it);
1069 return;
1070 }
1071
1072 if (requiresCompositingForOverflowScrollingParent(curLayer)) {
1073 RenderLayer* scrollParent = curLayer->ancestorScrollingLayer();
1074 if (!visited.contains(scrollParent)) {
1075 ASSERT(!scrollParentChildLists.contains(scrollParent));
1076 // We will populate scrollParentChildList rather than childList, sin ce we're visiting it
1077 // out of order.
1078 Vector<GraphicsLayer*> scrollParentChildList;
1079 rebuildCompositingLayerTreeForLayerAndScrollParents(scrollParent, sc rollParentChildList, visited, scrollParentChildLists, depth);
1080 // We will set aside the scrollParentChildList in scrollParentChildL ists so that we can
1081 // add it to childList when we visit the scrollParent normally.
1082 scrollParentChildLists.add(scrollParent, scrollParentChildList);
1083 }
1084 }
1085
1086 rebuildCompositingLayerTree(curLayer, childList, visited, depth);
1087 }
1088
1089 void RenderLayerCompositor::rebuildCompositingLayerTree(RenderLayer* layer, Vect or<GraphicsLayer*>& childLayersOfEnclosingLayer, HashSet<RenderLayer*>& visited, int depth)
1049 { 1090 {
1050 // Make the layer compositing if necessary, and set up clipping and content layers. 1091 // Make the layer compositing if necessary, and set up clipping and content layers.
1051 // Note that we can only do work here that is independent of whether the des cendant layers 1092 // Note that we can only do work here that is independent of whether the des cendant layers
1052 // have been processed. computeCompositingRequirements() will already have d one the repaint if necessary. 1093 // have been processed. computeCompositingRequirements() will already have d one the repaint if necessary.
1053 1094
1054 // Used for gathering UMA data about the effect on memory usage of promoting all layers 1095 // Used for gathering UMA data about the effect on memory usage of promoting all layers
1055 // that have a webkit-transition on opacity or transform and intersect the v iewport. 1096 // that have a webkit-transition on opacity or transform and intersect the v iewport.
1056 static double pixelsWithoutPromotingAllTransitions = 0.0; 1097 static double pixelsWithoutPromotingAllTransitions = 0.0;
1057 static double pixelsAddedByPromotingAllTransitions = 0.0; 1098 static double pixelsAddedByPromotingAllTransitions = 0.0;
1058 1099
1059 if (!depth) { 1100 if (!depth) {
1060 pixelsWithoutPromotingAllTransitions = 0.0; 1101 pixelsWithoutPromotingAllTransitions = 0.0;
1061 pixelsAddedByPromotingAllTransitions = 0.0; 1102 pixelsAddedByPromotingAllTransitions = 0.0;
1062 } 1103 }
1063 1104
1105 visited.add(layer);
1106
1064 RenderLayerBacking* layerBacking = layer->backing(); 1107 RenderLayerBacking* layerBacking = layer->backing();
1065 if (layerBacking) { 1108 if (layerBacking) {
1066 // The compositing state of all our children has been updated already, s o now 1109 // The compositing state of all our children has been updated already, s o now
1067 // we can compute and cache the composited bounds for this layer. 1110 // we can compute and cache the composited bounds for this layer.
1068 layerBacking->updateCompositedBounds(); 1111 layerBacking->updateCompositedBounds();
1069 1112
1070 if (RenderLayer* reflection = layer->reflectionLayer()) { 1113 if (RenderLayer* reflection = layer->reflectionLayer()) {
1071 if (reflection->backing()) 1114 if (reflection->backing())
1072 reflection->backing()->updateCompositedBounds(); 1115 reflection->backing()->updateCompositedBounds();
1073 } 1116 }
(...skipping 22 matching lines...) Expand all
1096 1139
1097 // If this layer has backing, then we are collecting its children, otherwise appending 1140 // If this layer has backing, then we are collecting its children, otherwise appending
1098 // to the compositing child list of an enclosing layer. 1141 // to the compositing child list of an enclosing layer.
1099 Vector<GraphicsLayer*> layerChildren; 1142 Vector<GraphicsLayer*> layerChildren;
1100 Vector<GraphicsLayer*>& childList = layerBacking ? layerChildren : childLaye rsOfEnclosingLayer; 1143 Vector<GraphicsLayer*>& childList = layerBacking ? layerChildren : childLaye rsOfEnclosingLayer;
1101 1144
1102 #if !ASSERT_DISABLED 1145 #if !ASSERT_DISABLED
1103 LayerListMutationDetector mutationChecker(layer); 1146 LayerListMutationDetector mutationChecker(layer);
1104 #endif 1147 #endif
1105 1148
1149 HashMap<RenderLayer*, Vector<GraphicsLayer*> > scrollParentChildLists;
1106 if (layer->isStackingContainer()) { 1150 if (layer->isStackingContainer()) {
1107 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) { 1151 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) {
1108 size_t listSize = negZOrderList->size(); 1152 size_t listSize = negZOrderList->size();
1109 for (size_t i = 0; i < listSize; ++i) { 1153 for (size_t i = 0; i < listSize; ++i) {
1110 RenderLayer* curLayer = negZOrderList->at(i); 1154 RenderLayer* curLayer = negZOrderList->at(i);
1111 rebuildCompositingLayerTree(curLayer, childList, depth + 1); 1155 rebuildCompositingLayerTreeForLayerAndScrollParents(curLayer, ch ildList, visited, scrollParentChildLists, depth + 1);
1112 } 1156 }
1113 } 1157 }
1114 1158
1115 // If a negative z-order child is compositing, we get a foreground layer which needs to get parented. 1159 // If a negative z-order child is compositing, we get a foreground layer which needs to get parented.
1116 if (layerBacking && layerBacking->foregroundLayer()) 1160 if (layerBacking && layerBacking->foregroundLayer())
1117 childList.append(layerBacking->foregroundLayer()); 1161 childList.append(layerBacking->foregroundLayer());
1118 } 1162 }
1119 1163
1120 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) { 1164 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
1121 size_t listSize = normalFlowList->size(); 1165 size_t listSize = normalFlowList->size();
1122 for (size_t i = 0; i < listSize; ++i) { 1166 for (size_t i = 0; i < listSize; ++i) {
1123 RenderLayer* curLayer = normalFlowList->at(i); 1167 RenderLayer* curLayer = normalFlowList->at(i);
1124 rebuildCompositingLayerTree(curLayer, childList, depth + 1); 1168 rebuildCompositingLayerTreeForLayerAndScrollParents(curLayer, childL ist, visited, scrollParentChildLists, depth + 1);
1125 } 1169 }
1126 } 1170 }
1127 1171
1128 if (layer->isStackingContainer()) { 1172 if (layer->isStackingContainer()) {
1129 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) { 1173 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) {
1130 size_t listSize = posZOrderList->size(); 1174 size_t listSize = posZOrderList->size();
1131 for (size_t i = 0; i < listSize; ++i) { 1175 for (size_t i = 0; i < listSize; ++i) {
1132 RenderLayer* curLayer = posZOrderList->at(i); 1176 RenderLayer* curLayer = posZOrderList->at(i);
1133 rebuildCompositingLayerTree(curLayer, childList, depth + 1); 1177 rebuildCompositingLayerTreeForLayerAndScrollParents(curLayer, ch ildList, visited, scrollParentChildLists, depth + 1);
1134 } 1178 }
1135 } 1179 }
1136 } 1180 }
1137 1181
1138 if (layerBacking) { 1182 if (layerBacking) {
1139 bool parented = false; 1183 bool parented = false;
1140 if (layer->renderer()->isRenderPart()) 1184 if (layer->renderer()->isRenderPart())
1141 parented = parentFrameContentLayers(toRenderPart(layer->renderer())) ; 1185 parented = parentFrameContentLayers(toRenderPart(layer->renderer())) ;
1142 1186
1143 if (!parented) 1187 if (!parented)
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1325 RenderLayerBacking* backing = layer->backing(); 1369 RenderLayerBacking* backing = layer->backing();
1326 GraphicsLayer* hostingLayer = backing->parentForSublayers(); 1370 GraphicsLayer* hostingLayer = backing->parentForSublayers();
1327 GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer(); 1371 GraphicsLayer* rootLayer = innerCompositor->rootGraphicsLayer();
1328 if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != r ootLayer) { 1372 if (hostingLayer->children().size() != 1 || hostingLayer->children()[0] != r ootLayer) {
1329 hostingLayer->removeAllChildren(); 1373 hostingLayer->removeAllChildren();
1330 hostingLayer->addChild(rootLayer); 1374 hostingLayer->addChild(rootLayer);
1331 } 1375 }
1332 return true; 1376 return true;
1333 } 1377 }
1334 1378
1379 // The purpose of this function is to ensure that we call updateLayerTreeGeometr y on layer's
1380 // scroll parent (if it has one) before we call it on layer. This is necessary b ecause updating
1381 // layer tree geometry for layer will use values we computed for its scroll pare nt.
1382 void RenderLayerCompositor::updateLayerTreeGeometryForLayerAndScrollParents(Rend erLayer* layer, HashSet<RenderLayer*>& visited, int depth)
1383 {
1384 ASSERT(layer->zIndex() >= 0 || !visited.contains(layer));
1385 if (visited.contains(layer))
1386 return;
1387
1388 if (requiresCompositingForOverflowScrollingParent(layer)) {
1389 RenderLayer* scrollParent = layer->ancestorScrollingLayer();
1390 if (!visited.contains(scrollParent))
1391 updateLayerTreeGeometryForLayerAndScrollParents(scrollParent, visite d, depth);
1392 }
1393
1394 updateLayerTreeGeometry(layer, visited, depth);
1395 }
1396
1335 // This just updates layer geometry without changing the hierarchy. 1397 // This just updates layer geometry without changing the hierarchy.
1336 void RenderLayerCompositor::updateLayerTreeGeometry(RenderLayer* layer, int dept h) 1398 void RenderLayerCompositor::updateLayerTreeGeometry(RenderLayer* layer, HashSet< RenderLayer*>& visited, int depth)
1337 { 1399 {
1400 visited.add(layer);
1401
1338 if (RenderLayerBacking* layerBacking = layer->backing()) { 1402 if (RenderLayerBacking* layerBacking = layer->backing()) {
1339 // The compositing state of all our children has been updated already, s o now 1403 // The compositing state of all our children has been updated already, s o now
1340 // we can compute and cache the composited bounds for this layer. 1404 // we can compute and cache the composited bounds for this layer.
1341 layerBacking->updateCompositedBounds(); 1405 layerBacking->updateCompositedBounds();
1342 1406
1343 if (RenderLayer* reflection = layer->reflectionLayer()) { 1407 if (RenderLayer* reflection = layer->reflectionLayer()) {
1344 if (reflection->backing()) 1408 if (reflection->backing())
1345 reflection->backing()->updateCompositedBounds(); 1409 reflection->backing()->updateCompositedBounds();
1346 } 1410 }
1347 1411
1348 layerBacking->updateGraphicsLayerConfiguration(); 1412 layerBacking->updateGraphicsLayerConfiguration();
1349 layerBacking->updateGraphicsLayerGeometry(); 1413 layerBacking->updateGraphicsLayerGeometry();
1350 1414
1351 if (!layer->parent()) 1415 if (!layer->parent())
1352 updateRootLayerPosition(); 1416 updateRootLayerPosition();
1353 1417
1354 #if !LOG_DISABLED 1418 #if !LOG_DISABLED
1355 logLayerInfo(layer, depth); 1419 logLayerInfo(layer, depth);
1356 #else 1420 #else
1357 UNUSED_PARAM(depth); 1421 UNUSED_PARAM(depth);
1358 #endif 1422 #endif
1359 } 1423 }
1360 1424
1361 #if !ASSERT_DISABLED 1425 #if !ASSERT_DISABLED
1362 LayerListMutationDetector mutationChecker(layer); 1426 LayerListMutationDetector mutationChecker(layer);
1363 #endif 1427 #endif
1364 1428
1429 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
1430 size_t listSize = normalFlowList->size();
1431 for (size_t i = 0; i < listSize; ++i)
1432 updateLayerTreeGeometry(normalFlowList->at(i), visited, depth + 1);
1433 }
1434
1365 if (layer->isStackingContainer()) { 1435 if (layer->isStackingContainer()) {
1366 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) { 1436 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) {
1367 size_t listSize = negZOrderList->size(); 1437 size_t listSize = negZOrderList->size();
1368 for (size_t i = 0; i < listSize; ++i) 1438 for (size_t i = 0; i < listSize; ++i)
1369 updateLayerTreeGeometry(negZOrderList->at(i), depth + 1); 1439 updateLayerTreeGeometryForLayerAndScrollParents(negZOrderList->a t(i), visited, depth + 1);
1370 } 1440 }
1371 } 1441 }
1372 1442
1373 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
1374 size_t listSize = normalFlowList->size();
1375 for (size_t i = 0; i < listSize; ++i)
1376 updateLayerTreeGeometry(normalFlowList->at(i), depth + 1);
1377 }
1378
1379 if (layer->isStackingContainer()) { 1443 if (layer->isStackingContainer()) {
1380 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) { 1444 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) {
1381 size_t listSize = posZOrderList->size(); 1445 size_t listSize = posZOrderList->size();
1382 for (size_t i = 0; i < listSize; ++i) 1446 for (size_t i = 0; i < listSize; ++i)
1383 updateLayerTreeGeometry(posZOrderList->at(i), depth + 1); 1447 updateLayerTreeGeometryForLayerAndScrollParents(posZOrderList->a t(i), visited, depth + 1);
1384 } 1448 }
1385 } 1449 }
1386 } 1450 }
1387 1451
1452 // The purpose of this function is to ensure that we call updateCompositingDesce ndantGeometry on layer's
1453 // scroll parent (if it has one) before we call it on layer. This is necessary b ecause updating
1454 // layer tree geometry for layer will use values we computed for its scroll pare nt.
1455 void RenderLayerCompositor::updateCompositingDescendantGeometryForLayerAndScroll Parents(RenderLayer* compositingAncestor, RenderLayer* layer, HashSet<RenderLaye r*>& visited, bool compositedChildrenOnly)
1456 {
1457 ASSERT(layer->zIndex() >= 0 || !visited.contains(layer));
1458 if (visited.contains(layer))
1459 return;
1460
1461 if (requiresCompositingForOverflowScrollingParent(layer)) {
1462 RenderLayer* scrollParent = layer->ancestorScrollingLayer();
1463 if (!visited.contains(scrollParent))
1464 updateCompositingDescendantGeometryForLayerAndScrollParents(composit ingAncestor, scrollParent, visited, compositedChildrenOnly);
1465 }
1466
1467 updateCompositingDescendantGeometry(compositingAncestor, layer, visited, com positedChildrenOnly);
1468 }
1469
1388 // Recurs down the RenderLayer tree until its finds the compositing descendants of compositingAncestor and updates their geometry. 1470 // Recurs down the RenderLayer tree until its finds the compositing descendants of compositingAncestor and updates their geometry.
1389 void RenderLayerCompositor::updateCompositingDescendantGeometry(RenderLayer* com positingAncestor, RenderLayer* layer, bool compositedChildrenOnly) 1471 void RenderLayerCompositor::updateCompositingDescendantGeometry(RenderLayer* com positingAncestor, RenderLayer* layer, HashSet<RenderLayer*>& visited, bool compo sitedChildrenOnly)
1390 { 1472 {
1473 visited.add(layer);
1474
1391 if (layer != compositingAncestor) { 1475 if (layer != compositingAncestor) {
1392 if (RenderLayerBacking* layerBacking = layer->backing()) { 1476 if (RenderLayerBacking* layerBacking = layer->backing()) {
1393 layerBacking->updateCompositedBounds(); 1477 layerBacking->updateCompositedBounds();
1394 1478
1395 if (RenderLayer* reflection = layer->reflectionLayer()) { 1479 if (RenderLayer* reflection = layer->reflectionLayer()) {
1396 if (reflection->backing()) 1480 if (reflection->backing())
1397 reflection->backing()->updateCompositedBounds(); 1481 reflection->backing()->updateCompositedBounds();
1398 } 1482 }
1399 1483
1400 layerBacking->updateGraphicsLayerGeometry(); 1484 layerBacking->updateGraphicsLayerGeometry();
1401 if (compositedChildrenOnly) 1485 if (compositedChildrenOnly)
1402 return; 1486 return;
1403 } 1487 }
1404 } 1488 }
1405 1489
1406 if (layer->reflectionLayer()) 1490 if (layer->reflectionLayer())
1407 updateCompositingDescendantGeometry(compositingAncestor, layer->reflecti onLayer(), compositedChildrenOnly); 1491 updateCompositingDescendantGeometry(compositingAncestor, layer->reflecti onLayer(), visited, compositedChildrenOnly);
1408 1492
1409 if (!layer->hasCompositingDescendant()) 1493 if (!layer->hasCompositingDescendant())
1410 return; 1494 return;
1411 1495
1412 #if !ASSERT_DISABLED 1496 #if !ASSERT_DISABLED
1413 LayerListMutationDetector mutationChecker(layer); 1497 LayerListMutationDetector mutationChecker(layer);
1414 #endif 1498 #endif
1415 1499
1416 if (layer->isStackingContainer()) { 1500 if (layer->isStackingContainer()) {
1417 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) { 1501 if (Vector<RenderLayer*>* negZOrderList = layer->negZOrderList()) {
1418 size_t listSize = negZOrderList->size(); 1502 size_t listSize = negZOrderList->size();
1419 for (size_t i = 0; i < listSize; ++i) 1503 for (size_t i = 0; i < listSize; ++i)
1420 updateCompositingDescendantGeometry(compositingAncestor, negZOrd erList->at(i), compositedChildrenOnly); 1504 updateCompositingDescendantGeometryForLayerAndScrollParents(comp ositingAncestor, negZOrderList->at(i), visited, compositedChildrenOnly);
1421 } 1505 }
1422 } 1506 }
1423 1507
1424 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) { 1508 if (Vector<RenderLayer*>* normalFlowList = layer->normalFlowList()) {
1425 size_t listSize = normalFlowList->size(); 1509 size_t listSize = normalFlowList->size();
1426 for (size_t i = 0; i < listSize; ++i) 1510 for (size_t i = 0; i < listSize; ++i)
1427 updateCompositingDescendantGeometry(compositingAncestor, normalFlowL ist->at(i), compositedChildrenOnly); 1511 updateCompositingDescendantGeometryForLayerAndScrollParents(composit ingAncestor, normalFlowList->at(i), visited, compositedChildrenOnly);
1428 } 1512 }
1429 1513
1430 if (layer->isStackingContainer()) { 1514 if (layer->isStackingContainer()) {
1431 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) { 1515 if (Vector<RenderLayer*>* posZOrderList = layer->posZOrderList()) {
1432 size_t listSize = posZOrderList->size(); 1516 size_t listSize = posZOrderList->size();
1433 for (size_t i = 0; i < listSize; ++i) 1517 for (size_t i = 0; i < listSize; ++i)
1434 updateCompositingDescendantGeometry(compositingAncestor, posZOrd erList->at(i), compositedChildrenOnly); 1518 updateCompositingDescendantGeometryForLayerAndScrollParents(comp ositingAncestor, posZOrderList->at(i), visited, compositedChildrenOnly);
1435 } 1519 }
1436 } 1520 }
1437 } 1521 }
1438 1522
1439 1523
1440 void RenderLayerCompositor::repaintCompositedLayers(const IntRect* absRect) 1524 void RenderLayerCompositor::repaintCompositedLayers(const IntRect* absRect)
1441 { 1525 {
1442 recursiveRepaintLayer(rootRenderLayer(), absRect); 1526 recursiveRepaintLayer(rootRenderLayer(), absRect);
1443 } 1527 }
1444 1528
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
1764 1848
1765 return ""; 1849 return "";
1766 } 1850 }
1767 #endif 1851 #endif
1768 1852
1769 // Return true if the given layer has some ancestor in the RenderLayer hierarchy that clips, 1853 // Return true if the given layer has some ancestor in the RenderLayer hierarchy that clips,
1770 // up to the enclosing compositing ancestor. This is required because compositin g layers are parented 1854 // up to the enclosing compositing ancestor. This is required because compositin g layers are parented
1771 // according to the z-order hierarchy, yet clipping goes down the renderer hiera rchy. 1855 // according to the z-order hierarchy, yet clipping goes down the renderer hiera rchy.
1772 // Thus, a RenderLayer can be clipped by a RenderLayer that is an ancestor in th e renderer hierarchy, 1856 // Thus, a RenderLayer can be clipped by a RenderLayer that is an ancestor in th e renderer hierarchy,
1773 // but a sibling in the z-order hierarchy. 1857 // but a sibling in the z-order hierarchy.
1774 bool RenderLayerCompositor::clippedByAncestor(RenderLayer* layer) const 1858 bool RenderLayerCompositor::clippedByAncestor(const RenderLayer* layer) const
1775 { 1859 {
1776 if (!layer->isComposited() || !layer->parent()) 1860 if (!layer->isComposited() || !layer->parent())
1777 return false; 1861 return false;
1778 1862
1779 RenderLayer* compositingAncestor = layer->ancestorCompositingLayer(); 1863 // Scroll children use their scrolling ancestor as their clip root.
1864 RenderLayer* compositingAncestor = requiresCompositingForOverflowScrollingPa rent(layer)
1865 ? layer->ancestorScrollingLayer()
1866 : layer->ancestorCompositingLayer();
1867
1780 if (!compositingAncestor) 1868 if (!compositingAncestor)
1781 return false; 1869 return false;
1782 1870
1783 // If the compositingAncestor clips, that will be taken care of by clipsComp ositingDescendants(), 1871 // If the compositingAncestor clips, that will be taken care of by clipsComp ositingDescendants(),
1784 // so we only care about clipping between its first child that is our ancest or (the computeClipRoot), 1872 // so we only care about clipping between its first child that is our ancest or (the computeClipRoot),
1785 // and layer. 1873 // and layer.
1786 RenderLayer* computeClipRoot = 0; 1874 const RenderLayer* computeClipRoot = 0;
1787 RenderLayer* curr = layer; 1875 const RenderLayer* curr = layer;
1788 while (curr) { 1876 while (curr) {
1789 RenderLayer* next = curr->parent(); 1877 const RenderLayer* next = curr->parent();
1790 if (next == compositingAncestor) { 1878 if (next == compositingAncestor) {
1791 computeClipRoot = curr; 1879 computeClipRoot = curr;
1792 break; 1880 break;
1793 } 1881 }
1794 curr = next; 1882 curr = next;
1795 } 1883 }
1796 1884
1797 if (!computeClipRoot || computeClipRoot == layer) 1885 if (!computeClipRoot || computeClipRoot == layer)
1798 return false; 1886 return false;
1799 1887
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 return renderer->hasFilter(); 2079 return renderer->hasFilter();
1992 } 2080 }
1993 2081
1994 bool RenderLayerCompositor::requiresCompositingForBlending(RenderObject* rendere r) const 2082 bool RenderLayerCompositor::requiresCompositingForBlending(RenderObject* rendere r) const
1995 { 2083 {
1996 return renderer->hasBlendMode(); 2084 return renderer->hasBlendMode();
1997 } 2085 }
1998 2086
1999 bool RenderLayerCompositor::requiresCompositingForOverflowScrollingParent(const RenderLayer* layer) const 2087 bool RenderLayerCompositor::requiresCompositingForOverflowScrollingParent(const RenderLayer* layer) const
2000 { 2088 {
2001 if (!layer->compositorDrivenAcceleratedScrollingEnabled()) 2089 return !!layer->scrollParent();
2002 return false;
2003
2004 // A layer scrolls with its containing block. So to find the overflow scroll ing layer
2005 // that we scroll with respect to, we must ascend the layer tree until we re ach the
2006 // first overflow scrolling div at or above our containing block. I will ref er to this
2007 // layer as our 'scrolling ancestor'.
2008 //
2009 // Now, if we reside in a normal flow list, then we will naturally scroll wi th our scrolling
2010 // ancestor, and we need not be composited. If, on the other hand, we reside in a z-order
2011 // list, and on our walk upwards to our scrolling ancestor we find no layer that is a stacking
2012 // context, then we know that in the stacking tree, we will not be in the su btree rooted at
2013 // our scrolling ancestor, and we will therefore not scroll with it. In this case, we must
2014 // be a composited layer since the compositor will need to take special meas ures to ensure
2015 // that we scroll with our scrolling ancestor and it cannot do this if we do not promote.
2016 RenderLayer* scrollParent = layer->ancestorScrollingLayer();
2017
2018 if (!scrollParent || scrollParent->isStackingContext())
2019 return false;
2020
2021 // If we hit a stacking context on our way up to the ancestor scrolling laye r, it will already
2022 // be composited due to an overflow scrolling parent, so we don't need to.
2023 for (RenderLayer* ancestor = layer->parent(); ancestor && ancestor != scroll Parent; ancestor = ancestor->parent()) {
2024 if (ancestor->isStackingContext())
2025 return false;
2026 }
2027
2028 return true;
2029 } 2090 }
2030 2091
2031 bool RenderLayerCompositor::requiresCompositingForOutOfFlowClipping(const Render Layer* layer) const 2092 bool RenderLayerCompositor::requiresCompositingForOutOfFlowClipping(const Render Layer* layer) const
2032 { 2093 {
2033 return layer->compositorDrivenAcceleratedScrollingEnabled() && layer->isUncl ippedDescendant(); 2094 return layer->compositorDrivenAcceleratedScrollingEnabled() && layer->isUncl ippedDescendant();
2034 } 2095 }
2035 2096
2036 bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* rendere r, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason * viewportConstrainedNotCompositedReason) const 2097 bool RenderLayerCompositor::requiresCompositingForPosition(RenderObject* rendere r, const RenderLayer* layer, RenderLayer::ViewportConstrainedNotCompositedReason * viewportConstrainedNotCompositedReason) const
2037 { 2098 {
2038 // position:fixed elements that create their own stacking context (e.g. have an explicit z-index, 2099 // position:fixed elements that create their own stacking context (e.g. have an explicit z-index,
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
2755 } else if (graphicsLayer == m_scrollLayer.get()) { 2816 } else if (graphicsLayer == m_scrollLayer.get()) {
2756 name = "Frame Scrolling Layer"; 2817 name = "Frame Scrolling Layer";
2757 } else { 2818 } else {
2758 ASSERT_NOT_REACHED(); 2819 ASSERT_NOT_REACHED();
2759 } 2820 }
2760 2821
2761 return name; 2822 return name;
2762 } 2823 }
2763 2824
2764 } // namespace WebCore 2825 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayerCompositor.h ('k') | Source/core/testing/Internals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698