Changeset 72954 in webkit


Ignore:
Timestamp:
Nov 30, 2010 12:41:59 PM (13 years ago)
Author:
vangelis@chromium.org
Message:

2010-11-29 Vangelis Kokkevis <vangelis@chromium.org>

Reviewed by Simon Fraser.

Provide more fine grained control to ports over when to turn on accelerated
compositing.
https://bugs.webkit.org/show_bug.cgi?id=49998

As part of this change, the old hasAcceleratedCompositing method on the ChromeClient
has now been replaced by allowedCompositingTriggers which returns a bitfield of
all the features which can trigger the compositor.

  • src/ChromeClientImpl.cpp: (WebKit::ChromeClientImpl::allowedCompositingTriggers):
  • src/ChromeClientImpl.h:

2010-11-29 Vangelis Kokkevis <vangelis@chromium.org>

Reviewed by Simon Fraser.

Provide more fine grained control to ports over when to turn on accelerated
compositing.
https://bugs.webkit.org/show_bug.cgi?id=49998

As part of this change, the old hasAcceleratedCompositing method on the ChromeClient
has now been replaced by allowedCompositingTriggers which returns a bitfield of
all the features which can trigger the compositor.

  • WebCoreSupport/ChromeClientQt.cpp: (WebCore::ChromeClientQt::allowedCompositingTriggers):
  • WebCoreSupport/ChromeClientQt.h:

2010-11-30 Vangelis Kokkevis <vangelis@chromium.org>

Reviewed by Simon Fraser.

Provide more fine grained control to ports over when to turn on
accelerated compositing.
https://bugs.webkit.org/show_bug.cgi?id=49998

The RenderLayerCompositor now checks with the chrome client whether
3d transforms, video, plugins, canvas and animation require
switching over to the composited path. Layers that overlap composited
content will still turn into composited layers regardless of the
setting.

  • css/MediaQueryEvaluator.cpp: (WebCore::transform_3dMediaFeatureEval):
  • page/ChromeClient.h: (WebCore::ChromeClient::allowedCompositingTriggers):
  • rendering/RenderLayer.cpp: (WebCore::RenderLayer::canRender3DTransforms): (WebCore::RenderLayer::updateTransform): (WebCore::RenderLayer::currentTransform):
  • rendering/RenderLayer.h:
  • rendering/RenderLayerBacking.cpp: (WebCore::RenderLayerBacking::updateLayerTransform):
  • rendering/RenderLayerCompositor.cpp: (WebCore::RenderLayerCompositor::RenderLayerCompositor): (WebCore::RenderLayerCompositor::cacheAcceleratedCompositingFlags): (WebCore::RenderLayerCompositor::canRender3DTransforms): (WebCore::RenderLayerCompositor::requiresCompositingLayer): (WebCore::RenderLayerCompositor::requiresCompositingForTransform): (WebCore::RenderLayerCompositor::requiresCompositingForVideo): (WebCore::RenderLayerCompositor::requiresCompositingForCanvas): (WebCore::RenderLayerCompositor::requiresCompositingForPlugin): (WebCore::RenderLayerCompositor::requiresCompositingForAnimation):
  • rendering/RenderLayerCompositor.h:
Location:
trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r72951 r72954  
     12010-11-30  Vangelis Kokkevis  <vangelis@chromium.org>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Provide more fine grained control to ports over when to turn on
     6        accelerated compositing.
     7        https://bugs.webkit.org/show_bug.cgi?id=49998
     8
     9        The RenderLayerCompositor now checks with the chrome client whether
     10        3d transforms, video, plugins, canvas and animation require
     11        switching over to the composited path. Layers that overlap composited
     12        content will still turn into composited layers regardless of the
     13        setting.
     14
     15        * css/MediaQueryEvaluator.cpp:
     16        (WebCore::transform_3dMediaFeatureEval):
     17        * page/ChromeClient.h:
     18        (WebCore::ChromeClient::allowedCompositingTriggers):
     19        * rendering/RenderLayer.cpp:
     20        (WebCore::RenderLayer::canRender3DTransforms):
     21        (WebCore::RenderLayer::updateTransform):
     22        (WebCore::RenderLayer::currentTransform):
     23        * rendering/RenderLayer.h:
     24        * rendering/RenderLayerBacking.cpp:
     25        (WebCore::RenderLayerBacking::updateLayerTransform):
     26        * rendering/RenderLayerCompositor.cpp:
     27        (WebCore::RenderLayerCompositor::RenderLayerCompositor):
     28        (WebCore::RenderLayerCompositor::cacheAcceleratedCompositingFlags):
     29        (WebCore::RenderLayerCompositor::canRender3DTransforms):
     30        (WebCore::RenderLayerCompositor::requiresCompositingLayer):
     31        (WebCore::RenderLayerCompositor::requiresCompositingForTransform):
     32        (WebCore::RenderLayerCompositor::requiresCompositingForVideo):
     33        (WebCore::RenderLayerCompositor::requiresCompositingForCanvas):
     34        (WebCore::RenderLayerCompositor::requiresCompositingForPlugin):
     35        (WebCore::RenderLayerCompositor::requiresCompositingForAnimation):
     36        * rendering/RenderLayerCompositor.h:
     37
    1382010-11-30  Xan Lopez  <xlopez@igalia.com>
    239
  • trunk/WebCore/css/MediaQueryEvaluator.cpp

    r66968 r72954  
    481481#if USE(ACCELERATED_COMPOSITING)
    482482    if (RenderView* view = frame->contentRenderer())
    483         threeDEnabled = view->compositor()->hasAcceleratedCompositing();
     483        threeDEnabled = view->compositor()->canRender3DTransforms();
    484484#endif
    485485
  • trunk/WebCore/page/ChromeClient.h

    r71541 r72954  
    237237        // regardless of the settings.
    238238        virtual bool allowsAcceleratedCompositing() const { return true; }
     239
     240        enum CompositingTrigger {
     241            ThreeDTransformTrigger = 1 << 0,
     242            VideoTrigger = 1 << 1,
     243            PluginTrigger = 1 << 2,
     244            CanvasTrigger = 1 << 3,
     245            AnimationTrigger = 1 << 4,
     246            AllTriggers = 0xFFFFFFFF
     247        };
     248        typedef unsigned CompositingTriggerFlags;
     249
     250        // Returns a bitfield indicating conditions that can trigger the compositor.
     251        virtual CompositingTriggerFlags allowedCompositingTriggers() const { return static_cast<CompositingTriggerFlags>(AllTriggers); }
    239252#endif
    240253
  • trunk/WebCore/rendering/RenderLayer.cpp

    r72839 r72954  
    250250}
    251251
     252bool RenderLayer::canRender3DTransforms() const
     253{
     254#if USE(ACCELERATED_COMPOSITING)
     255    return compositor()->canRender3DTransforms();
     256#else
     257    return false;
     258#endif
     259}
     260
    252261void RenderLayer::updateLayerPositions(UpdateLayerPositionsFlags flags, IntPoint* cachedOffset)
    253262{
     
    428437        m_transform->makeIdentity();
    429438        box->style()->applyTransform(*m_transform, box->borderBoxRect().size(), RenderStyle::IncludeTransformOrigin);
    430         makeMatrixRenderable(*m_transform, hasAcceleratedCompositing());
     439        makeMatrixRenderable(*m_transform, canRender3DTransforms());
    431440    }
    432441
     
    445454        RefPtr<RenderStyle> style = renderer()->animation()->getAnimatedStyleForRenderer(renderer());
    446455        style->applyTransform(currTransform, renderBox()->borderBoxRect().size(), RenderStyle::IncludeTransformOrigin);
    447         makeMatrixRenderable(currTransform, hasAcceleratedCompositing());
     456        makeMatrixRenderable(currTransform, canRender3DTransforms());
    448457        return currTransform;
    449458    }
  • trunk/WebCore/rendering/RenderLayer.h

    r71674 r72954  
    289289    // Returns true if the accelerated compositing is enabled
    290290    bool hasAcceleratedCompositing() const;
    291    
     291
     292    bool canRender3DTransforms() const;
     293
    292294    void updateLayerPosition();
    293295   
  • trunk/WebCore/rendering/RenderLayerBacking.cpp

    r71642 r72954  
    133133    if (m_owningLayer->hasTransform()) {
    134134        style->applyTransform(t, toRenderBox(renderer())->borderBoxRect().size(), RenderStyle::ExcludeTransformOrigin);
    135         makeMatrixRenderable(t, compositor()->hasAcceleratedCompositing());
     135        makeMatrixRenderable(t, compositor()->canRender3DTransforms());
    136136    }
    137137   
  • trunk/WebCore/rendering/RenderLayerCompositor.cpp

    r71553 r72954  
    9595    , m_updateCompositingLayersTimer(this, &RenderLayerCompositor::updateCompositingLayersTimerFired)
    9696    , m_hasAcceleratedCompositing(true)
     97    , m_compositingTriggers(static_cast<ChromeClient::CompositingTriggerFlags>(ChromeClient::AllTriggers))
    9798    , m_showDebugBorders(false)
    9899    , m_showRepaintCounter(false)
     
    131132    bool showDebugBorders = false;
    132133    bool showRepaintCounter = false;
    133    
     134
    134135    if (Settings* settings = m_renderView->document()->settings()) {
    135136        hasAcceleratedCompositing = settings->acceleratedCompositingEnabled();
     
    143144        Frame* frame = m_renderView->frameView()->frame();
    144145        Page* page = frame ? frame->page() : 0;
    145         if (page)
    146             hasAcceleratedCompositing = page->chrome()->client()->allowsAcceleratedCompositing();
     146        if (page) {
     147            ChromeClient* chromeClient = page->chrome()->client();
     148            m_compositingTriggers = chromeClient->allowedCompositingTriggers();
     149            hasAcceleratedCompositing = m_compositingTriggers;
     150        }
    147151    }
    148152
    149153    if (hasAcceleratedCompositing != m_hasAcceleratedCompositing || showDebugBorders != m_showDebugBorders || showRepaintCounter != m_showRepaintCounter)
    150154        setCompositingLayersNeedRebuild();
    151        
     155
    152156    m_hasAcceleratedCompositing = hasAcceleratedCompositing;
    153157    m_showDebugBorders = showDebugBorders;
    154158    m_showRepaintCounter = showRepaintCounter;
     159}
     160
     161bool RenderLayerCompositor::canRender3DTransforms() const
     162{
     163    return hasAcceleratedCompositing() && (m_compositingTriggers & ChromeClient::ThreeDTransformTrigger);
    155164}
    156165
     
    11281137             || requiresCompositingForPlugin(renderer)
    11291138             || requiresCompositingForIFrame(renderer)
    1130              || renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden
     1139             || (canRender3DTransforms() && renderer->style()->backfaceVisibility() == BackfaceVisibilityHidden)
    11311140             || clipsCompositingDescendants(layer)
    11321141             || requiresCompositingForAnimation(renderer);
     
    11841193bool RenderLayerCompositor::requiresCompositingForTransform(RenderObject* renderer) const
    11851194{
     1195    if (!(m_compositingTriggers & ChromeClient::ThreeDTransformTrigger))
     1196        return false;
     1197
    11861198    RenderStyle* style = renderer->style();
    11871199    // Note that we ask the renderer if it has a transform, because the style may have transforms,
     
    11921204bool RenderLayerCompositor::requiresCompositingForVideo(RenderObject* renderer) const
    11931205{
     1206    if (!(m_compositingTriggers & ChromeClient::VideoTrigger))
     1207        return false;
    11941208#if ENABLE(VIDEO)
    11951209    if (renderer->isVideo()) {
     
    12181232bool RenderLayerCompositor::requiresCompositingForCanvas(RenderObject* renderer) const
    12191233{
     1234    if (!(m_compositingTriggers & ChromeClient::CanvasTrigger))
     1235        return false;
     1236
    12201237    if (renderer->isCanvas()) {
    12211238        HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(renderer->node());
     
    12271244bool RenderLayerCompositor::requiresCompositingForPlugin(RenderObject* renderer) const
    12281245{
     1246    if (!(m_compositingTriggers & ChromeClient::PluginTrigger))
     1247        return false;
     1248
    12291249    bool composite = (renderer->isEmbeddedObject() && toRenderEmbeddedObject(renderer)->allowsAcceleratedCompositing())
    12301250                  || (renderer->isApplet() && toRenderApplet(renderer)->allowsAcceleratedCompositing());
     
    12711291bool RenderLayerCompositor::requiresCompositingForAnimation(RenderObject* renderer) const
    12721292{
     1293    if (!(m_compositingTriggers & ChromeClient::AnimationTrigger))
     1294        return false;
     1295
    12731296    if (AnimationController* animController = renderer->animation()) {
    12741297        return (animController->isRunningAnimationOnRenderer(renderer, CSSPropertyOpacity) && inCompositingMode())
  • trunk/WebCore/rendering/RenderLayerCompositor.h

    r71553 r72954  
    2727#define RenderLayerCompositor_h
    2828
     29#include "ChromeClient.h"
    2930#include "RenderLayer.h"
    3031#include "RenderLayerBacking.h"
     
    6869    // Returns true if the accelerated compositing is enabled
    6970    bool hasAcceleratedCompositing() const { return m_hasAcceleratedCompositing; }
    70    
     71
     72    bool canRender3DTransforms() const;
     73
    7174    bool showDebugBorders() const { return m_showDebugBorders; }
    7275    bool showRepaintCounter() const { return m_showRepaintCounter; }
     
    233236
    234237    bool m_hasAcceleratedCompositing;
     238    ChromeClient::CompositingTriggerFlags m_compositingTriggers;
     239
    235240    bool m_showDebugBorders;
    236241    bool m_showRepaintCounter;
  • trunk/WebKit/chromium/ChangeLog

    r72901 r72954  
     12010-11-29  Vangelis Kokkevis  <vangelis@chromium.org>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Provide more fine grained control to ports over when to turn on accelerated
     6        compositing.
     7        https://bugs.webkit.org/show_bug.cgi?id=49998
     8
     9        As part of this change, the old hasAcceleratedCompositing method on the ChromeClient
     10        has now been replaced by allowedCompositingTriggers which returns a bitfield of
     11        all the features which can trigger the compositor.
     12
     13        * src/ChromeClientImpl.cpp:
     14        (WebKit::ChromeClientImpl::allowedCompositingTriggers):
     15        * src/ChromeClientImpl.h:
     16
    1172010-11-30  Jochen Eisinger  <jochen@chromium.org>
    218
  • trunk/WebKit/chromium/src/ChromeClientImpl.cpp

    r72403 r72954  
    808808}
    809809
    810 bool ChromeClientImpl::allowsAcceleratedCompositing() const
    811 {
    812     return m_webView->allowsAcceleratedCompositing();
     810ChromeClient::CompositingTriggerFlags ChromeClientImpl::allowedCompositingTriggers() const
     811{
     812    if (!m_webView->allowsAcceleratedCompositing())
     813        return 0;
     814
     815    return ChromeClient::AllTriggers;
    813816}
    814817#endif
  • trunk/WebKit/chromium/src/ChromeClientImpl.h

    r72403 r72954  
    153153    virtual void scheduleCompositingLayerSync();
    154154
    155     // Returns true if accelerated compositing is supported.
    156     virtual bool allowsAcceleratedCompositing() const;
     155    virtual CompositingTriggerFlags allowedCompositingTriggers() const;
    157156#endif
    158157
  • trunk/WebKit/qt/ChangeLog

    r72910 r72954  
     12010-11-29  Vangelis Kokkevis  <vangelis@chromium.org>
     2
     3        Reviewed by Simon Fraser.
     4
     5        Provide more fine grained control to ports over when to turn on accelerated
     6        compositing.
     7        https://bugs.webkit.org/show_bug.cgi?id=49998
     8
     9        As part of this change, the old hasAcceleratedCompositing method on the ChromeClient
     10        has now been replaced by allowedCompositingTriggers which returns a bitfield of
     11        all the features which can trigger the compositor.
     12
     13
     14        * WebCoreSupport/ChromeClientQt.cpp:
     15        (WebCore::ChromeClientQt::allowedCompositingTriggers):
     16        * WebCoreSupport/ChromeClientQt.h:
     17
    1182010-11-30  Thiago Macieira  <thiago.macieira@nokia.com>
    219
  • trunk/WebKit/qt/WebCoreSupport/ChromeClientQt.cpp

    r72726 r72954  
    618618}
    619619
    620 bool ChromeClientQt::allowsAcceleratedCompositing() const
    621 {
    622     return (platformPageClient() && platformPageClient()->allowsAcceleratedCompositing());
     620ChromeClient::CompositingTriggerFlags ChromeClientQt::allowedCompositingTriggers() const
     621{
     622    if (platformPageClient() && platformPageClient()->allowsAcceleratedCompositing())
     623        return AllTriggers;
     624
     625    return 0;
    623626}
    624627
  • trunk/WebKit/qt/WebCoreSupport/ChromeClientQt.h

    r71541 r72954  
    153153        virtual void setNeedsOneShotDrawingSynchronization();
    154154        virtual void scheduleCompositingLayerSync();
    155         virtual bool allowsAcceleratedCompositing() const;
     155        virtual CompositingTriggerFlags allowedCompositingTriggers() const;
    156156#endif
    157157
Note: See TracChangeset for help on using the changeset viewer.