summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderLayerCompositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderLayerCompositor.cpp')
-rw-r--r--WebCore/rendering/RenderLayerCompositor.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/WebCore/rendering/RenderLayerCompositor.cpp b/WebCore/rendering/RenderLayerCompositor.cpp
index e6ea32a..638c628 100644
--- a/WebCore/rendering/RenderLayerCompositor.cpp
+++ b/WebCore/rendering/RenderLayerCompositor.cpp
@@ -100,6 +100,7 @@ RenderLayerCompositor::RenderLayerCompositor(RenderView* renderView)
, m_rootPlatformLayer(0)
, m_updateCompositingLayersTimer(this, &RenderLayerCompositor::updateCompositingLayersTimerFired)
, m_hasAcceleratedCompositing(true)
+ , m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(ChromeClient::AllTriggers))
, m_showDebugBorders(false)
, m_showRepaintCounter(false)
, m_compositingConsultsOverlap(true)
@@ -136,7 +137,7 @@ void RenderLayerCompositor::cacheAcceleratedCompositingFlags()
bool hasAcceleratedCompositing = false;
bool showDebugBorders = false;
bool showRepaintCounter = false;
-
+
if (Settings* settings = m_renderView->document()->settings()) {
hasAcceleratedCompositing = settings->acceleratedCompositingEnabled();
showDebugBorders = settings->showDebugBorders();
@@ -148,18 +149,26 @@ void RenderLayerCompositor::cacheAcceleratedCompositingFlags()
if (hasAcceleratedCompositing) {
Frame* frame = m_renderView->frameView()->frame();
Page* page = frame ? frame->page() : 0;
- if (page)
- hasAcceleratedCompositing = page->chrome()->client()->allowsAcceleratedCompositing();
+ if (page) {
+ ChromeClient* chromeClient = page->chrome()->client();
+ m_compositingTriggers = chromeClient->allowedCompositingTriggers();
+ hasAcceleratedCompositing = m_compositingTriggers;
+ }
}
if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBorders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter)
setCompositingLayersNeedRebuild();
-
+
m_hasAcceleratedCompositing = hasAcceleratedCompositing;
m_showDebugBorders = showDebugBorders;
m_showRepaintCounter = showRepaintCounter;
}
+bool RenderLayerCompositor::canRender3DTransforms() const
+{
+ return hasAcceleratedCompositing() && (m_compositingTriggers & ChromeClient::ThreeDTransformTrigger);
+}
+
void RenderLayerCompositor::setCompositingLayersNeedRebuild(bool needRebuild)
{
if (inCompositingMode())
@@ -1223,7 +1232,7 @@ bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer) c
|| requiresCompositingForCanvas(renderer)
|| requiresCompositingForPlugin(renderer)
|| requiresCompositingForIFrame(renderer)
- || renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden
+ || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
|| clipsCompositingDescendants(layer)
|| requiresCompositingForAnimation(renderer);
}
@@ -1279,6 +1288,9 @@ bool RenderLayerCompositor::clipsCompositingDescendants(const RenderLayer* layer
bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* renderer) const
{
+ if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger))
+ return false;
+
RenderStyle* style = renderer->style();
// Note that we ask the renderer if it has a transform, because the style may have transforms,
// but the renderer may be an inline that doesn't suppport them.
@@ -1287,6 +1299,8 @@ bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* render
bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer) const
{
+ if (!(m_compositingTriggers & ChromeClient::VideoTrigger))
+ return false;
#if ENABLE(VIDEO)
if (renderer->isVideo()) {
RenderVideo* video = toRenderVideo(renderer);
@@ -1313,6 +1327,9 @@ bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer)
bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer) const
{
+ if (!(m_compositingTriggers & ChromeClient::CanvasTrigger))
+ return false;
+
if (renderer->isCanvas()) {
HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(renderer->node());
return canvas->renderingContext() && canvas->renderingContext()->isAccelerated();
@@ -1322,6 +1339,9 @@ bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer)
bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer) const
{
+ if (!(m_compositingTriggers & ChromeClient::PluginTrigger))
+ return false;
+
bool composite = (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing())
|| (renderer->isApplet() && toRenderApplet(renderer)->allowsAcceleratedCompositing());
if (!composite)
@@ -1366,6 +1386,9 @@ bool RenderLayerCompositor::requiresCompositingForIFrame(RenderObject* renderer)
bool RenderLayerCompositor::requiresCompositingForAnimation(RenderObject* renderer) const
{
+ if (!(m_compositingTriggers & ChromeClient::AnimationTrigger))
+ return false;
+
if (AnimationController* animController = renderer->animation()) {
return (animController->isRunningAnimationOnRenderer(renderer, CSSPropertyOpacity) && inCompositingMode())
|| animController->isRunningAnimationOnRenderer(renderer, CSSPropertyWebkitTransform);