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 @@ ...@@ -29,6 +29,7 @@
#include "core/frame/ConsoleTypes.h" #include "core/frame/ConsoleTypes.h"
#include "core/page/FocusType.h" #include "core/page/FocusType.h"
#include "core/rendering/RenderEmbeddedObject.h" #include "core/rendering/RenderEmbeddedObject.h"
#include "core/rendering/compositing/CompositingTriggers.h"
#include "core/rendering/style/RenderStyleConstants.h" #include "core/rendering/style/RenderStyleConstants.h"
#include "platform/Cursor.h" #include "platform/Cursor.h"
#include "platform/HostWindow.h" #include "platform/HostWindow.h"
...@@ -192,20 +193,8 @@ public: ...@@ -192,20 +193,8 @@ public:
// Pass 0 as the GraphicsLayer to detatch the root layer. // Pass 0 as the GraphicsLayer to detatch the root layer.
virtual void attachRootGraphicsLayer(GraphicsLayer*) = 0; 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. // 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 enterFullScreenForElement(Element*) { }
virtual void exitFullScreenForElement(Element*) { } virtual void exitFullScreenForElement(Element*) { }
......
...@@ -111,4 +111,16 @@ void RenderHTMLCanvas::canvasSizeChanged() ...@@ -111,4 +111,16 @@ void RenderHTMLCanvas::canvasSizeChanged()
setNeedsLayout(); 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 } // namespace WebCore
...@@ -45,6 +45,8 @@ private: ...@@ -45,6 +45,8 @@ private:
virtual const char* renderName() const OVERRIDE { return "RenderHTMLCanvas"; } virtual const char* renderName() const OVERRIDE { return "RenderHTMLCanvas"; }
virtual void paintReplaced(PaintInfo&, const LayoutPoint&) OVERRIDE; virtual void paintReplaced(PaintInfo&, const LayoutPoint&) OVERRIDE;
virtual void intrinsicSizeChanged() OVERRIDE { canvasSizeChanged(); } virtual void intrinsicSizeChanged() OVERRIDE { canvasSizeChanged(); }
virtual CompositingReasons additionalCompositingReasons(CompositingTriggerFlags) const OVERRIDE;
}; };
DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderHTMLCanvas, isCanvas()); DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderHTMLCanvas, isCanvas());
......
...@@ -2784,6 +2784,11 @@ CompositingState RenderObject::compositingState() const ...@@ -2784,6 +2784,11 @@ CompositingState RenderObject::compositingState() const
return hasLayer() ? toRenderLayerModelObject(this)->layer()->compositingState() : NotComposited; return hasLayer() ? toRenderLayerModelObject(this)->layer()->compositingState() : NotComposited;
} }
CompositingReasons RenderObject::additionalCompositingReasons(CompositingTriggerFlags) const
{
return CompositingReasonNone;
}
bool RenderObject::acceleratedCompositingForOverflowScrollEnabled() const bool RenderObject::acceleratedCompositingForOverflowScrollEnabled() const
{ {
const Settings* settings = document().settings(); const Settings* settings = document().settings();
......
...@@ -35,10 +35,12 @@ ...@@ -35,10 +35,12 @@
#include "core/rendering/RenderObjectChildList.h" #include "core/rendering/RenderObjectChildList.h"
#include "core/rendering/ScrollAlignment.h" #include "core/rendering/ScrollAlignment.h"
#include "core/rendering/SubtreeLayoutScope.h" #include "core/rendering/SubtreeLayoutScope.h"
#include "core/rendering/compositing/CompositingTriggers.h"
#include "core/rendering/style/RenderStyle.h" #include "core/rendering/style/RenderStyle.h"
#include "core/rendering/style/StyleInheritedData.h" #include "core/rendering/style/StyleInheritedData.h"
#include "platform/geometry/FloatQuad.h" #include "platform/geometry/FloatQuad.h"
#include "platform/geometry/LayoutRect.h" #include "platform/geometry/LayoutRect.h"
#include "platform/graphics/CompositingReasons.h"
#include "platform/transforms/TransformationMatrix.h" #include "platform/transforms/TransformationMatrix.h"
namespace WebCore { namespace WebCore {
...@@ -676,6 +678,8 @@ public: ...@@ -676,6 +678,8 @@ public:
void collectAnnotatedRegions(Vector<AnnotatedRegionValue>&); void collectAnnotatedRegions(Vector<AnnotatedRegionValue>&);
CompositingState compositingState() const; CompositingState compositingState() const;
virtual CompositingReasons additionalCompositingReasons(CompositingTriggerFlags) const;
bool acceleratedCompositingForOverflowScrollEnabled() const; bool acceleratedCompositingForOverflowScrollEnabled() const;
// FIXME: This is a temporary flag and should be removed once accelerated // FIXME: This is a temporary flag and should be removed once accelerated
// overflow scroll is ready (crbug.com/254111). // overflow scroll is ready (crbug.com/254111).
......
...@@ -276,4 +276,18 @@ LayoutUnit RenderVideo::offsetHeight() const ...@@ -276,4 +276,18 @@ LayoutUnit RenderVideo::offsetHeight() const
return RenderMedia::offsetHeight(); 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 } // namespace WebCore
...@@ -74,6 +74,8 @@ private: ...@@ -74,6 +74,8 @@ private:
virtual LayoutUnit offsetWidth() const OVERRIDE; virtual LayoutUnit offsetWidth() const OVERRIDE;
virtual LayoutUnit offsetHeight() const OVERRIDE; virtual LayoutUnit offsetHeight() const OVERRIDE;
virtual CompositingReasons additionalCompositingReasons(CompositingTriggerFlags) const OVERRIDE;
void updatePlayer(); void updatePlayer();
bool acceleratedRenderingInUse(); bool acceleratedRenderingInUse();
......
...@@ -34,7 +34,7 @@ namespace WebCore { ...@@ -34,7 +34,7 @@ namespace WebCore {
CompositingReasonFinder::CompositingReasonFinder(RenderView& renderView) CompositingReasonFinder::CompositingReasonFinder(RenderView& renderView)
: m_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() ...@@ -45,12 +45,12 @@ void CompositingReasonFinder::updateTriggers()
bool CompositingReasonFinder::has3DTransformTrigger() const bool CompositingReasonFinder::has3DTransformTrigger() const
{ {
return m_compositingTriggers & ChromeClient::ThreeDTransformTrigger; return m_compositingTriggers & ThreeDTransformTrigger;
} }
bool CompositingReasonFinder::hasAnimationTrigger() const bool CompositingReasonFinder::hasAnimationTrigger() const
{ {
return m_compositingTriggers & ChromeClient::AnimationTrigger; return m_compositingTriggers & AnimationTrigger;
} }
bool CompositingReasonFinder::isMainFrame() const bool CompositingReasonFinder::isMainFrame() const
...@@ -68,11 +68,8 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay ...@@ -68,11 +68,8 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay
directReasons |= CompositingReason3DTransform; directReasons |= CompositingReason3DTransform;
// Only zero or one of the following conditions will be true for a given RenderLayer. // Only zero or one of the following conditions will be true for a given RenderLayer.
if (requiresCompositingForVideo(renderer)) // FIXME: These should be handled by overrides of RenderObject::additionalCompositingReasons.
directReasons |= CompositingReasonVideo; if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRequirements))
else if (requiresCompositingForCanvas(renderer))
directReasons |= CompositingReasonCanvas;
else if (requiresCompositingForPlugin(renderer, needToRecomputeCompositingRequirements))
directReasons |= CompositingReasonPlugin; directReasons |= CompositingReasonPlugin;
else if (requiresCompositingForFrame(renderer)) else if (requiresCompositingForFrame(renderer))
directReasons |= CompositingReasonIFrame; directReasons |= CompositingReasonIFrame;
...@@ -104,6 +101,8 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay ...@@ -104,6 +101,8 @@ CompositingReasons CompositingReasonFinder::directReasons(const RenderLayer* lay
if (requiresCompositingForWillChange(renderer)) if (requiresCompositingForWillChange(renderer))
directReasons |= CompositingReasonWillChange; directReasons |= CompositingReasonWillChange;
directReasons |= renderer->additionalCompositingReasons(m_compositingTriggers);
return directReasons; return directReasons;
} }
...@@ -114,7 +113,7 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const ...@@ -114,7 +113,7 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const
if (isMainFrame()) if (isMainFrame())
return false; return false;
if (!(m_compositingTriggers & ChromeClient::ScrollableInnerFrameTrigger)) if (!(m_compositingTriggers & ScrollableInnerFrameTrigger))
return false; return false;
FrameView* frameView = m_renderView.frameView(); FrameView* frameView = m_renderView.frameView();
...@@ -123,7 +122,7 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const ...@@ -123,7 +122,7 @@ bool CompositingReasonFinder::requiresCompositingForScrollableFrame() const
bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* renderer) const bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* renderer) const
{ {
if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger)) if (!(m_compositingTriggers & ThreeDTransformTrigger))
return false; return false;
RenderStyle* style = renderer->style(); RenderStyle* style = renderer->style();
...@@ -132,39 +131,9 @@ bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend ...@@ -132,39 +131,9 @@ bool CompositingReasonFinder::requiresCompositingForTransform(RenderObject* rend
return renderer->hasTransform() && style->transform().has3DOperation(); 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 bool CompositingReasonFinder::requiresCompositingForPlugin(RenderObject* renderer, bool* needToRecomputeCompositingRequirements) const
{ {
if (!(m_compositingTriggers & ChromeClient::PluginTrigger)) if (!(m_compositingTriggers & PluginTrigger))
return false; return false;
if (!renderer->isEmbeddedObject() || !toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing()) if (!renderer->isEmbeddedObject() || !toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing())
...@@ -190,7 +159,7 @@ bool CompositingReasonFinder::requiresCompositingForFrame(RenderObject* renderer ...@@ -190,7 +159,7 @@ bool CompositingReasonFinder::requiresCompositingForFrame(RenderObject* renderer
bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(RenderObject* renderer) const bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(RenderObject* renderer) const
{ {
if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger)) if (!(m_compositingTriggers & ThreeDTransformTrigger))
return false; return false;
return renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden; return renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden;
...@@ -198,7 +167,7 @@ bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(Ren ...@@ -198,7 +167,7 @@ bool CompositingReasonFinder::requiresCompositingForBackfaceVisibilityHidden(Ren
bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* renderer) const bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* renderer) const
{ {
if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) if (!(m_compositingTriggers & AnimationTrigger))
return false; return false;
return shouldCompositeForActiveAnimations(*renderer); return shouldCompositeForActiveAnimations(*renderer);
...@@ -206,7 +175,7 @@ bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend ...@@ -206,7 +175,7 @@ bool CompositingReasonFinder::requiresCompositingForAnimation(RenderObject* rend
bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* renderer) const bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* renderer) const
{ {
if (!(m_compositingTriggers & ChromeClient::AnimationTrigger)) if (!(m_compositingTriggers & AnimationTrigger))
return false; return false;
if (Settings* settings = m_renderView.document().settings()) { if (Settings* settings = m_renderView.document().settings()) {
...@@ -221,7 +190,7 @@ bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* ren ...@@ -221,7 +190,7 @@ bool CompositingReasonFinder::requiresCompositingForTransition(RenderObject* ren
bool CompositingReasonFinder::requiresCompositingForFilters(RenderObject* renderer) const bool CompositingReasonFinder::requiresCompositingForFilters(RenderObject* renderer) const
{ {
if (!(m_compositingTriggers & ChromeClient::FilterTrigger)) if (!(m_compositingTriggers & FilterTrigger))
return false; return false;
return renderer->hasFilter(); return renderer->hasFilter();
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
#ifndef CompositingReasonFinder_h #ifndef CompositingReasonFinder_h
#define CompositingReasonFinder_h #define CompositingReasonFinder_h
#include "core/page/ChromeClient.h"
#include "core/rendering/RenderLayer.h" #include "core/rendering/RenderLayer.h"
#include "core/rendering/compositing/CompositingTriggers.h"
#include "platform/graphics/CompositingReasons.h" #include "platform/graphics/CompositingReasons.h"
namespace WebCore { namespace WebCore {
...@@ -38,8 +38,6 @@ private: ...@@ -38,8 +38,6 @@ private:
bool requiresCompositingForAnimation(RenderObject*) const; bool requiresCompositingForAnimation(RenderObject*) const;
bool requiresCompositingForTransition(RenderObject*) const; bool requiresCompositingForTransition(RenderObject*) const;
bool requiresCompositingForTransform(RenderObject*) const; bool requiresCompositingForTransform(RenderObject*) const;
bool requiresCompositingForVideo(RenderObject*) const;
bool requiresCompositingForCanvas(RenderObject*) const;
bool requiresCompositingForPlugin(RenderObject*, bool* needToRecomputeCompositingRequirements) const; bool requiresCompositingForPlugin(RenderObject*, bool* needToRecomputeCompositingRequirements) const;
bool requiresCompositingForFrame(RenderObject*) const; bool requiresCompositingForFrame(RenderObject*) const;
bool requiresCompositingForBackfaceVisibilityHidden(RenderObject*) const; bool requiresCompositingForBackfaceVisibilityHidden(RenderObject*) const;
...@@ -50,7 +48,7 @@ private: ...@@ -50,7 +48,7 @@ private:
bool requiresCompositingForWillChange(const RenderObject*) const; bool requiresCompositingForWillChange(const RenderObject*) const;
RenderView& m_renderView; RenderView& m_renderView;
ChromeClient::CompositingTriggerFlags m_compositingTriggers; CompositingTriggerFlags m_compositingTriggers;
}; };
} // namespace WebCore } // 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) ...@@ -711,27 +711,27 @@ void ChromeClientImpl::attachRootGraphicsLayer(GraphicsLayer* rootLayer)
m_webView->setRootGraphicsLayer(rootLayer); m_webView->setRootGraphicsLayer(rootLayer);
} }
ChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const WebCore::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
{ {
if (!m_webView->allowsAcceleratedCompositing()) if (!m_webView->allowsAcceleratedCompositing())
return 0; return 0;
CompositingTriggerFlags flags = 0; WebCore::CompositingTriggerFlags flags = 0;
Settings& settings = m_webView->page()->settings(); Settings& settings = m_webView->page()->settings();
if (settings.acceleratedCompositingFor3DTransformsEnabled()) if (settings.acceleratedCompositingFor3DTransformsEnabled())
flags |= ThreeDTransformTrigger; flags |= WebCore::ThreeDTransformTrigger;
if (settings.acceleratedCompositingForVideoEnabled()) if (settings.acceleratedCompositingForVideoEnabled())
flags |= VideoTrigger; flags |= WebCore::VideoTrigger;
if (settings.acceleratedCompositingForPluginsEnabled()) if (settings.acceleratedCompositingForPluginsEnabled())
flags |= PluginTrigger; flags |= WebCore::PluginTrigger;
if (settings.acceleratedCompositingForAnimationEnabled()) if (settings.acceleratedCompositingForAnimationEnabled())
flags |= AnimationTrigger; flags |= WebCore::AnimationTrigger;
if (settings.acceleratedCompositingForCanvasEnabled()) if (settings.acceleratedCompositingForCanvasEnabled())
flags |= CanvasTrigger; flags |= WebCore::CanvasTrigger;
if (settings.acceleratedCompositingForScrollableFramesEnabled()) if (settings.acceleratedCompositingForScrollableFramesEnabled())
flags |= ScrollableInnerFrameTrigger; flags |= WebCore::ScrollableInnerFrameTrigger;
if (settings.acceleratedCompositingForFiltersEnabled()) if (settings.acceleratedCompositingForFiltersEnabled())
flags |= FilterTrigger; flags |= WebCore::FilterTrigger;
return flags; return flags;
} }
......
...@@ -148,7 +148,7 @@ public: ...@@ -148,7 +148,7 @@ public:
// Pass 0 as the GraphicsLayer to detatch the root layer. // Pass 0 as the GraphicsLayer to detatch the root layer.
virtual void attachRootGraphicsLayer(WebCore::GraphicsLayer*) OVERRIDE; 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 enterFullScreenForElement(WebCore::Element*) OVERRIDE;
virtual void exitFullScreenForElement(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