| 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 |