diff options
| author | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2014-10-08 13:38:33 +0200 |
|---|---|---|
| committer | Allan Sandfeld Jensen <allan.jensen@digia.com> | 2014-10-13 15:53:45 +0200 |
| commit | f384f80057d0648692a01ae034ec27d56b455010 (patch) | |
| tree | 34208b4ccc1b7ba626ce90faee779262cd923aa6 | |
| parent | 2b23baa7665f49b05ea3bab949a6324c491eb79f (diff) | |
| download | qtwebkit-f384f80057d0648692a01ae034ec27d56b455010.tar.gz | |
Do not let TexureMapper create backing stores that are too large
TextureMapper without Coordinated Graphics will preallocate all tiles
for a backing store. This makes it impossible to handle very large
backing stores as they will cause memory exhaution.
This patch disables composited layers with more pixels than 8192
squared, unless the ChromeClient has allowed large accelerated
layers.
Task-number: QTBUG-41404
Change-Id: Id71628da139f886aceb00732ae59dac2600ef863
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
| -rw-r--r-- | Source/WebCore/page/ChromeClient.h | 1 | ||||
| -rw-r--r-- | Source/WebCore/rendering/RenderLayerCompositor.cpp | 4 | ||||
| -rw-r--r-- | Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h | 3 |
3 files changed, 7 insertions, 1 deletions
diff --git a/Source/WebCore/page/ChromeClient.h b/Source/WebCore/page/ChromeClient.h index 6fce249eb..3146d41ff 100644 --- a/Source/WebCore/page/ChromeClient.h +++ b/Source/WebCore/page/ChromeClient.h @@ -266,6 +266,7 @@ public: FilterTrigger = 1 << 5, ScrollableInnerFrameTrigger = 1 << 6, AnimatedOpacityTrigger = 1 << 7, + LargeAreaTrigger = 1 << 8, AllTriggers = 0xFFFFFFFF }; typedef unsigned CompositingTriggerFlags; diff --git a/Source/WebCore/rendering/RenderLayerCompositor.cpp b/Source/WebCore/rendering/RenderLayerCompositor.cpp index 784ebdc80..da390cb75 100644 --- a/Source/WebCore/rendering/RenderLayerCompositor.cpp +++ b/Source/WebCore/rendering/RenderLayerCompositor.cpp @@ -85,6 +85,7 @@ bool WebCoreHas3DRendering = true; namespace WebCore { static const int canvasAreaThresholdRequiringCompositing = 50 * 100; +static const int largeAreaThresholdForCompositing = 8192 * 8192; // During page loading delay layer flushes up to this many seconds to allow them coalesce, reducing workload. static const double throttledLayerFlushDelay = .5; @@ -1804,6 +1805,9 @@ bool RenderLayerCompositor::requiresCompositingLayer(const RenderLayer* layer, R bool RenderLayerCompositor::canBeComposited(const RenderLayer* layer) const { + if (!(m_compositingTriggers & ChromeClient::LargeAreaTrigger) && layer->size().area() > largeAreaThresholdForCompositing) + return false; + // FIXME: We disable accelerated compositing for elements in a RenderFlowThread as it doesn't work properly. // See http://webkit.org/b/84900 to re-enable it. return m_hasAcceleratedCompositing && layer->isSelfPaintingLayer() && layer->renderer()->flowThreadState() == RenderObject::NotInsideFlowThread; diff --git a/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h b/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h index d48b67ab0..c0cbee716 100644 --- a/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h +++ b/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h @@ -192,7 +192,8 @@ private: VideoTrigger | PluginTrigger| CanvasTrigger | - AnimationTrigger); + AnimationTrigger | + LargeAreaTrigger); } virtual bool layerTreeStateIsFrozen() const OVERRIDE; |
