summaryrefslogtreecommitdiffstats
path: root/content/renderer
diff options
context:
space:
mode:
authorjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-27 01:52:28 +0000
committerjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-02-27 01:52:28 +0000
commit9ed83fe806a74a7b7932dc080ed884167d3e4f07 (patch)
tree5bc0999fb89efa0a5e5659b53366790dc843824c /content/renderer
parentd0ef6c7e7acaab5dd3fbdd17247e9863c2681b6f (diff)
downloadchromium_src-9ed83fe806a74a7b7932dc080ed884167d3e4f07.zip
chromium_src-9ed83fe806a74a7b7932dc080ed884167d3e4f07.tar.gz
chromium_src-9ed83fe806a74a7b7932dc080ed884167d3e4f07.tar.bz2
RenderWidget side compositor scheduling logic
This moves the compositor scheduling suppression logic out to RenderWidget / RenderWidgetCompositor so we don't have to bounce through WebKit just to do this. The suppression logic is needed to avoid producing unwanted frames during page transitions when in single-threaded compositing mode which will often be white flashes and which slow down the page cycler benchmarks. This implements WebKit API that will be added by https://bugs.webkit.org/show_bug.cgi?id=110640. This patch will compile before that patch lands and rolls, but will introduce page cycler regressions and flashes. BUG= Review URL: https://chromiumcodereview.appspot.com/12319076 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@184826 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer')
-rw-r--r--content/renderer/gpu/render_widget_compositor.cc21
-rw-r--r--content/renderer/gpu/render_widget_compositor.h3
-rw-r--r--content/renderer/render_widget.cc5
-rw-r--r--content/renderer/render_widget.h1
4 files changed, 26 insertions, 4 deletions
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index b602930..5534f18 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -214,12 +214,26 @@ scoped_ptr<RenderWidgetCompositor> RenderWidgetCompositor::Create(
RenderWidgetCompositor::RenderWidgetCompositor(
RenderWidget* widget, WebKit::WebLayerTreeViewClient* client)
- : widget_(widget),
+ : suppress_schedule_composite_(false),
+ widget_(widget),
client_(client) {
}
RenderWidgetCompositor::~RenderWidgetCompositor() {}
+void RenderWidgetCompositor::SetSuppressScheduleComposite(bool suppress) {
+ if (suppress_schedule_composite_ == suppress)
+ return;
+
+ if (suppress)
+ TRACE_EVENT_ASYNC_BEGIN0("gpu",
+ "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
+ else
+ TRACE_EVENT_ASYNC_END0("gpu",
+ "RenderWidgetCompositor::SetSuppressScheduleComposite", this);
+ suppress_schedule_composite_ = suppress;
+}
+
bool RenderWidgetCompositor::initialize(cc::LayerTreeSettings settings) {
scoped_ptr<cc::Thread> impl_thread;
CompositorThread* compositor_thread =
@@ -434,10 +448,9 @@ void RenderWidgetCompositor::didCompleteSwapBuffers() {
widget_->didCompleteSwapBuffers();
}
-// TODO(jamesr): This goes through WebViewImpl just to do suppression, refactor
-// that piece out.
void RenderWidgetCompositor::scheduleComposite() {
- client_->scheduleComposite();
+ if (!suppress_schedule_composite_)
+ widget_->scheduleComposite();
}
class RenderWidgetCompositor::MainThreadContextProvider
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h
index ea1a0f5..ccf84e3 100644
--- a/content/renderer/gpu/render_widget_compositor.h
+++ b/content/renderer/gpu/render_widget_compositor.h
@@ -30,6 +30,8 @@ class RenderWidgetCompositor : public WebKit::WebLayerTreeView,
cc::LayerTreeHost* layer_tree_host() const { return layer_tree_host_.get(); }
+ void SetSuppressScheduleComposite(bool suppress);
+
// WebLayerTreeView implementation.
virtual void setSurfaceReady();
virtual void setRootLayer(const WebKit::WebLayer& layer);
@@ -95,6 +97,7 @@ private:
bool initialize(cc::LayerTreeSettings settings);
bool threaded_;
+ bool suppress_schedule_composite_;
RenderWidget* widget_;
WebKit::WebLayerTreeViewClient* client_;
scoped_ptr<cc::LayerTreeHost> layer_tree_host_;
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index b8982cc..a7cf437 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -1354,6 +1354,11 @@ WebKit::WebLayerTreeView* RenderWidget::layerTreeView() {
return compositor_.get();
}
+void RenderWidget::suppressCompositorScheduling(bool enable) {
+ if (compositor_)
+ compositor_->SetSuppressScheduleComposite(enable);
+}
+
void RenderWidget::willBeginCompositorFrame() {
TRACE_EVENT0("gpu", "RenderWidget::willBeginCompositorFrame");
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index a9c6ba7..503e3d7 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -117,6 +117,7 @@ class CONTENT_EXPORT RenderWidget
virtual bool Send(IPC::Message* msg) OVERRIDE;
// WebKit::WebWidgetClient
+ virtual void suppressCompositorScheduling(bool enable);
virtual void willBeginCompositorFrame();
virtual void didInvalidateRect(const WebKit::WebRect&);
virtual void didScrollRect(int dx, int dy,