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

Side by Side Diff: WebCore/rendering/RenderLayerCompositor.cpp

Issue 5523003: Part 1 of merges for Chromium bug #64589... (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/597/
Patch Set: Created 10 years 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 | « WebCore/rendering/RenderLayerCompositor.h ('k') | WebKit/chromium/src/ChromeClientImpl.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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « WebCore/rendering/RenderLayerCompositor.h ('k') | WebKit/chromium/src/ChromeClientImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698