Changeset 162837 in webkit


Ignore:
Timestamp:
Jan 27, 2014, 7:11:08 AM (12 years ago)
Author:
Antti Koivisto
Message:

Remove repaint throttling
https://bugs.webkit.org/show_bug.cgi?id=127681

Reviewed by Sam Weinig.

Nowadays we throttle layer flushes. This code is unnecessary.

  • WebCore.exp.in:
  • dom/Document.cpp:

(WebCore::Document::recalcStyle):

  • dom/Element.cpp:

(WebCore::Element::classAttributeChanged):

  • editing/AlternativeTextController.cpp:

(WebCore::AlternativeTextController::insertDictatedText):

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::checkCompleted):

  • page/EventHandler.cpp:

(WebCore::EventHandler::dispatchDragEvent):
(WebCore::EventHandler::dispatchMouseEvent):
(WebCore::EventHandler::keyEvent):
(WebCore::EventHandler::handleTextInputEvent):

  • page/FrameView.cpp:

(WebCore::FrameView::FrameView):
(WebCore::FrameView::reset):
(WebCore::FrameView::flushCompositingStateForThisFrame):
(WebCore::FrameView::layout):
(WebCore::FrameView::repaintContentRectangle):
(WebCore::FrameView::disableLayerFlushThrottlingTemporarilyForInteraction):
(WebCore::FrameView::updateLayoutAndStyleIfNeededRecursive):

  • page/FrameView.h:
  • rendering/RenderView.cpp:

(WebCore::RenderView::setSelection):

Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r162836 r162837  
     12014-01-27  Antti Koivisto  <antti@apple.com>
     2
     3        Remove repaint throttling
     4        https://bugs.webkit.org/show_bug.cgi?id=127681
     5
     6        Reviewed by Sam Weinig.
     7
     8        Nowadays we throttle layer flushes. This code is unnecessary.
     9
     10        * WebCore.exp.in:
     11        * dom/Document.cpp:
     12        (WebCore::Document::recalcStyle):
     13        * dom/Element.cpp:
     14        (WebCore::Element::classAttributeChanged):
     15        * editing/AlternativeTextController.cpp:
     16        (WebCore::AlternativeTextController::insertDictatedText):
     17        * loader/FrameLoader.cpp:
     18        (WebCore::FrameLoader::checkCompleted):
     19        * page/EventHandler.cpp:
     20        (WebCore::EventHandler::dispatchDragEvent):
     21        (WebCore::EventHandler::dispatchMouseEvent):
     22        (WebCore::EventHandler::keyEvent):
     23        (WebCore::EventHandler::handleTextInputEvent):
     24        * page/FrameView.cpp:
     25        (WebCore::FrameView::FrameView):
     26        (WebCore::FrameView::reset):
     27        (WebCore::FrameView::flushCompositingStateForThisFrame):
     28        (WebCore::FrameView::layout):
     29        (WebCore::FrameView::repaintContentRectangle):
     30        (WebCore::FrameView::disableLayerFlushThrottlingTemporarilyForInteraction):
     31        (WebCore::FrameView::updateLayoutAndStyleIfNeededRecursive):
     32        * page/FrameView.h:
     33        * rendering/RenderView.cpp:
     34        (WebCore::RenderView::setSelection):
     35
    1362014-01-24  Eric Carlson  <eric.carlson@apple.com>
    237
  • trunk/Source/WebCore/WebCore.exp.in

    r162808 r162837  
    12771277__ZN7WebCore9FrameView20resetTrackedRepaintsEv
    12781278__ZN7WebCore9FrameView20setCanHaveScrollbarsEb
    1279 __ZN7WebCore9FrameView21flushDeferredRepaintsEv
    12801279__ZN7WebCore9FrameView22setBaseBackgroundColorERKNS_5ColorE
    12811280__ZN7WebCore9FrameView23updateCanHaveScrollbarsEv
  • trunk/Source/WebCore/dom/Document.cpp

    r162816 r162837  
    17401740        WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
    17411741
    1742         frameView.beginDeferredRepaints();
    1743 
    17441742        if (m_pendingStyleRecalcShouldForce)
    17451743            change = Style::Force;
     
    17651763        if (m_styleResolver)
    17661764            m_styleSheetCollection.resetCSSFeatureFlags();
    1767 
    1768         frameView.endDeferredRepaints();
    17691765    }
    17701766
  • trunk/Source/WebCore/editing/AlternativeTextController.cpp

    r161768 r162837  
    690690
    691691    if (FrameView* view = m_frame.view())
    692         view->resetDeferredRepaintDelay();
     692        view->disableLayerFlushThrottlingTemporarilyForInteraction();
    693693
    694694    RefPtr<TextEvent> event = TextEvent::createForDictation(m_frame.document()->domWindow(), text, dictationAlternatives);
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r162834 r162837  
    799799    m_shouldCallCheckCompleted = false;
    800800
    801     if (m_frame.view())
    802         m_frame.view()->handleLoadCompleted();
    803 
    804801    // Have we completed before?
    805802    if (m_isComplete)
     
    846843    if (m_frame.page())
    847844        checkLoadComplete();
    848 
    849     if (m_frame.view())
    850         m_frame.view()->handleLoadCompleted();
    851845}
    852846
  • trunk/Source/WebCore/page/EventHandler.cpp

    r162745 r162837  
    20172017        return false;
    20182018
    2019     view->resetDeferredRepaintDelay();
     2019    view->disableLayerFlushThrottlingTemporarilyForInteraction();
    20202020    RefPtr<MouseEvent> me = MouseEvent::create(eventType,
    20212021        true, true, event.timestamp(), m_frame.document()->defaultView(),
     
    23892389{
    23902390    if (FrameView* view = m_frame.view())
    2391         view->resetDeferredRepaintDelay();
     2391        view->disableLayerFlushThrottlingTemporarilyForInteraction();
    23922392
    23932393    updateMouseEventTargetNode(targetNode, mouseEvent, setUnder);
     
    29152915
    29162916    if (FrameView* view = m_frame.view())
    2917         view->resetDeferredRepaintDelay();
     2917        view->disableLayerFlushThrottlingTemporarilyForInteraction();
    29182918
    29192919    // FIXME (bug 68185): this call should be made at another abstraction layer
     
    33373337   
    33383338    if (FrameView* view = m_frame.view())
    3339         view->resetDeferredRepaintDelay();
     3339        view->disableLayerFlushThrottlingTemporarilyForInteraction();
    33403340
    33413341    RefPtr<TextEvent> event = TextEvent::create(m_frame.document()->domWindow(), text, inputType);
  • trunk/Source/WebCore/page/Frame.cpp

    r162691 r162837  
    957957        return;
    958958    m_view->updateLayoutAndStyleIfNeededRecursive();
    959     m_view->flushDeferredRepaints();
    960959}
    961960
  • trunk/Source/WebCore/page/FrameView.cpp

    r162795 r162837  
    119119double FrameView::sCurrentPaintTimeStamp = 0.0;
    120120
    121 
    122 // REPAINT_THROTTLING now chooses default values for throttling parameters.
    123 // Should be removed when applications start using runtime configuration.
    124 #if ENABLE(REPAINT_THROTTLING)
    125 // Normal delay
    126 double FrameView::s_normalDeferredRepaintDelay = 0.016;
    127 // Negative value would mean that first few repaints happen without a delay
    128 double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;
    129 // The delay grows on each repaint to this maximum value
    130 double FrameView::s_maxDeferredRepaintDelayDuringLoading = 2.5;
    131 // On each repaint the delay increses by this amount
    132 double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0.5;
    133 #else
    134 // FIXME: Repaint throttling could be good to have on all platform.
    135 // The balance between CPU use and repaint frequency will need some tuning for desktop.
    136 // More hooks may be needed to reset the delay on things like GIF and CSS animations.
    137 double FrameView::s_normalDeferredRepaintDelay = 0;
    138 double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;
    139 double FrameView::s_maxDeferredRepaintDelayDuringLoading = 0;
    140 double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0;
    141 #endif
    142 
    143121// The maximum number of updateEmbeddedObjects iterations that should be done before returning.
    144122static const unsigned maxUpdateEmbeddedObjectsIterations = 2;
     
    199177    , m_inProgrammaticScroll(false)
    200178    , m_safeToPropagateScrollToParent(true)
    201     , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired)
    202179    , m_isTrackingRepaints(false)
    203180    , m_shouldUpdateWhileOffscreen(true)
     
    286263    m_lastViewportSize = IntSize();
    287264    m_lastZoomFactor = 1.0f;
    288     m_deferringRepaints = 0;
    289     m_repaintCount = 0;
    290     m_repaintRects.clear();
    291     m_deferredRepaintDelay = s_initialDeferredRepaintDelayDuringLoading;
    292     m_deferredRepaintTimer.stop();
    293265    m_isTrackingRepaints = false;
    294266    m_trackedRepaintRects.clear();
     
    903875        return false;
    904876
    905     // If we sync compositing layers and allow the repaint to be deferred, there is time for a
    906     // visible flash to occur. Instead, stop the deferred repaint timer and repaint immediately.
    907     flushDeferredRepaints();
    908 
    909877#if PLATFORM(IOS)
    910878    if (TileCache* tileCache = this->tileCache())
     
    13131281        m_layoutPhase = InLayout;
    13141282
    1315         beginDeferredRepaints();
    13161283        forceLayoutParentViewIfNeeded();
    13171284
     
    13331300            root->layout();
    13341301#endif
    1335         endDeferredRepaints();
    13361302
    13371303        ASSERT(m_layoutPhase == InLayout);
     
    13571323
    13581324    // Now update the positions of all layers.
    1359     beginDeferredRepaints();
    13601325    if (m_needsFullRepaint)
    13611326        root->view().repaintRootContents();
    13621327
    13631328    layer->updateLayerPositionsAfterLayout(renderView()->layer(), updateLayerPositionFlags(layer, subtree, m_needsFullRepaint));
    1364 
    1365     endDeferredRepaints();
    13661329
    13671330#if USE(ACCELERATED_COMPOSITING)
     
    21602123    addTrackedRepaintRect(r);
    21612124
    2162     double delay = m_deferringRepaints ? 0 : adjustedDeferredRepaintDelay();
    2163     if ((m_deferringRepaints || m_deferredRepaintTimer.isActive() || delay) && !immediate) {
    2164         IntRect paintRect = r;
    2165         if (clipsRepaints() && !paintsEntireContents())
    2166             paintRect.intersect(visibleContentRect(LegacyIOSDocumentVisibleRect));
    2167         if (paintRect.isEmpty())
    2168             return;
    2169         if (m_repaintCount == cRepaintRectUnionThreshold) {
    2170             IntRect unionedRect;
    2171             for (unsigned i = 0; i < cRepaintRectUnionThreshold; ++i)
    2172                 unionedRect.unite(pixelSnappedIntRect(m_repaintRects[i]));
    2173             m_repaintRects.clear();
    2174             m_repaintRects.append(unionedRect);
    2175         }
    2176         if (m_repaintCount < cRepaintRectUnionThreshold)
    2177             m_repaintRects.append(paintRect);
    2178         else
    2179             m_repaintRects[0].unite(paintRect);
    2180         m_repaintCount++;
    2181 
    2182         if (!m_deferringRepaints)
    2183             startDeferredRepaintTimer(delay);
    2184 
    2185         return;
    2186     }
    2187    
    21882125    if (!shouldUpdate(immediate))
    21892126        return;
     
    22762213}
    22772214
    2278 void FrameView::beginDeferredRepaints()
    2279 {
    2280     if (!frame().isMainFrame()) {
    2281         frame().mainFrame().view()->beginDeferredRepaints();
    2282         return;
    2283     }
    2284 
    2285     m_deferringRepaints++;
    2286 }
    2287 
    2288 void FrameView::endDeferredRepaints()
    2289 {
    2290     if (!frame().isMainFrame()) {
    2291         frame().mainFrame().view()->endDeferredRepaints();
    2292         return;
    2293     }
    2294 
    2295     ASSERT(m_deferringRepaints > 0);
    2296 
    2297     if (--m_deferringRepaints)
    2298         return;
    2299 
    2300     if (m_deferredRepaintTimer.isActive())
    2301         return;
    2302 
    2303     if (double delay = adjustedDeferredRepaintDelay()) {
    2304         startDeferredRepaintTimer(delay);
    2305         return;
    2306     }
    2307    
    2308     doDeferredRepaints();
    2309 }
    2310 
    2311 void FrameView::startDeferredRepaintTimer(double delay)
    2312 {
    2313     if (m_deferredRepaintTimer.isActive())
    2314         return;
    2315 
    2316     m_deferredRepaintTimer.startOneShot(delay);
    2317 }
    2318 
    2319 void FrameView::handleLoadCompleted()
    2320 {
    2321     // Once loading has completed, allow autoSize one last opportunity to
    2322     // reduce the size of the frame.
    2323     autoSizeIfEnabled();
    2324     if (shouldUseLoadTimeDeferredRepaintDelay())
    2325         return;
    2326     m_deferredRepaintDelay = s_normalDeferredRepaintDelay;
    2327     flushDeferredRepaints();
    2328 }
    2329 
    2330 void FrameView::flushDeferredRepaints()
    2331 {
    2332     if (!m_deferredRepaintTimer.isActive())
    2333         return;
    2334     m_deferredRepaintTimer.stop();
    2335     doDeferredRepaints();
    2336 }
    2337 
    2338 void FrameView::doDeferredRepaints()
    2339 {
    2340     ASSERT(!m_deferringRepaints);
    2341     if (!shouldUpdate()) {
    2342         m_repaintRects.clear();
    2343         m_repaintCount = 0;
    2344         return;
    2345     }
    2346     unsigned size = m_repaintRects.size();
    2347     for (unsigned i = 0; i < size; i++) {
    2348 #if USE(TILED_BACKING_STORE)
    2349         if (frame().tiledBackingStore()) {
    2350             frame().tiledBackingStore()->invalidate(pixelSnappedIntRect(m_repaintRects[i]));
    2351             continue;
    2352         }
    2353 #endif
    2354         ScrollView::repaintContentRectangle(pixelSnappedIntRect(m_repaintRects[i]), false);
    2355     }
    2356     m_repaintRects.clear();
    2357     m_repaintCount = 0;
    2358    
    2359     updateDeferredRepaintDelayAfterRepaint();
    2360 }
    2361 
    2362 bool FrameView::shouldUseLoadTimeDeferredRepaintDelay() const
    2363 {
    2364     // Don't defer after the initial load of the page has been completed.
    2365     if (frame().tree().top().loader().isComplete())
    2366         return false;
    2367     Document* document = frame().document();
    2368     if (!document)
    2369         return false;
    2370     if (document->parsing())
    2371         return true;
    2372     if (document->cachedResourceLoader()->requestCount())
    2373         return true;
    2374     return false;
    2375 }
    2376 
    2377 void FrameView::updateDeferredRepaintDelayAfterRepaint()
    2378 {
    2379     if (!shouldUseLoadTimeDeferredRepaintDelay()) {
    2380         m_deferredRepaintDelay = s_normalDeferredRepaintDelay;
    2381         return;
    2382     }
    2383     double incrementedRepaintDelay = m_deferredRepaintDelay + s_deferredRepaintDelayIncrementDuringLoading;
    2384     m_deferredRepaintDelay = std::min(incrementedRepaintDelay, s_maxDeferredRepaintDelayDuringLoading);
    2385 }
    2386 
    2387 void FrameView::resetDeferredRepaintDelay()
    2388 {
    2389     m_deferredRepaintDelay = 0;
    2390     if (m_deferredRepaintTimer.isActive()) {
    2391         m_deferredRepaintTimer.stop();
    2392         if (!m_deferringRepaints)
    2393             doDeferredRepaints();
    2394     }
     2215void FrameView::disableLayerFlushThrottlingTemporarilyForInteraction()
     2216{
    23952217#if USE(ACCELERATED_COMPOSITING)
    23962218    if (RenderView* view = renderView())
    23972219        view->compositor().disableLayerFlushThrottlingTemporarilyForInteraction();
    23982220#endif
    2399 }
    2400 
    2401 double FrameView::adjustedDeferredRepaintDelay() const
    2402 {
    2403     ASSERT(!m_deferringRepaints);
    2404     if (!m_deferredRepaintDelay)
    2405         return 0;
    2406     double timeSinceLastPaint = monotonicallyIncreasingTime() - m_lastPaintTime;
    2407     return std::max<double>(0, m_deferredRepaintDelay - timeSinceLastPaint);
    2408 }
    2409    
    2410 void FrameView::deferredRepaintTimerFired(Timer<FrameView>&)
    2411 {
    2412     doDeferredRepaints();
    24132221}
    24142222
     
    38233631        childViews[i]->updateLayoutAndStyleIfNeededRecursive();
    38243632
    3825     // updateLayoutAndStyleIfNeededRecursive is called when we need to make sure style and layout are up-to-date before
    3826     // painting, so we need to flush out any deferred repaints too.
    3827     flushDeferredRepaints();
    3828 
    38293633    // When frame flattening is on, child frame can mark parent frame dirty. In such case, child frame
    38303634    // needs to call layout on parent frame recursively.
     
    41163920}
    41173921
    4118 // Normal delay
    4119 void FrameView::setRepaintThrottlingDeferredRepaintDelay(double p)
    4120 {
    4121     s_normalDeferredRepaintDelay = p;
    4122 }
    4123 
    4124 // Negative value would mean that first few repaints happen without a delay
    4125 void FrameView::setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p)
    4126 {
    4127     s_initialDeferredRepaintDelayDuringLoading = p;
    4128 }
    4129 
    4130 // The delay grows on each repaint to this maximum value
    4131 void FrameView::setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p)
    4132 {
    4133     s_maxDeferredRepaintDelayDuringLoading = p;
    4134 }
    4135 
    4136 // On each repaint the delay increases by this amount
    4137 void FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p)
    4138 {
    4139     s_deferredRepaintDelayIncrementDuringLoading = p;
    4140 }
    4141 
    41423922void FrameView::setTracksRepaints(bool trackRepaints)
    41433923{
  • trunk/Source/WebCore/page/FrameView.h

    r162795 r162837  
    261261    bool fixedElementsLayoutRelativeToFrame() const;
    262262
    263     void beginDeferredRepaints();
    264     void endDeferredRepaints();
    265     void handleLoadCompleted();
    266     void flushDeferredRepaints();
    267     void startDeferredRepaintTimer(double delay);
    268     void resetDeferredRepaintDelay();
    269 
     263    void disableLayerFlushThrottlingTemporarilyForInteraction();
    270264    void updateLayerFlushThrottlingInAllFrames();
    271265    void adjustTiledBackingCoverage();
     
    361355    void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule);
    362356
    363     // Normal delay
    364     static void setRepaintThrottlingDeferredRepaintDelay(double p);
    365     // Negative value would mean that first few repaints happen without a delay
    366     static void setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p);
    367     // The delay grows on each repaint to this maximum value
    368     static void setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p);
    369     // On each repaint the delay increses by this amount
    370     static void setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p);
    371 
    372357    virtual IntPoint lastKnownMousePosition() const override;
    373358    virtual bool isHandlingWheelEvent() const override;
     
    553538    virtual void notifyPageThatContentAreaWillPaint() const override;
    554539
    555     bool shouldUseLoadTimeDeferredRepaintDelay() const;
    556     void deferredRepaintTimerFired(Timer<FrameView>&);
    557     void doDeferredRepaints();
    558     void updateDeferredRepaintDelayAfterRepaint();
    559     double adjustedDeferredRepaintDelay() const;
    560 
    561540    void enableSpeculativeTilingIfNeeded();
    562541    void speculativeTilingEnableTimerFired(Timer<FrameView>&);
     
    638617    bool m_safeToPropagateScrollToParent;
    639618
    640     unsigned m_deferringRepaints;
    641     unsigned m_repaintCount;
    642     Vector<LayoutRect> m_repaintRects;
    643     Timer<FrameView> m_deferredRepaintTimer;
    644     double m_deferredRepaintDelay;
    645619    double m_lastPaintTime;
    646620
     
    699673    LayoutMilestones m_milestonesPendingPaint;
    700674
    701     static double s_normalDeferredRepaintDelay;
    702     static double s_initialDeferredRepaintDelayDuringLoading;
    703     static double s_maxDeferredRepaintDelayDuringLoading;
    704     static double s_deferredRepaintDelayIncrementDuringLoading;
    705 
    706675    static const unsigned visualCharacterThreshold = 200;
    707676    static const unsigned visualPixelThreshold = 32 * 32;
  • trunk/Source/WebCore/rendering/RenderView.cpp

    r162726 r162837  
    930930        return;
    931931
    932     frameView().beginDeferredRepaints();
    933 
    934932    // Have any of the old selected objects changed compared to the new selection?
    935933    for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) {
     
    972970    for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i)
    973971        i->value->repaint();
    974 
    975     frameView().endDeferredRepaints();
    976972}
    977973
  • trunk/Source/WebKit/efl/ewk/ewk_settings.cpp

    r159679 r162837  
    320320void ewk_settings_repaint_throttling_set(double deferredRepaintDelay, double initialDeferredRepaintDelayDuringLoading, double maxDeferredRepaintDelayDuringLoading, double deferredRepaintDelayIncrementDuringLoading)
    321321{
    322     WebCore::FrameView::setRepaintThrottlingDeferredRepaintDelay(deferredRepaintDelay);
    323     WebCore::FrameView::setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(initialDeferredRepaintDelayDuringLoading);
    324     WebCore::FrameView::setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(maxDeferredRepaintDelayDuringLoading);
    325     WebCore::FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(deferredRepaintDelayIncrementDuringLoading);
     322    // FIXME: EFL should switch to layer flush throttling.
     323    UNUSED_PARAM(deferredRepaintDelay);
     324    UNUSED_PARAM(initialDeferredRepaintDelayDuringLoading);
     325    UNUSED_PARAM(maxDeferredRepaintDelayDuringLoading);
     326    UNUSED_PARAM(deferredRepaintDelayIncrementDuringLoading);
    326327}
    327328
  • trunk/Source/WebKit/mac/WebView/WebHTMLView.mm

    r161931 r162837  
    14211421        [self _web_updateLayoutAndStyleIfNeededRecursive];
    14221422
    1423 #if PLATFORM(IOS)
    1424     if (Frame* coreFrame = core([self _frame])) {
    1425         if (FrameView* coreView = coreFrame->view())
    1426             coreView->flushDeferredRepaints();
    1427     }
    1428 #endif
    1429 
    14301423    [super viewWillDraw];
    14311424}
Note: See TracChangeset for help on using the changeset viewer.