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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 #ifndef NDEBUG | 87 #ifndef NDEBUG |
88 int m_depth; | 88 int m_depth; |
89 #endif | 89 #endif |
90 }; | 90 }; |
91 | 91 |
92 RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView) | 92 RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView) |
93 : m_renderView(renderView) | 93 : m_renderView(renderView) |
94 , m_rootPlatformLayer(0) | 94 , m_rootPlatformLayer(0) |
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_showDebugBorders(false) | 98 , m_showDebugBorders(false) |
98 , m_showRepaintCounter(false) | 99 , m_showRepaintCounter(false) |
99 , m_compositingConsultsOverlap(true) | 100 , m_compositingConsultsOverlap(true) |
100 , m_compositingDependsOnGeometry(false) | 101 , m_compositingDependsOnGeometry(false) |
101 , m_compositing(false) | 102 , m_compositing(false) |
102 , m_compositingLayersNeedRebuild(false) | 103 , m_compositingLayersNeedRebuild(false) |
103 , m_rootLayerAttachment(RootLayerUnattached) | 104 , m_rootLayerAttachment(RootLayerUnattached) |
104 #if PROFILE_LAYER_REBUILD | 105 #if PROFILE_LAYER_REBUILD |
105 , m_rootLayerUpdateCount(0) | 106 , m_rootLayerUpdateCount(0) |
106 #endif // PROFILE_LAYER_REBUILD | 107 #endif // PROFILE_LAYER_REBUILD |
(...skipping 16 matching lines...) Expand all Loading... |
123 } else | 124 } else |
124 destroyRootPlatformLayer(); | 125 destroyRootPlatformLayer(); |
125 } | 126 } |
126 } | 127 } |
127 | 128 |
128 void RenderLayerCompositor::cacheAcceleratedCompositingFlags() | 129 void RenderLayerCompositor::cacheAcceleratedCompositingFlags() |
129 { | 130 { |
130 bool hasAcceleratedCompositing = false; | 131 bool hasAcceleratedCompositing = false; |
131 bool showDebugBorders = false; | 132 bool showDebugBorders = false; |
132 bool showRepaintCounter = false; | 133 bool showRepaintCounter = false; |
133 | 134 |
134 if (Settings* settings = m_renderView->document()->settings()) { | 135 if (Settings* settings = m_renderView->document()->settings()) { |
135 hasAcceleratedCompositing = settings->acceleratedCompositingEnabled(); | 136 hasAcceleratedCompositing = settings->acceleratedCompositingEnabled(); |
136 showDebugBorders = settings->showDebugBorders(); | 137 showDebugBorders = settings->showDebugBorders(); |
137 showRepaintCounter = settings->showRepaintCounter(); | 138 showRepaintCounter = settings->showRepaintCounter(); |
138 } | 139 } |
139 | 140 |
140 // We allow the chrome to override the settings, in case the page is rendere
d | 141 // We allow the chrome to override the settings, in case the page is rendere
d |
141 // on a chrome that doesn't allow accelerated compositing. | 142 // on a chrome that doesn't allow accelerated compositing. |
142 if (hasAcceleratedCompositing) { | 143 if (hasAcceleratedCompositing) { |
143 Frame* frame = m_renderView->frameView()->frame(); | 144 Frame* frame = m_renderView->frameView()->frame(); |
144 Page* page = frame ? frame->page() : 0; | 145 Page* page = frame ? frame->page() : 0; |
145 if (page) | 146 if (page) { |
146 hasAcceleratedCompositing = page->chrome()->client()->allowsAccelera
tedCompositing(); | 147 ChromeClient* chromeClient = page->chrome()->client(); |
| 148 m_compositingTriggers = chromeClient->allowedCompositingTriggers(); |
| 149 hasAcceleratedCompositing = m_compositingTriggers; |
| 150 } |
147 } | 151 } |
148 | 152 |
149 if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBor
ders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter) | 153 if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBor
ders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter) |
150 setCompositingLayersNeedRebuild(); | 154 setCompositingLayersNeedRebuild(); |
151 | 155 |
152 m_hasAcceleratedCompositing = hasAcceleratedCompositing; | 156 m_hasAcceleratedCompositing = hasAcceleratedCompositing; |
153 m_showDebugBorders = showDebugBorders; | 157 m_showDebugBorders = showDebugBorders; |
154 m_showRepaintCounter = showRepaintCounter; | 158 m_showRepaintCounter = showRepaintCounter; |
155 } | 159 } |
156 | 160 |
| 161 bool RenderLayerCompositor::canRender3DTransforms() const |
| 162 { |
| 163 return hasAcceleratedCompositing() && (m_compositingTriggers & ChromeClient:
:ThreeDTransformTrigger); |
| 164 } |
| 165 |
157 void RenderLayerCompositor::setCompositingLayersNeedRebuild(bool needRebuild) | 166 void RenderLayerCompositor::setCompositingLayersNeedRebuild(bool needRebuild) |
158 { | 167 { |
159 if (inCompositingMode()) | 168 if (inCompositingMode()) |
160 m_compositingLayersNeedRebuild = needRebuild; | 169 m_compositingLayersNeedRebuild = needRebuild; |
161 } | 170 } |
162 | 171 |
163 void RenderLayerCompositor::scheduleSync() | 172 void RenderLayerCompositor::scheduleSync() |
164 { | 173 { |
165 Frame* frame = m_renderView->frameView()->frame(); | 174 Frame* frame = m_renderView->frameView()->frame(); |
166 Page* page = frame ? frame->page() : 0; | 175 Page* page = frame ? frame->page() : 0; |
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1120 if (layer->isReflection()) { | 1129 if (layer->isReflection()) { |
1121 renderer = renderer->parent(); // The RenderReplica's parent is the obje
ct being reflected. | 1130 renderer = renderer->parent(); // The RenderReplica's parent is the obje
ct being reflected. |
1122 layer = toRenderBoxModelObject(renderer)->layer(); | 1131 layer = toRenderBoxModelObject(renderer)->layer(); |
1123 } | 1132 } |
1124 // The root layer always has a compositing layer, but it may not have backin
g. | 1133 // The root layer always has a compositing layer, but it may not have backin
g. |
1125 return requiresCompositingForTransform(renderer) | 1134 return requiresCompositingForTransform(renderer) |
1126 || requiresCompositingForVideo(renderer) | 1135 || requiresCompositingForVideo(renderer) |
1127 || requiresCompositingForCanvas(renderer) | 1136 || requiresCompositingForCanvas(renderer) |
1128 || requiresCompositingForPlugin(renderer) | 1137 || requiresCompositingForPlugin(renderer) |
1129 || requiresCompositingForIFrame(renderer) | 1138 || requiresCompositingForIFrame(renderer) |
1130 || renderer->style()->backfaceVisibility() == BackfaceVisibilityHid
den | 1139 || (canRender3DTransforms() && renderer->style()->backfaceVisibilit
y() == BackfaceVisibilityHidden) |
1131 || clipsCompositingDescendants(layer) | 1140 || clipsCompositingDescendants(layer) |
1132 || requiresCompositingForAnimation(renderer); | 1141 || requiresCompositingForAnimation(renderer); |
1133 } | 1142 } |
1134 | 1143 |
1135 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const | 1144 bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const |
1136 { | 1145 { |
1137 return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer(); | 1146 return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer(); |
1138 } | 1147 } |
1139 | 1148 |
1140 // Return true if the given layer has some ancestor in the RenderLayer hierarchy
that clips, | 1149 // Return true if the given layer has some ancestor in the RenderLayer hierarchy
that clips, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 // layers that it needs to clip. In this case we insert a clipping GraphicsLayer | 1185 // layers that it needs to clip. In this case we insert a clipping GraphicsLayer |
1177 // into the hierarchy between this layer and its children in the z-order hierarc
hy. | 1186 // into the hierarchy between this layer and its children in the z-order hierarc
hy. |
1178 bool RenderLayerCompositor::clipsCompositingDescendants(const RenderLayer* layer
) const | 1187 bool RenderLayerCompositor::clipsCompositingDescendants(const RenderLayer* layer
) const |
1179 { | 1188 { |
1180 return layer->hasCompositingDescendant() && | 1189 return layer->hasCompositingDescendant() && |
1181 (layer->renderer()->hasOverflowClip() || layer->renderer()->hasClip()
); | 1190 (layer->renderer()->hasOverflowClip() || layer->renderer()->hasClip()
); |
1182 } | 1191 } |
1183 | 1192 |
1184 bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* render
er) const | 1193 bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* render
er) const |
1185 { | 1194 { |
| 1195 if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger)) |
| 1196 return false; |
| 1197 |
1186 RenderStyle* style = renderer->style(); | 1198 RenderStyle* style = renderer->style(); |
1187 // Note that we ask the renderer if it has a transform, because the style ma
y have transforms, | 1199 // Note that we ask the renderer if it has a transform, because the style ma
y have transforms, |
1188 // but the renderer may be an inline that doesn't suppport them. | 1200 // but the renderer may be an inline that doesn't suppport them. |
1189 return renderer->hasTransform() && (style->transform().has3DOperation() || s
tyle->transformStyle3D() == TransformStyle3DPreserve3D || style->hasPerspective(
)); | 1201 return renderer->hasTransform() && (style->transform().has3DOperation() || s
tyle->transformStyle3D() == TransformStyle3DPreserve3D || style->hasPerspective(
)); |
1190 } | 1202 } |
1191 | 1203 |
1192 bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer)
const | 1204 bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer)
const |
1193 { | 1205 { |
| 1206 if (!(m_compositingTriggers & ChromeClient::VideoTrigger)) |
| 1207 return false; |
1194 #if ENABLE(VIDEO) | 1208 #if ENABLE(VIDEO) |
1195 if (renderer->isVideo()) { | 1209 if (renderer->isVideo()) { |
1196 RenderVideo* video = toRenderVideo(renderer); | 1210 RenderVideo* video = toRenderVideo(renderer); |
1197 return video->shouldDisplayVideo() && canAccelerateVideoRendering(video)
; | 1211 return video->shouldDisplayVideo() && canAccelerateVideoRendering(video)
; |
1198 } | 1212 } |
1199 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) | 1213 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) |
1200 else if (renderer->isRenderPart()) { | 1214 else if (renderer->isRenderPart()) { |
1201 if (!m_hasAcceleratedCompositing) | 1215 if (!m_hasAcceleratedCompositing) |
1202 return false; | 1216 return false; |
1203 | 1217 |
1204 Node* node = renderer->node(); | 1218 Node* node = renderer->node(); |
1205 if (!node || (!node->hasTagName(HTMLNames::videoTag) && !node->hasTagNam
e(HTMLNames::audioTag))) | 1219 if (!node || (!node->hasTagName(HTMLNames::videoTag) && !node->hasTagNam
e(HTMLNames::audioTag))) |
1206 return false; | 1220 return false; |
1207 | 1221 |
1208 HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(node); | 1222 HTMLMediaElement* mediaElement = static_cast<HTMLMediaElement*>(node); |
1209 return mediaElement->player() ? mediaElement->player()->supportsAccelera
tedRendering() : false; | 1223 return mediaElement->player() ? mediaElement->player()->supportsAccelera
tedRendering() : false; |
1210 } | 1224 } |
1211 #endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO) | 1225 #endif // ENABLE(PLUGIN_PROXY_FOR_VIDEO) |
1212 #else | 1226 #else |
1213 UNUSED_PARAM(renderer); | 1227 UNUSED_PARAM(renderer); |
1214 #endif | 1228 #endif |
1215 return false; | 1229 return false; |
1216 } | 1230 } |
1217 | 1231 |
1218 bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer)
const | 1232 bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer)
const |
1219 { | 1233 { |
| 1234 if (!(m_compositingTriggers & ChromeClient::CanvasTrigger)) |
| 1235 return false; |
| 1236 |
1220 if (renderer->isCanvas()) { | 1237 if (renderer->isCanvas()) { |
1221 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(renderer->no
de()); | 1238 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(renderer->no
de()); |
1222 return canvas->renderingContext() && canvas->renderingContext()->isAccel
erated(); | 1239 return canvas->renderingContext() && canvas->renderingContext()->isAccel
erated(); |
1223 } | 1240 } |
1224 return false; | 1241 return false; |
1225 } | 1242 } |
1226 | 1243 |
1227 bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer)
const | 1244 bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer)
const |
1228 { | 1245 { |
| 1246 if (!(m_compositingTriggers & ChromeClient::PluginTrigger)) |
| 1247 return false; |
| 1248 |
1229 bool composite = (renderer->isEmbeddedObject() && toRenderEmbeddedObject(ren
derer)->allowsAcceleratedCompositing()) | 1249 bool composite = (renderer->isEmbeddedObject() && toRenderEmbeddedObject(ren
derer)->allowsAcceleratedCompositing()) |
1230 || (renderer->isApplet() && toRenderApplet(renderer)->allowsAc
celeratedCompositing()); | 1250 || (renderer->isApplet() && toRenderApplet(renderer)->allowsAc
celeratedCompositing()); |
1231 if (!composite) | 1251 if (!composite) |
1232 return false; | 1252 return false; |
1233 | 1253 |
1234 m_compositingDependsOnGeometry = true; | 1254 m_compositingDependsOnGeometry = true; |
1235 | 1255 |
1236 RenderWidget* pluginRenderer = toRenderWidget(renderer); | 1256 RenderWidget* pluginRenderer = toRenderWidget(renderer); |
1237 // If we can't reliably know the size of the plugin yet, don't change compos
iting state. | 1257 // If we can't reliably know the size of the plugin yet, don't change compos
iting state. |
1238 if (pluginRenderer->needsLayout()) | 1258 if (pluginRenderer->needsLayout()) |
(...skipping 24 matching lines...) Expand all Loading... |
1263 if (renderer->needsLayout()) | 1283 if (renderer->needsLayout()) |
1264 return iframeRenderer->hasLayer() && iframeRenderer->layer()->isComposit
ed(); | 1284 return iframeRenderer->hasLayer() && iframeRenderer->layer()->isComposit
ed(); |
1265 | 1285 |
1266 // Don't go into compositing mode if height or width are zero. | 1286 // Don't go into compositing mode if height or width are zero. |
1267 IntRect contentBox = iframeRenderer->contentBoxRect(); | 1287 IntRect contentBox = iframeRenderer->contentBoxRect(); |
1268 return contentBox.height() * contentBox.width() > 0; | 1288 return contentBox.height() * contentBox.width() > 0; |
1269 } | 1289 } |
1270 | 1290 |
1271 bool RenderLayerCompositor::requiresCompositingForAnimation(RenderObject* render
er) const | 1291 bool RenderLayerCompositor::requiresCompositingForAnimation(RenderObject* render
er) const |
1272 { | 1292 { |
| 1293 if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) |
| 1294 return false; |
| 1295 |
1273 if (AnimationController* animController = renderer->animation()) { | 1296 if (AnimationController* animController = renderer->animation()) { |
1274 return (animController->isRunningAnimationOnRenderer(renderer, CSSProper
tyOpacity) && inCompositingMode()) | 1297 return (animController->isRunningAnimationOnRenderer(renderer, CSSProper
tyOpacity) && inCompositingMode()) |
1275 || animController->isRunningAnimationOnRenderer(renderer, CSSPropert
yWebkitTransform); | 1298 || animController->isRunningAnimationOnRenderer(renderer, CSSPropert
yWebkitTransform); |
1276 } | 1299 } |
1277 return false; | 1300 return false; |
1278 } | 1301 } |
1279 | 1302 |
1280 bool RenderLayerCompositor::requiresCompositingWhenDescendantsAreCompositing(Ren
derObject* renderer) const | 1303 bool RenderLayerCompositor::requiresCompositingWhenDescendantsAreCompositing(Ren
derObject* renderer) const |
1281 { | 1304 { |
1282 return renderer->hasTransform() || renderer->isTransparent() || renderer->ha
sMask() || renderer->hasReflection(); | 1305 return renderer->hasTransform() || renderer->isTransparent() || renderer->ha
sMask() || renderer->hasReflection(); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1521 return true; | 1544 return true; |
1522 } | 1545 } |
1523 } | 1546 } |
1524 return false; | 1547 return false; |
1525 } | 1548 } |
1526 | 1549 |
1527 } // namespace WebCore | 1550 } // namespace WebCore |
1528 | 1551 |
1529 #endif // USE(ACCELERATED_COMPOSITING) | 1552 #endif // USE(ACCELERATED_COMPOSITING) |
1530 | 1553 |
OLD | NEW |