diff options
author | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-27 01:52:28 +0000 |
---|---|---|
committer | jamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-27 01:52:28 +0000 |
commit | 9ed83fe806a74a7b7932dc080ed884167d3e4f07 (patch) | |
tree | 5bc0999fb89efa0a5e5659b53366790dc843824c /content | |
parent | d0ef6c7e7acaab5dd3fbdd17247e9863c2681b6f (diff) | |
download | chromium_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')
-rw-r--r-- | content/renderer/gpu/render_widget_compositor.cc | 21 | ||||
-rw-r--r-- | content/renderer/gpu/render_widget_compositor.h | 3 | ||||
-rw-r--r-- | content/renderer/render_widget.cc | 5 | ||||
-rw-r--r-- | content/renderer/render_widget.h | 1 |
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, |