OLD | NEW |
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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 #ifndef NDEBUG | 88 #ifndef NDEBUG |
89 int m_depth; | 89 int m_depth; |
90 #endif | 90 #endif |
91 }; | 91 }; |
92 | 92 |
93 RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView) | 93 RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView) |
94 : m_renderView(renderView) | 94 : m_renderView(renderView) |
95 , m_updateCompositingLayersTimer(this, &RenderLayerCompositor::updateComposi
tingLayersTimerFired) | 95 , m_updateCompositingLayersTimer(this, &RenderLayerCompositor::updateComposi
tingLayersTimerFired) |
96 , m_hasAcceleratedCompositing(true) | 96 , m_hasAcceleratedCompositing(true) |
97 , m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(C
hromeClient::AllTriggers)) | 97 , m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(C
hromeClient::AllTriggers)) |
| 98 , m_compositedLayerCount(0) |
98 , m_showDebugBorders(false) | 99 , m_showDebugBorders(false) |
99 , m_showRepaintCounter(false) | 100 , m_showRepaintCounter(false) |
100 , m_compositingConsultsOverlap(true) | 101 , m_compositingConsultsOverlap(true) |
101 , m_compositingDependsOnGeometry(false) | 102 , m_compositingDependsOnGeometry(false) |
102 , m_compositing(false) | 103 , m_compositing(false) |
103 , m_compositingLayersNeedRebuild(false) | 104 , m_compositingLayersNeedRebuild(false) |
104 , m_flushingLayers(false) | 105 , m_flushingLayers(false) |
105 , m_forceCompositingMode(false) | 106 , m_forceCompositingMode(false) |
106 , m_rootLayerAttachment(RootLayerUnattached) | 107 , m_rootLayerAttachment(RootLayerUnattached) |
107 #if PROFILE_LAYER_REBUILD | 108 #if PROFILE_LAYER_REBUILD |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 { | 235 { |
235 if (!m_updateCompositingLayersTimer.isActive()) | 236 if (!m_updateCompositingLayersTimer.isActive()) |
236 m_updateCompositingLayersTimer.startOneShot(0); | 237 m_updateCompositingLayersTimer.startOneShot(0); |
237 } | 238 } |
238 | 239 |
239 void RenderLayerCompositor::updateCompositingLayersTimerFired(Timer<RenderLayerC
ompositor>*) | 240 void RenderLayerCompositor::updateCompositingLayersTimerFired(Timer<RenderLayerC
ompositor>*) |
240 { | 241 { |
241 updateCompositingLayers(); | 242 updateCompositingLayers(); |
242 } | 243 } |
243 | 244 |
| 245 bool RenderLayerCompositor::hasAnyAdditionalCompositedLayers(const RenderLayer*
rootLayer) const |
| 246 { |
| 247 return m_compositedLayerCount > rootLayer->isComposited(); |
| 248 } |
| 249 |
244 void RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType update
Type, RenderLayer* updateRoot) | 250 void RenderLayerCompositor::updateCompositingLayers(CompositingUpdateType update
Type, RenderLayer* updateRoot) |
245 { | 251 { |
246 m_updateCompositingLayersTimer.stop(); | 252 m_updateCompositingLayersTimer.stop(); |
247 | 253 |
248 if (m_forceCompositingMode && !m_compositing) | 254 if (m_forceCompositingMode && !m_compositing) |
249 enableCompositingMode(true); | 255 enableCompositingMode(true); |
250 | 256 |
251 if (!m_compositingDependsOnGeometry && !m_compositing) | 257 if (!m_compositingDependsOnGeometry && !m_compositing) |
252 return; | 258 return; |
253 | 259 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 } | 304 } |
299 | 305 |
300 if (needHierarchyUpdate) { | 306 if (needHierarchyUpdate) { |
301 // Update the hierarchy of the compositing layers. | 307 // Update the hierarchy of the compositing layers. |
302 CompositingState compState(updateRoot); | 308 CompositingState compState(updateRoot); |
303 Vector<GraphicsLayer*> childList; | 309 Vector<GraphicsLayer*> childList; |
304 rebuildCompositingLayerTree(updateRoot, compState, childList); | 310 rebuildCompositingLayerTree(updateRoot, compState, childList); |
305 | 311 |
306 // Host the document layer in the RenderView's root layer. | 312 // Host the document layer in the RenderView's root layer. |
307 if (updateRoot == rootRenderLayer()) { | 313 if (updateRoot == rootRenderLayer()) { |
308 if (childList.isEmpty()) | 314 // Even when childList is empty, don't drop out of compositing mode
if there are |
| 315 // composited layers that we didn't hit in our traversal (e.g. becau
se of visibility:hidden). |
| 316 if (childList.isEmpty() && !hasAnyAdditionalCompositedLayers(updateR
oot)) |
309 destroyRootLayer(); | 317 destroyRootLayer(); |
310 else | 318 else |
311 m_rootContentLayer->setChildren(childList); | 319 m_rootContentLayer->setChildren(childList); |
312 } | 320 } |
313 } else if (needGeometryUpdate) { | 321 } else if (needGeometryUpdate) { |
314 // We just need to do a geometry update. This is only used for position:
fixed scrolling; | 322 // We just need to do a geometry update. This is only used for position:
fixed scrolling; |
315 // most of the time, geometry is updated via RenderLayer::styleChanged()
. | 323 // most of the time, geometry is updated via RenderLayer::styleChanged()
. |
316 updateLayerTreeGeometry(updateRoot); | 324 updateLayerTreeGeometry(updateRoot); |
317 } | 325 } |
318 | 326 |
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 | 771 |
764 // setHasCompositingDescendant() may have changed the answer to needsToBeCom
posited() when clipping, | 772 // setHasCompositingDescendant() may have changed the answer to needsToBeCom
posited() when clipping, |
765 // so test that again. | 773 // so test that again. |
766 if (!willBeComposited && canBeComposited(layer) && clipsCompositingDescendan
ts(layer)) { | 774 if (!willBeComposited && canBeComposited(layer) && clipsCompositingDescendan
ts(layer)) { |
767 if (overlapMap) | 775 if (overlapMap) |
768 addToOverlapMapRecursive(*overlapMap, layer); | 776 addToOverlapMapRecursive(*overlapMap, layer); |
769 willBeComposited = true; | 777 willBeComposited = true; |
770 } | 778 } |
771 | 779 |
772 // If we're back at the root, and no other layers need to be composited, and
the root layer itself doesn't need | 780 // If we're back at the root, and no other layers need to be composited, and
the root layer itself doesn't need |
773 // to be composited, then we can drop out of compositing mode altogether. | 781 // to be composited, then we can drop out of compositing mode altogether. Ho
wever, don't drop out of compositing mode |
774 if (layer->isRootLayer() && !childState.m_subtreeIsCompositing && !requiresC
ompositingLayer(layer) && !m_forceCompositingMode) { | 782 // if there are composited layers that we didn't hit in our traversal (e.g.
because of visibility:hidden). |
| 783 if (layer->isRootLayer() && !childState.m_subtreeIsCompositing && !requiresC
ompositingLayer(layer) && !m_forceCompositingMode && !hasAnyAdditionalComposited
Layers(layer)) { |
775 enableCompositingMode(false); | 784 enableCompositingMode(false); |
776 willBeComposited = false; | 785 willBeComposited = false; |
777 } | 786 } |
778 | 787 |
779 // If the layer is going into compositing mode, repaint its old location. | 788 // If the layer is going into compositing mode, repaint its old location. |
780 ASSERT(willBeComposited == needsToBeComposited(layer)); | 789 ASSERT(willBeComposited == needsToBeComposited(layer)); |
781 if (!layer->isComposited() && willBeComposited) | 790 if (!layer->isComposited() && willBeComposited) |
782 repaintOnCompositingChange(layer); | 791 repaintOnCompositingChange(layer); |
783 | 792 |
784 // Update backing now, so that we can use isComposited() reliably during tre
e traversal in rebuildCompositingLayerTree(). | 793 // Update backing now, so that we can use isComposited() reliably during tre
e traversal in rebuildCompositingLayerTree(). |
(...skipping 1117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1902 if (!viewLayer->isComposited()) | 1911 if (!viewLayer->isComposited()) |
1903 return; | 1912 return; |
1904 | 1913 |
1905 if (GraphicsLayer* rootLayer = viewLayer->backing()->graphicsLayer()) | 1914 if (GraphicsLayer* rootLayer = viewLayer->backing()->graphicsLayer()) |
1906 rootLayer->noteDeviceOrPageScaleFactorChangedIncludingDescendants(); | 1915 rootLayer->noteDeviceOrPageScaleFactorChangedIncludingDescendants(); |
1907 } | 1916 } |
1908 | 1917 |
1909 } // namespace WebCore | 1918 } // namespace WebCore |
1910 | 1919 |
1911 #endif // USE(ACCELERATED_COMPOSITING) | 1920 #endif // USE(ACCELERATED_COMPOSITING) |
OLD | NEW |