summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2014-10-08 13:38:33 +0200
committerAllan Sandfeld Jensen <allan.jensen@digia.com>2014-10-13 15:53:45 +0200
commitf384f80057d0648692a01ae034ec27d56b455010 (patch)
tree34208b4ccc1b7ba626ce90faee779262cd923aa6
parent2b23baa7665f49b05ea3bab949a6324c491eb79f (diff)
downloadqtwebkit-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.h1
-rw-r--r--Source/WebCore/rendering/RenderLayerCompositor.cpp4
-rw-r--r--Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h3
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;