Changeset 162837 in webkit
- Timestamp:
- Jan 27, 2014, 7:11:08 AM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 12 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/WebCore.exp.in (modified) (1 diff)
-
WebCore/dom/Document.cpp (modified) (2 diffs)
-
WebCore/editing/AlternativeTextController.cpp (modified) (1 diff)
-
WebCore/loader/FrameLoader.cpp (modified) (2 diffs)
-
WebCore/page/EventHandler.cpp (modified) (4 diffs)
-
WebCore/page/Frame.cpp (modified) (1 diff)
-
WebCore/page/FrameView.cpp (modified) (11 diffs)
-
WebCore/page/FrameView.h (modified) (5 diffs)
-
WebCore/rendering/RenderView.cpp (modified) (2 diffs)
-
WebKit/efl/ewk/ewk_settings.cpp (modified) (1 diff)
-
WebKit/mac/WebView/WebHTMLView.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r162836 r162837 1 2014-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 1 36 2014-01-24 Eric Carlson <eric.carlson@apple.com> 2 37 -
trunk/Source/WebCore/WebCore.exp.in
r162808 r162837 1277 1277 __ZN7WebCore9FrameView20resetTrackedRepaintsEv 1278 1278 __ZN7WebCore9FrameView20setCanHaveScrollbarsEb 1279 __ZN7WebCore9FrameView21flushDeferredRepaintsEv1280 1279 __ZN7WebCore9FrameView22setBaseBackgroundColorERKNS_5ColorE 1281 1280 __ZN7WebCore9FrameView23updateCanHaveScrollbarsEv -
trunk/Source/WebCore/dom/Document.cpp
r162816 r162837 1740 1740 WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates; 1741 1741 1742 frameView.beginDeferredRepaints();1743 1744 1742 if (m_pendingStyleRecalcShouldForce) 1745 1743 change = Style::Force; … … 1765 1763 if (m_styleResolver) 1766 1764 m_styleSheetCollection.resetCSSFeatureFlags(); 1767 1768 frameView.endDeferredRepaints();1769 1765 } 1770 1766 -
trunk/Source/WebCore/editing/AlternativeTextController.cpp
r161768 r162837 690 690 691 691 if (FrameView* view = m_frame.view()) 692 view-> resetDeferredRepaintDelay();692 view->disableLayerFlushThrottlingTemporarilyForInteraction(); 693 693 694 694 RefPtr<TextEvent> event = TextEvent::createForDictation(m_frame.document()->domWindow(), text, dictationAlternatives); -
trunk/Source/WebCore/loader/FrameLoader.cpp
r162834 r162837 799 799 m_shouldCallCheckCompleted = false; 800 800 801 if (m_frame.view())802 m_frame.view()->handleLoadCompleted();803 804 801 // Have we completed before? 805 802 if (m_isComplete) … … 846 843 if (m_frame.page()) 847 844 checkLoadComplete(); 848 849 if (m_frame.view())850 m_frame.view()->handleLoadCompleted();851 845 } 852 846 -
trunk/Source/WebCore/page/EventHandler.cpp
r162745 r162837 2017 2017 return false; 2018 2018 2019 view-> resetDeferredRepaintDelay();2019 view->disableLayerFlushThrottlingTemporarilyForInteraction(); 2020 2020 RefPtr<MouseEvent> me = MouseEvent::create(eventType, 2021 2021 true, true, event.timestamp(), m_frame.document()->defaultView(), … … 2389 2389 { 2390 2390 if (FrameView* view = m_frame.view()) 2391 view-> resetDeferredRepaintDelay();2391 view->disableLayerFlushThrottlingTemporarilyForInteraction(); 2392 2392 2393 2393 updateMouseEventTargetNode(targetNode, mouseEvent, setUnder); … … 2915 2915 2916 2916 if (FrameView* view = m_frame.view()) 2917 view-> resetDeferredRepaintDelay();2917 view->disableLayerFlushThrottlingTemporarilyForInteraction(); 2918 2918 2919 2919 // FIXME (bug 68185): this call should be made at another abstraction layer … … 3337 3337 3338 3338 if (FrameView* view = m_frame.view()) 3339 view-> resetDeferredRepaintDelay();3339 view->disableLayerFlushThrottlingTemporarilyForInteraction(); 3340 3340 3341 3341 RefPtr<TextEvent> event = TextEvent::create(m_frame.document()->domWindow(), text, inputType); -
trunk/Source/WebCore/page/Frame.cpp
r162691 r162837 957 957 return; 958 958 m_view->updateLayoutAndStyleIfNeededRecursive(); 959 m_view->flushDeferredRepaints();960 959 } 961 960 -
trunk/Source/WebCore/page/FrameView.cpp
r162795 r162837 119 119 double FrameView::sCurrentPaintTimeStamp = 0.0; 120 120 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 delay126 double FrameView::s_normalDeferredRepaintDelay = 0.016;127 // Negative value would mean that first few repaints happen without a delay128 double FrameView::s_initialDeferredRepaintDelayDuringLoading = 0;129 // The delay grows on each repaint to this maximum value130 double FrameView::s_maxDeferredRepaintDelayDuringLoading = 2.5;131 // On each repaint the delay increses by this amount132 double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0.5;133 #else134 // 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 #endif142 143 121 // The maximum number of updateEmbeddedObjects iterations that should be done before returning. 144 122 static const unsigned maxUpdateEmbeddedObjectsIterations = 2; … … 199 177 , m_inProgrammaticScroll(false) 200 178 , m_safeToPropagateScrollToParent(true) 201 , m_deferredRepaintTimer(this, &FrameView::deferredRepaintTimerFired)202 179 , m_isTrackingRepaints(false) 203 180 , m_shouldUpdateWhileOffscreen(true) … … 286 263 m_lastViewportSize = IntSize(); 287 264 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();293 265 m_isTrackingRepaints = false; 294 266 m_trackedRepaintRects.clear(); … … 903 875 return false; 904 876 905 // If we sync compositing layers and allow the repaint to be deferred, there is time for a906 // visible flash to occur. Instead, stop the deferred repaint timer and repaint immediately.907 flushDeferredRepaints();908 909 877 #if PLATFORM(IOS) 910 878 if (TileCache* tileCache = this->tileCache()) … … 1313 1281 m_layoutPhase = InLayout; 1314 1282 1315 beginDeferredRepaints();1316 1283 forceLayoutParentViewIfNeeded(); 1317 1284 … … 1333 1300 root->layout(); 1334 1301 #endif 1335 endDeferredRepaints();1336 1302 1337 1303 ASSERT(m_layoutPhase == InLayout); … … 1357 1323 1358 1324 // Now update the positions of all layers. 1359 beginDeferredRepaints();1360 1325 if (m_needsFullRepaint) 1361 1326 root->view().repaintRootContents(); 1362 1327 1363 1328 layer->updateLayerPositionsAfterLayout(renderView()->layer(), updateLayerPositionFlags(layer, subtree, m_needsFullRepaint)); 1364 1365 endDeferredRepaints();1366 1329 1367 1330 #if USE(ACCELERATED_COMPOSITING) … … 2160 2123 addTrackedRepaintRect(r); 2161 2124 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 else2179 m_repaintRects[0].unite(paintRect);2180 m_repaintCount++;2181 2182 if (!m_deferringRepaints)2183 startDeferredRepaintTimer(delay);2184 2185 return;2186 }2187 2188 2125 if (!shouldUpdate(immediate)) 2189 2126 return; … … 2276 2213 } 2277 2214 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 } 2215 void FrameView::disableLayerFlushThrottlingTemporarilyForInteraction() 2216 { 2395 2217 #if USE(ACCELERATED_COMPOSITING) 2396 2218 if (RenderView* view = renderView()) 2397 2219 view->compositor().disableLayerFlushThrottlingTemporarilyForInteraction(); 2398 2220 #endif 2399 }2400 2401 double FrameView::adjustedDeferredRepaintDelay() const2402 {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();2413 2221 } 2414 2222 … … 3823 3631 childViews[i]->updateLayoutAndStyleIfNeededRecursive(); 3824 3632 3825 // updateLayoutAndStyleIfNeededRecursive is called when we need to make sure style and layout are up-to-date before3826 // painting, so we need to flush out any deferred repaints too.3827 flushDeferredRepaints();3828 3829 3633 // When frame flattening is on, child frame can mark parent frame dirty. In such case, child frame 3830 3634 // needs to call layout on parent frame recursively. … … 4116 3920 } 4117 3921 4118 // Normal delay4119 void FrameView::setRepaintThrottlingDeferredRepaintDelay(double p)4120 {4121 s_normalDeferredRepaintDelay = p;4122 }4123 4124 // Negative value would mean that first few repaints happen without a delay4125 void FrameView::setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p)4126 {4127 s_initialDeferredRepaintDelayDuringLoading = p;4128 }4129 4130 // The delay grows on each repaint to this maximum value4131 void FrameView::setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p)4132 {4133 s_maxDeferredRepaintDelayDuringLoading = p;4134 }4135 4136 // On each repaint the delay increases by this amount4137 void FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p)4138 {4139 s_deferredRepaintDelayIncrementDuringLoading = p;4140 }4141 4142 3922 void FrameView::setTracksRepaints(bool trackRepaints) 4143 3923 { -
trunk/Source/WebCore/page/FrameView.h
r162795 r162837 261 261 bool fixedElementsLayoutRelativeToFrame() const; 262 262 263 void beginDeferredRepaints(); 264 void endDeferredRepaints(); 265 void handleLoadCompleted(); 266 void flushDeferredRepaints(); 267 void startDeferredRepaintTimer(double delay); 268 void resetDeferredRepaintDelay(); 269 263 void disableLayerFlushThrottlingTemporarilyForInteraction(); 270 264 void updateLayerFlushThrottlingInAllFrames(); 271 265 void adjustTiledBackingCoverage(); … … 361 355 void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule); 362 356 363 // Normal delay364 static void setRepaintThrottlingDeferredRepaintDelay(double p);365 // Negative value would mean that first few repaints happen without a delay366 static void setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(double p);367 // The delay grows on each repaint to this maximum value368 static void setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(double p);369 // On each repaint the delay increses by this amount370 static void setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(double p);371 372 357 virtual IntPoint lastKnownMousePosition() const override; 373 358 virtual bool isHandlingWheelEvent() const override; … … 553 538 virtual void notifyPageThatContentAreaWillPaint() const override; 554 539 555 bool shouldUseLoadTimeDeferredRepaintDelay() const;556 void deferredRepaintTimerFired(Timer<FrameView>&);557 void doDeferredRepaints();558 void updateDeferredRepaintDelayAfterRepaint();559 double adjustedDeferredRepaintDelay() const;560 561 540 void enableSpeculativeTilingIfNeeded(); 562 541 void speculativeTilingEnableTimerFired(Timer<FrameView>&); … … 638 617 bool m_safeToPropagateScrollToParent; 639 618 640 unsigned m_deferringRepaints;641 unsigned m_repaintCount;642 Vector<LayoutRect> m_repaintRects;643 Timer<FrameView> m_deferredRepaintTimer;644 double m_deferredRepaintDelay;645 619 double m_lastPaintTime; 646 620 … … 699 673 LayoutMilestones m_milestonesPendingPaint; 700 674 701 static double s_normalDeferredRepaintDelay;702 static double s_initialDeferredRepaintDelayDuringLoading;703 static double s_maxDeferredRepaintDelayDuringLoading;704 static double s_deferredRepaintDelayIncrementDuringLoading;705 706 675 static const unsigned visualCharacterThreshold = 200; 707 676 static const unsigned visualPixelThreshold = 32 * 32; -
trunk/Source/WebCore/rendering/RenderView.cpp
r162726 r162837 930 930 return; 931 931 932 frameView().beginDeferredRepaints();933 934 932 // Have any of the old selected objects changed compared to the new selection? 935 933 for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) { … … 972 970 for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i) 973 971 i->value->repaint(); 974 975 frameView().endDeferredRepaints();976 972 } 977 973 -
trunk/Source/WebKit/efl/ewk/ewk_settings.cpp
r159679 r162837 320 320 void ewk_settings_repaint_throttling_set(double deferredRepaintDelay, double initialDeferredRepaintDelayDuringLoading, double maxDeferredRepaintDelayDuringLoading, double deferredRepaintDelayIncrementDuringLoading) 321 321 { 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); 326 327 } 327 328 -
trunk/Source/WebKit/mac/WebView/WebHTMLView.mm
r161931 r162837 1421 1421 [self _web_updateLayoutAndStyleIfNeededRecursive]; 1422 1422 1423 #if PLATFORM(IOS)1424 if (Frame* coreFrame = core([self _frame])) {1425 if (FrameView* coreView = coreFrame->view())1426 coreView->flushDeferredRepaints();1427 }1428 #endif1429 1430 1423 [super viewWillDraw]; 1431 1424 }
Note:
See TracChangeset
for help on using the changeset viewer.