Commit f4b9ce54 authored by abarth@chromium.org's avatar abarth@chromium.org

CompositingReasonFinder should use a virtual function instead of a nest of branches

This CL begins to move CompositingReasonFinder to using a virtual function on
RenderObject instead of a nest of "if video, if canvas" branches. This CL only creates
two overrides, one for video and one for canvas. A future CL will create
overrides for plugins and iframes, but there's some cleanup work we need to do first.

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

git-svn-id: svn://svn.chromium.org/blink/trunk@169685 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 9a2443b0
......@@ -29,6 +29,7 @@
#include "core/frame/ConsoleTypes.h"
#include "core/page/FocusType.h"
#include "core/rendering/RenderEmbeddedObject.h"
#include "core/rendering/compositing/CompositingTriggers.h"
#include "core/rendering/style/RenderStyleConstants.h"
#include "platform/Cursor.h"
#include "platform/HostWindow.h"
......@@ -192,20 +193,8 @@ public:
// Pass 0 as the GraphicsLayer to detatch the root layer.
virtual void attachRootGraphicsLayer(GraphicsLayer*) = 0;
enum CompositingTrigger {
ThreeDTransformTrigger = 1 << 0,
VideoTrigger = 1 << 1,
PluginTrigger = 1 << 2,
CanvasTrigger = 1 << 3,
AnimationTrigger = 1 << 4,
FilterTrigger = 1 << 5,
ScrollableInnerFrameTrigger = 1 << 6,
AllTriggers = 0xFFFFFFFF
};
typedef unsigned CompositingTriggerFlags;
// Returns a bitfield indicating conditions that can trigger the compositor.
virtual CompositingTriggerFlags allowedCompositingTriggers() const { return static_cast<CompositingTriggerFlags>(AllTriggers); }
virtual CompositingTriggerFlags allowedCompositingTriggers() const { return static_cast<CompositingTriggerFlags>(AllCompositingTriggers); }
virtual void enterFullScreenForElement(Element*) { }
virtual void exitFullScreenForElement(Element*) { }
......
......@@ -111,4 +111,16 @@ void RenderHTMLCanvas::canvasSizeChanged()
setNeedsLayout();
}
CompositingReasons RenderHTMLCanvas::additionalCompositingReasons(CompositingTriggerFlags triggers) const
{
if (!(triggers & CanvasTrigger))
return CompositingReasonNone;
HTMLCanvasElement* canvas = toHTMLCanvasElement(node());
if (canvas->renderingContext() && canvas->renderingContext()->isAccelerated())
return CompositingReasonCanvas;
return CompositingReasonNone;
}
} // namespace WebCore
......@@ -45,6 +45,8 @@ private:
virtual const char* renderName() const OVERRIDE { return "RenderHTMLCanvas"; }
virtual void paintReplaced(PaintInfo&, const LayoutPoint&) OVERRIDE;
virtual void intrinsicSizeChanged() OVERRIDE { canvasSizeChanged(); }
virtual CompositingReasons additionalCompositingReasons(CompositingTriggerFlags) const OVERRIDE;
};
DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderHTMLCanvas, isCanvas());
......
......@@ -2784,6 +2784,11 @@ CompositingState RenderObject::compositingState() const
return hasLayer() ? toRenderLayerModelObject(this)->layer()->compositingState() : NotComposited;
}
CompositingReasons RenderObject::additionalCompositingReasons(CompositingTriggerFlags) const
{
return CompositingReasonNone;
}
bool RenderObject::acceleratedCompositingForOverflowScrollEnabled() const
{
const Settings* settings = document().settings();
......
......@@ -35,10 +35,12 @@
#include "core/rendering/RenderObjectChildList.h"
#include "core/rendering/ScrollAlignment.h"
#include "core/rendering/SubtreeLayoutScope.h"
#include "core/rendering/compositing/CompositingTriggers.h"
#include "core/rendering/style/RenderStyle.h"
#include "core/rendering/style/StyleInheritedData.h"
#include "platform/geometry/FloatQuad.h"
#include "platform/geometry/LayoutRect.h"
#include "platform/graphics/CompositingReasons.h"
#include "platform/transforms/TransformationMatrix.h"
namespace WebCore {
......@@ -676,6 +678,8 @@ public:
void collectAnnotatedRegions(Vector<AnnotatedRegionValue>&);
CompositingState compositingState() const;
virtual CompositingReasons additionalCompositingReasons(CompositingTriggerFlags) const;
bool acceleratedCompositingForOverflowScrollEnabled() const;
// FIXME: This is a temporary flag and should be removed once accelerated
// overflow scroll is ready (crbug.com/254111).
......
......@@ -276,4 +276,18 @@ LayoutUnit RenderVideo::offsetHeight() const
return RenderMedia::offsetHeight();
}
CompositingReasons RenderVideo::additionalCompositingReasons(CompositingTriggerFlags triggers) const
{
if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled()) {
HTMLMediaElement* media = toHTMLMediaElement(node());
if (media->isFullscreen())
return CompositingReasonVideo;
}
if ((triggers & VideoTrigger) && shouldDisplayVideo() && supportsAcceleratedRendering())
return CompositingReasonVideo;
return CompositingReasonNone;
}
} // namespace WebCore
......@@ -74,6 +74,8 @@ private:
virtual LayoutUnit offsetWidth() const OVERRIDE;
virtual LayoutUnit offsetHeight() const OVERRIDE;
virtual CompositingReasons additionalCompositingReasons(CompositingTriggerFlags) const OVERRIDE;
void updatePlayer();
bool acceleratedRenderingInUse();
......
......@@ -34,7 +34,7 @@ namespace WebCore {
CompositingReasonFinder::CompositingReasonFinder(RenderView& renderView)
: m_renderView(renderView)
, m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(ChromeClient::AllTriggers))
, m_compositingTriggers(static_cast<CompositingTriggerFlags>(AllCompositingTriggers))
{
}
......@@ -45,12 +45,12 @@ void CompositingReasonFinder::updateTriggers()
bool CompositingReasonFinder::has3DTransformTrigger() const
{
return m_compositingTriggers & ChromeClient::ThreeDTransformTrigger;
return m_compositingTriggers & ThreeDTransformTrigger;
}
bool CompositingReasonFinder::hasAnimationTrigger() const
{
return m_compositingTriggers & ChromeClient::AnimationTrigger;
return m_compositingTriggers & AnimationTrigger;
}
bool CompositingReasonFinder::isMainFrame() const
......@@ -68,11 +68,8 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay
directReasons |= CompositingReason3DTransform;
// Only zero or one of the following conditions will be true for a given RenderLayer.
if (requiresCompositingForVideo(renderer))
directReasons |= CompositingReasonVideo;
else if (requiresCompositingForCanvas(renderer))
directReasons |= CompositingReasonCanvas;
else if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRequirements))
// FIXME: These should be handled by overrides of RenderObject::additionalCompositingReasons.
if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRequirements))
directReasons |= CompositingReasonPlugin;
else if (requiresCompositingForFrame(renderer))
directReasons |= CompositingReasonIFrame;
......@@ -104,6 +101,8 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay
if (requiresCompositingForWillChange(renderer))
directReasons |= CompositingReasonWillChange;
directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers);
return directReasons;
}
......@@ -114,7 +113,7 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const
if (isMainFrame())
return false;
if (!(m_compositingTriggers & ChromeClient::ScrollableInnerFrameTrigger))
if (!(m_compositingTriggers & ScrollableInnerFrameTrigger))
return false;
FrameView* frameView = m_renderView.frameView();
......@@ -123,7 +122,7 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const
bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* renderer) const
{
if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger))
if (!(m_compositingTriggers & ThreeDTransformTrigger))
return false;
RenderStyle* style = renderer->style();
......@@ -132,39 +131,9 @@ bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend
return renderer->hasTransform() && style->transform().has3DOperation();
}
bool CompositingReasonFinder::requiresCompositingForVideo(RenderObject* renderer) const
{
if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled() && renderer->isVideo()) {
HTMLMediaElement* media = toHTMLMediaElement(renderer->node());
if (media->isFullscreen())
return true;
}
if (!(m_compositingTriggers & ChromeClient::VideoTrigger))
return false;
if (renderer->isVideo()) {
RenderVideo* video = toRenderVideo(renderer);
return video->shouldDisplayVideo() && video->supportsAcceleratedRendering();
}
return false;
}
bool CompositingReasonFinder::requiresCompositingForCanvas(RenderObject* renderer) const
{
if (!(m_compositingTriggers & ChromeClient::CanvasTrigger))
return false;
if (renderer->isCanvas()) {
HTMLCanvasElement* canvas = toHTMLCanvasElement(renderer->node());
return canvas->renderingContext() && canvas->renderingContext()->isAccelerated();
}
return false;
}
bool CompositingReasonFinder::requiresCompositingForPlugin(RenderObject* renderer, bool* needToRecomputeCompositingRequirements) const
{
if (!(m_compositingTriggers & ChromeClient::PluginTrigger))
if (!(m_compositingTriggers & PluginTrigger))
return false;
if (!renderer->isEmbeddedObject() || !toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing())
......@@ -190,7 +159,7 @@ bool CompositingReasonFinder::requiresCompositingForFrame(RenderObject* renderer
bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(RenderObject* renderer) const
{
if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger))
if (!(m_compositingTriggers & ThreeDTransformTrigger))
return false;
return renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden;
......@@ -198,7 +167,7 @@ bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(Ren
bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* renderer) const
{
if (!(m_compositingTriggers & ChromeClient::AnimationTrigger))
if (!(m_compositingTriggers & AnimationTrigger))
return false;
return shouldCompositeForActiveAnimations(*renderer);
......@@ -206,7 +175,7 @@ bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend
bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* renderer) const
{
if (!(m_compositingTriggers & ChromeClient::AnimationTrigger))
if (!(m_compositingTriggers & AnimationTrigger))
return false;
if (Settings* settings = m_renderView.document().settings()) {
......@@ -221,7 +190,7 @@ bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* ren
bool CompositingReasonFinder::requiresCompositingForFilters(RenderObject* renderer) const
{
if (!(m_compositingTriggers & ChromeClient::FilterTrigger))
if (!(m_compositingTriggers & FilterTrigger))
return false;
return renderer->hasFilter();
......
......@@ -5,8 +5,8 @@
#ifndef CompositingReasonFinder_h
#define CompositingReasonFinder_h
#include "core/page/ChromeClient.h"
#include "core/rendering/RenderLayer.h"
#include "core/rendering/compositing/CompositingTriggers.h"
#include "platform/graphics/CompositingReasons.h"
namespace WebCore {
......@@ -38,8 +38,6 @@ private:
bool requiresCompositingForAnimation(RenderObject*) const;
bool requiresCompositingForTransition(RenderObject*) const;
bool requiresCompositingForTransform(RenderObject*) const;
bool requiresCompositingForVideo(RenderObject*) const;
bool requiresCompositingForCanvas(RenderObject*) const;
bool requiresCompositingForPlugin(RenderObject*, bool* needToRecomputeCompositingRequirements) const;
bool requiresCompositingForFrame(RenderObject*) const;
bool requiresCompositingForBackfaceVisibilityHidden(RenderObject*) const;
......@@ -50,7 +48,7 @@ private:
bool requiresCompositingForWillChange(const RenderObject*) const;
RenderView& m_renderView;
ChromeClient::CompositingTriggerFlags m_compositingTriggers;
CompositingTriggerFlags m_compositingTriggers;
};
} // namespace WebCore
......
/*
* Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple, Inc. All rights reserved.
* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
* Copyright (C) 2012 Samsung Electronics. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef CompositingTriggers_h
#define CompositingTriggers_h
namespace WebCore {
enum CompositingTrigger {
ThreeDTransformTrigger = 1 << 0,
VideoTrigger = 1 << 1,
PluginTrigger = 1 << 2,
CanvasTrigger = 1 << 3,
AnimationTrigger = 1 << 4,
FilterTrigger = 1 << 5,
ScrollableInnerFrameTrigger = 1 << 6,
AllCompositingTriggers = 0xFFFFFFFF
};
typedef unsigned CompositingTriggerFlags;
}
#endif
......@@ -711,27 +711,27 @@ void ChromeClientImpl::attachRootGraphicsLayer(GraphicsLayer* rootLayer)
m_webView->setRootGraphicsLayer(rootLayer);
}
ChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
WebCore::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
{
if (!m_webView->allowsAcceleratedCompositing())
return 0;
CompositingTriggerFlags flags = 0;
WebCore::CompositingTriggerFlags flags = 0;
Settings& settings = m_webView->page()->settings();
if (settings.acceleratedCompositingFor3DTransformsEnabled())
flags |= ThreeDTransformTrigger;
flags |= WebCore::ThreeDTransformTrigger;
if (settings.acceleratedCompositingForVideoEnabled())
flags |= VideoTrigger;
flags |= WebCore::VideoTrigger;
if (settings.acceleratedCompositingForPluginsEnabled())
flags |= PluginTrigger;
flags |= WebCore::PluginTrigger;
if (settings.acceleratedCompositingForAnimationEnabled())
flags |= AnimationTrigger;
flags |= WebCore::AnimationTrigger;
if (settings.acceleratedCompositingForCanvasEnabled())
flags |= CanvasTrigger;
flags |= WebCore::CanvasTrigger;
if (settings.acceleratedCompositingForScrollableFramesEnabled())
flags |= ScrollableInnerFrameTrigger;
flags |= WebCore::ScrollableInnerFrameTrigger;
if (settings.acceleratedCompositingForFiltersEnabled())
flags |= FilterTrigger;
flags |= WebCore::FilterTrigger;
return flags;
}
......
......@@ -148,7 +148,7 @@ public:
// Pass 0 as the GraphicsLayer to detatch the root layer.
virtual void attachRootGraphicsLayer(WebCore::GraphicsLayer*) OVERRIDE;
virtual CompositingTriggerFlags allowedCompositingTriggers() const OVERRIDE;
virtual WebCore::CompositingTriggerFlags allowedCompositingTriggers() const OVERRIDE;
virtual void enterFullScreenForElement(WebCore::Element*) OVERRIDE;
virtual void exitFullScreenForElement(WebCore::Element*) OVERRIDE;
......
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