Changeset 45199 in webkit


Ignore:
Timestamp:
Jun 25, 2009 3:03:59 PM (15 years ago)
Author:
cmarrin@apple.com
Message:

https://bugs.webkit.org/show_bug.cgi?id=26651


Preference is named "WebKitAcceleratedCompositingEnabled"
and is a boolean value. When false, prevents compositing layers from
being created, which prevents hardware animation from running.
Also forces video to do software rendering. Added a cache for
the flag in RenderLayerCompositing and made it all work
on-the-fly when the flag is changed while a page is loaded.

Location:
trunk
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r45198 r45199  
     12009-06-25  Chris Marrin  <cmarrin@apple.com>
     2
     3        Reviewed by Simon Fraser  <simon.fraser@apple.com>.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=26651
     6       
     7        Preference is named "WebKitAcceleratedCompositingEnabled"
     8        and is a boolean value. When false, prevents compositing layers from
     9        being created, which prevents hardware animation from running.
     10        Also forces video to do software rendering. Added a cache for
     11        the flag in RenderLayerCompositing and made it all work
     12        on-the-fly when the flag is changed while a page is loaded.
     13
     14        * WebCore.base.exp:
     15        * page/FrameView.cpp:
     16        (WebCore::FrameView::updateCompositingLayers):
     17        * page/Settings.cpp:
     18        (WebCore::setNeedsReapplyStylesInAllFrames):
     19        (WebCore::Settings::Settings):
     20        (WebCore::Settings::setAcceleratedCompositingEnabled):
     21        * page/Settings.h:
     22        (WebCore::Settings::acceleratedCompositingEnabled):
     23        * rendering/RenderLayer.cpp:
     24        (WebCore::RenderLayer::hasAcceleratedCompositing):
     25        (WebCore::RenderLayer::updateTransform):
     26        (WebCore::RenderLayer::currentTransform):
     27        * rendering/RenderLayer.h:
     28        * rendering/RenderLayerBacking.cpp:
     29        (WebCore::RenderLayerBacking::updateLayerTransform):
     30        * rendering/RenderLayerCompositor.cpp:
     31        (WebCore::RenderLayerCompositor::RenderLayerCompositor):
     32        (WebCore::RenderLayerCompositor::enableCompositingMode):
     33        (WebCore::RenderLayerCompositor::cacheAcceleratedCompositingEnabledFlag):
     34        (WebCore::RenderLayerCompositor::updateCompositingLayers):
     35        (WebCore::RenderLayerCompositor::canAccelerateVideoRendering):
     36        (WebCore::RenderLayerCompositor::rebuildCompositingLayerTree):
     37        (WebCore::RenderLayerCompositor::needsToBeComposited):
     38        (WebCore::RenderLayerCompositor::destroyRootPlatformLayer):
     39        * rendering/RenderLayerCompositor.h:
     40        (WebCore::RenderLayerCompositor::hasAcceleratedCompositing):
     41        * rendering/RenderObject.h:
     42        (WebCore::makeMatrixRenderable):
     43
    1442009-06-25  Jian Li  <jianli@chromium.org>
    245
  • trunk/WebCore/WebCore.base.exp

    r44846 r45199  
    661661__ZN7WebCore8Settings40setTextDirectionSubmenuInclusionBehaviorENS_37TextDirectionSubmenuInclusionBehaviorE
    662662__ZN7WebCore8Settings41setNeedsKeyboardEventDisambiguationQuirksEb
     663__ZN7WebCore8Settings32setAcceleratedCompositingEnabledEb
    663664__ZN7WebCore8blankURLEv
    664665__ZN7WebCore8makeRGBAEiiii
  • trunk/WebCore/page/FrameView.cpp

    r44940 r45199  
    421421{
    422422    RenderView* view = m_frame->contentRenderer();
     423    if (view && view->compositor()) {
     424        // This call will make sure the cached hasAcceleratedCompositing is updated from the pref
     425        view->compositor()->cacheAcceleratedCompositingEnabledFlag();
     426    }
     427   
    423428    if (!view || !view->usesCompositing())
    424429        return;
  • trunk/WebCore/page/Settings.cpp

    r44846 r45199  
    2929#include "Frame.h"
    3030#include "FrameTree.h"
     31#include "FrameView.h"
    3132#include "HistoryItem.h"
    3233#include "Page.h"
     
    3839namespace WebCore {
    3940
    40 static void setNeedsReapplyStylesInAllFrames(Page* page)
    41 {
    42     for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext())
     41static void setNeedsReapplyStylesInAllFrames(Page* page, bool /*updateCompositingLayers*/ = false)
     42{
     43    for (Frame* frame = page->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
     44        //if (updateCompositingLayers)
     45        //    frame->view()->updateCompositingLayers(FrameView::ForcedCompositingUpdate);
    4346        frame->setNeedsReapplyStyles();
     47    }
    4448}
    4549
     
    105109    , m_downloadableBinaryFontsEnabled(true)
    106110    , m_xssAuditorEnabled(false)
     111    , m_acceleratedCompositingEnabled(true)
    107112{
    108113    // A Frame may not have been created yet, so we initialize the AtomicString
     
    465470}
    466471
     472void Settings::setAcceleratedCompositingEnabled(bool enabled)
     473{
     474    if (m_acceleratedCompositingEnabled == enabled)
     475        return;
     476       
     477    m_acceleratedCompositingEnabled = enabled;
     478    setNeedsReapplyStylesInAllFrames(m_page, true);
     479}
     480
    467481} // namespace WebCore
  • trunk/WebCore/page/Settings.h

    r44846 r45199  
    241241        void setXSSAuditorEnabled(bool);
    242242        bool xssAuditorEnabled() const { return m_xssAuditorEnabled; }
     243
     244        void setAcceleratedCompositingEnabled(bool);
     245        bool acceleratedCompositingEnabled() const { return m_acceleratedCompositingEnabled; }
    243246
    244247    private:
     
    302305        bool m_downloadableBinaryFontsEnabled : 1;
    303306        bool m_xssAuditorEnabled : 1;
     307        bool m_acceleratedCompositingEnabled : 1;
    304308
    305309#if USE(SAFARI_THEME)
  • trunk/WebCore/rendering/RenderLayer.cpp

    r45007 r45199  
    239239#endif // USE(ACCELERATED_COMPOSITING)
    240240
     241bool RenderLayer::hasAcceleratedCompositing() const
     242{
     243#if USE(ACCELERATED_COMPOSITING)
     244    return compositor()->hasAcceleratedCompositing();
     245#else
     246    return false;
     247#endif
     248}
     249
    241250void RenderLayer::setStaticY(int staticY)
    242251{
     
    340349        m_transform->makeIdentity();
    341350        box->style()->applyTransform(*m_transform, box->borderBoxRect().size(), RenderStyle::IncludeTransformOrigin);
    342         makeMatrixRenderable(*m_transform);
     351        makeMatrixRenderable(*m_transform, hasAcceleratedCompositing());
    343352    }
    344353
     
    357366        RefPtr<RenderStyle> style = renderer()->animation()->getAnimatedStyleForRenderer(renderer());
    358367        style->applyTransform(currTransform, renderBox()->borderBoxRect().size(), RenderStyle::IncludeTransformOrigin);
    359         makeMatrixRenderable(currTransform);
     368        makeMatrixRenderable(currTransform, hasAcceleratedCompositing());
    360369        return currTransform;
    361370    }
  • trunk/WebCore/rendering/RenderLayer.h

    r45005 r45199  
    290290    void rendererContentChanged();
    291291#endif
     292
     293    // Returns true if the accelerated compositing is enabled
     294    bool hasAcceleratedCompositing() const;
    292295   
    293296    void updateLayerPosition();
  • trunk/WebCore/rendering/RenderLayerBacking.cpp

    r45129 r45199  
    121121    if (m_owningLayer->hasTransform()) {
    122122        style->applyTransform(t, toRenderBox(renderer())->borderBoxRect().size(), RenderStyle::ExcludeTransformOrigin);
    123         makeMatrixRenderable(t);
     123        makeMatrixRenderable(t, compositor()->hasAcceleratedCompositing());
    124124    }
    125125   
  • trunk/WebCore/rendering/RenderLayerCompositor.cpp

    r44961 r45199  
    4141#include "RenderVideo.h"
    4242#include "RenderView.h"
     43#include "Settings.h"
    4344
    4445#if PROFILE_LAYER_REBUILD
     
    8889    , m_rootLayerAttached(false)
    8990    , m_compositingLayersNeedUpdate(false)
     91    , m_hasAcceleratedCompositing(true)
    9092#if PROFILE_LAYER_REBUILD
    9193    , m_rootLayerUpdateCount(0)
     
    110112        if (m_compositing)
    111113            ensureRootPlatformLayer();
    112     }
     114        else
     115            destroyRootPlatformLayer();
     116    }
     117}
     118
     119void RenderLayerCompositor::cacheAcceleratedCompositingEnabledFlag()
     120{
     121   
     122    bool hasAcceleratedCompositing = m_renderView->document()->settings() && m_renderView->frameView()->frame()->page()->settings()->acceleratedCompositingEnabled();
     123
     124    if (hasAcceleratedCompositing != m_hasAcceleratedCompositing)
     125        setCompositingLayersNeedUpdate();
     126       
     127    m_hasAcceleratedCompositing = hasAcceleratedCompositing;
    113128}
    114129
     
    174189#endif
    175190    ASSERT(updateRoot || !m_compositingLayersNeedUpdate);
     191
     192    if (!hasAcceleratedCompositing())
     193        enableCompositingMode(false);
    176194}
    177195
     
    486504    // FIXME: ideally we need to look at all ancestors for mask or video. But for now,
    487505    // just bail on the obvious cases.
    488     if (o->hasMask() || o->hasReflection())
     506    if (o->hasMask() || o->hasReflection() || !m_hasAcceleratedCompositing)
    489507        return false;
    490508
     
    515533
    516534    // host the document layer in the RenderView's root layer
    517     if (layer->isRootLayer())
     535    if (layer->isRootLayer() && layer->isComposited())
    518536        parentInRootLayer(layer);
    519537
     
    712730bool RenderLayerCompositor::needsToBeComposited(const RenderLayer* layer) const
    713731{
    714     return requiresCompositingLayer(layer) || layer->mustOverlayCompositedLayers();
     732    return m_hasAcceleratedCompositing && (requiresCompositingLayer(layer) || layer->mustOverlayCompositedLayers());
    715733}
    716734
     
    870888}
    871889
     890void RenderLayerCompositor::destroyRootPlatformLayer()
     891{
     892    if (!m_rootPlatformLayer)
     893        return;
     894
     895    willMoveOffscreen();
     896    delete m_rootPlatformLayer;
     897    m_rootPlatformLayer = 0;
     898}
     899
    872900bool RenderLayerCompositor::layerHas3DContent(const RenderLayer* layer) const
    873901{
  • trunk/WebCore/rendering/RenderLayerCompositor.h

    r44961 r45199  
    5757    // the native view/window system.
    5858    void enableCompositingMode(bool enable = true);
     59   
     60    // Returns true if the accelerated compositing is enabled
     61    bool hasAcceleratedCompositing() { return m_hasAcceleratedCompositing; }
     62   
     63    // Copy the acceleratedCompositingEnabledFlag from Settings
     64    void cacheAcceleratedCompositingEnabledFlag();
    5965
    6066    void setCompositingLayersNeedUpdate(bool needUpdate = true);
     
    138144
    139145    void ensureRootPlatformLayer();
    140 
     146    void destroyRootPlatformLayer();
     147   
    141148    // Whether a running transition or animation enforces the need for a compositing layer.
    142149    static bool requiresCompositingForAnimation(RenderObject*);
     
    150157    bool m_rootLayerAttached;
    151158    bool m_compositingLayersNeedUpdate;
     159    bool m_hasAcceleratedCompositing;
     160   
    152161#if PROFILE_LAYER_REBUILD
    153162    int m_rootLayerUpdateCount;
  • trunk/WebCore/rendering/RenderObject.h

    r44794 r45199  
    960960}
    961961
    962 inline void makeMatrixRenderable(TransformationMatrix& matrix)
     962inline void makeMatrixRenderable(TransformationMatrix& matrix, bool has3DRendering)
    963963{
    964964#if !ENABLE(3D_RENDERING)
     965    UNUSED_PARAM(has3DRendering);
    965966    matrix.makeAffine();
    966967#else
    967     UNUSED_PARAM(matrix);
     968    if (!has3DRendering)
     969        matrix.makeAffine();
    968970#endif
    969971}
  • trunk/WebKit/mac/ChangeLog

    r45104 r45199  
     12009-06-25  Chris Marrin  <cmarrin@apple.com>
     2
     3        Reviewed by Simon Fraser  <simon.fraser@apple.com>.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=26651
     6       
     7        Preference is named "WebKitAcceleratedCompositingEnabled"
     8        and is a boolean value. When false, prevents compositing layers from
     9        being created, which prevents hardware animation from running.
     10        Also forces video to do software rendering. Added a cache for
     11        the flag in RenderLayerCompositing and made it all work
     12        on-the-fly when the flag is changed while a page is loaded.
     13
     14        * WebView/WebPreferenceKeysPrivate.h:
     15        * WebView/WebPreferences.h:
     16        * WebView/WebPreferences.mm:
     17        (+[WebPreferences initialize]):
     18        (-[WebPreferences acceleratedCompositingEnabled]):
     19        (-[WebPreferences setAcceleratedCompositingEnabled:]):
     20        * WebView/WebView.mm:
     21        (-[WebView _preferencesChangedNotification:]):
     22
    1232009-06-24  Dan Bernstein  <mitz@apple.com>
    224
  • trunk/WebKit/mac/WebView/WebPreferenceKeysPrivate.h

    r44846 r45199  
    8383#define WebKitZoomsTextOnlyPreferenceKey @"WebKitZoomsTextOnly"
    8484#define WebKitXSSAuditorEnabledPreferenceKey @"WebKitXSSAuditorEnabled"
     85#define WebKitAcceleratedCompositingEnabledPreferenceKey @"WebKitAcceleratedCompositingEnabled"
    8586
    8687// These are private both because callers should be using the cover methods and because the
  • trunk/WebKit/mac/WebView/WebPreferences.h

    r25768 r45199  
    438438- (WebCacheModel)cacheModel;
    439439
     440/*!
     441    @method acceleratedCompositingEnabled
     442*/
     443- (BOOL)acceleratedCompositingEnabled;
     444
     445/*!
     446    @method setAcceleratedCompositingEnabled:
     447    @param enabled
     448*/
     449- (void)setAcceleratedCompositingEnabled:(BOOL)enabled;
     450
    440451@end
    441452
  • trunk/WebKit/mac/WebView/WebPreferences.mm

    r44846 r45199  
    349349        [NSNumber numberWithBool:YES],  WebKitZoomsTextOnlyPreferenceKey,
    350350        [NSNumber numberWithBool:NO],   WebKitXSSAuditorEnabledPreferenceKey,
     351        [NSNumber numberWithBool:YES],  WebKitAcceleratedCompositingEnabledPreferenceKey,
    351352        nil];
    352353
     
    737738{
    738739    return [self _integerValueForKey:WebKitCacheModelPreferenceKey];
     740}
     741
     742- (BOOL)acceleratedCompositingEnabled
     743{
     744    return [self _boolValueForKey: WebKitAcceleratedCompositingEnabledPreferenceKey];
     745}
     746
     747- (void)setAcceleratedCompositingEnabled:(BOOL)enabled
     748{
     749    [self _setBoolValue: enabled forKey: WebKitAcceleratedCompositingEnabledPreferenceKey];
    739750}
    740751
  • trunk/WebKit/mac/WebView/WebView.mm

    r45021 r45199  
    12951295    settings->setXSSAuditorEnabled([preferences isXSSAuditorEnabled]);
    12961296    settings->setEnforceCSSMIMETypeInStrictMode(!WKAppVersionCheckLessThan(@"com.apple.iWeb", -1, 2.1));
     1297    settings->setAcceleratedCompositingEnabled([preferences acceleratedCompositingEnabled]);
    12971298}
    12981299
Note: See TracChangeset for help on using the changeset viewer.