Commit 745b5472 authored by abarth@chromium.org's avatar abarth@chromium.org

Simplify CompositingReasonFinder::requiresCompositingForFrame

This CL removes an optimization whereby 0x0 iframes wouldn't get a composited
layer even if they would otherwise have been composited. This optimization was
causing a bunch of awkwardness because it introduced a dependency on layout
information in the CompositingReasonFinder, which caused the reason finder to
need to set a dirty bit in the RenderLayerCompositor.

This CL also prepares us to remove requiresCompositingForFrame into a
RenderPart-specific override of additionalCompositingReasons (after
https://codereview.chromium.org/197533013/ lands).

This CL also changes RenderLayerCompositor::enableCompositingMode to notify
iframes when the root layer is destroyed as well instead of relying upon the
CompositingReasonFinder to write the dirty bit.

R=vollick@chromium.org

Review URL: https://codereview.chromium.org/206243003

git-svn-id: svn://svn.chromium.org/blink/trunk@169679 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 71a4d195
......@@ -46,10 +46,10 @@
if (window.testRunner) {
var haveLayers = window.internals.layerTreeAsText(document) != "";
var result;
if (hadLayers && !haveLayers)
result = "PASS: had layers, and now do not";
if (hadLayers && haveLayers)
result = "PASS: Had layers before and after";
else
result = "FAIL: layers should have gone. hadLayers = " + hadLayers + ", haveLayers = " + haveLayers;
result = "FAIL: Layers should have stayed. hadLayers = " + hadLayers + ", haveLayers = " + haveLayers;
document.getElementById('result').innerHTML = result;
testRunner.notifyDone();
}
......
......@@ -74,7 +74,7 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay
directReasons |= CompositingReasonCanvas;
else if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRequirements))
directReasons |= CompositingReasonPlugin;
else if (requiresCompositingForFrame(renderer, needToRecomputeCompositingRequirements))
else if (requiresCompositingForFrame(renderer))
directReasons |= CompositingReasonIFrame;
if (requiresCompositingForBackfaceVisibilityHidden(renderer))
......@@ -183,33 +183,9 @@ bool CompositingReasonFinder::requiresCompositingForPlugin(RenderObject* rendere
return contentBox.height() * contentBox.width() > 1;
}
bool CompositingReasonFinder::requiresCompositingForFrame(RenderObject* renderer, bool* needToRecomputeCompositingRequirements) const
bool CompositingReasonFinder::requiresCompositingForFrame(RenderObject* renderer) const
{
if (!renderer->isRenderPart())
return false;
RenderPart* frameRenderer = toRenderPart(renderer);
if (!frameRenderer->requiresAcceleratedCompositing())
return false;
if (frameRenderer->node() && frameRenderer->node()->isFrameOwnerElement() && toHTMLFrameOwnerElement(frameRenderer->node())->contentFrame() && toHTMLFrameOwnerElement(frameRenderer->node())->contentFrame()->remotePlatformLayer())
return true;
// FIXME: this seems bogus. If we don't know the layout position/size of the frame yet, wouldn't that be handled elsehwere?
*needToRecomputeCompositingRequirements = true;
RenderLayerCompositor* innerCompositor = RenderLayerCompositor::frameContentsCompositor(frameRenderer);
if (!innerCompositor)
return false;
// If we can't reliably know the size of the iframe yet, don't change compositing state.
if (renderer->needsLayout())
return frameRenderer->hasLayer() && frameRenderer->layer()->hasCompositedLayerMapping();
// Don't go into compositing mode if height or width are zero.
IntRect contentBox = pixelSnappedIntRect(frameRenderer->contentBoxRect());
return contentBox.height() * contentBox.width() > 0;
return renderer->isRenderPart() && toRenderPart(renderer)->requiresAcceleratedCompositing();
}
bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(RenderObject* renderer) const
......
......@@ -41,7 +41,7 @@ private:
bool requiresCompositingForVideo(RenderObject*) const;
bool requiresCompositingForCanvas(RenderObject*) const;
bool requiresCompositingForPlugin(RenderObject*, bool* needToRecomputeCompositingRequirements) const;
bool requiresCompositingForFrame(RenderObject*, bool* needToRecomputeCompositingRequirements) const;
bool requiresCompositingForFrame(RenderObject*) const;
bool requiresCompositingForBackfaceVisibilityHidden(RenderObject*) const;
bool requiresCompositingForFilters(RenderObject*) const;
bool requiresCompositingForOverflowScrollingParent(const RenderLayer*) const;
......
......@@ -219,17 +219,19 @@ RenderLayerCompositor::~RenderLayerCompositor()
ASSERT(m_rootLayerAttachment == RootLayerUnattached);
}
void RenderLayerCompositor::enableCompositingMode(bool enable /* = true */)
void RenderLayerCompositor::enableCompositingMode(bool enable)
{
if (enable != m_compositing) {
m_compositing = enable;
if (enable == m_compositing)
return;
if (m_compositing) {
ensureRootLayer();
notifyIFramesOfCompositingChange();
} else
destroyRootLayer();
}
m_compositing = enable;
if (m_compositing)
ensureRootLayer();
else
destroyRootLayer();
notifyIFramesOfCompositingChange();
}
void RenderLayerCompositor::cacheAcceleratedCompositingFlags()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment