diff options
author | brianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-18 12:32:35 +0000 |
---|---|---|
committer | brianderson@chromium.org <brianderson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-18 12:32:35 +0000 |
commit | 049fc7a730faa0dc77df259cc63a7907bc87d922 (patch) | |
tree | f78d949c8bf641542c1225129ed49da901a333a5 /cc/output/output_surface.h | |
parent | f56c7874661fc602acb108ad923b9e7118eba058 (diff) | |
download | chromium_src-049fc7a730faa0dc77df259cc63a7907bc87d922.zip chromium_src-049fc7a730faa0dc77df259cc63a7907bc87d922.tar.gz chromium_src-049fc7a730faa0dc77df259cc63a7907bc87d922.tar.bz2 |
cc: Emulate BeginFrame in OutputSurfaces that don't support it natively
Relanding again. This time, the proactive SetNeedsBeginFrame is
broken out explicitly with logic to workaround crbug 249806 and
to avoid expensive redraws with the synchronous renderer.
This includes two small fixes for the original version of this
patch that broke software compositing and WebView.
This will allow us to avoid having two different code paths
in the Scheduler. It also allows us to more easily remove the
VSyncTimeSource and FrameRateController from the Scheduler.
This patch instantiates the FrameRateController inside of
OutputSurface for now, but the FrameRateController could be
removed in future patches.
BUG=245920
BUG=243497
BUG=249806
TBR=nduca@chromium.org,sievers@chromium.org,kbr@chromium.org
Review URL: https://chromiumcodereview.appspot.com/17353002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206955 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/output/output_surface.h')
-rw-r--r-- | cc/output/output_surface.h | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/cc/output/output_surface.h b/cc/output/output_surface.h index d263d3a..8f782d7 100644 --- a/cc/output/output_surface.h +++ b/cc/output/output_surface.h @@ -12,6 +12,7 @@ #include "cc/base/cc_export.h" #include "cc/output/context_provider.h" #include "cc/output/software_output_device.h" +#include "cc/scheduler/frame_rate_controller.h" #include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" namespace ui { struct LatencyInfo; } @@ -19,13 +20,16 @@ namespace ui { struct LatencyInfo; } namespace gfx { class Rect; class Size; +class Transform; } namespace cc { class CompositorFrame; +class CompositorFrameAck; class OutputSurfaceClient; class OutputSurfaceCallbacks; +class Thread; // Represents the output surface for a compositor. The compositor owns // and manages its destruction. Its lifetime is: @@ -34,7 +38,7 @@ class OutputSurfaceCallbacks; // From here on, it will only be used on the compositor thread. // 3. If the 3D context is lost, then the compositor will delete the output // surface (on the compositor thread) and go back to step 1. -class CC_EXPORT OutputSurface { +class CC_EXPORT OutputSurface : public FrameRateControllerClient { public: explicit OutputSurface(scoped_ptr<WebKit::WebGraphicsContext3D> context3d); @@ -83,6 +87,13 @@ class CC_EXPORT OutputSurface { // thread. virtual bool BindToClient(OutputSurfaceClient* client); + void InitializeBeginFrameEmulation( + Thread* thread, + bool throttle_frame_production, + base::TimeDelta interval); + + void SetMaxFramesPending(int max_frames_pending); + virtual void EnsureBackbuffer(); virtual void DiscardBackbuffer(); @@ -103,7 +114,7 @@ class CC_EXPORT OutputSurface { // Requests a BeginFrame notification from the output surface. The // notification will be delivered by calling // OutputSurfaceClient::BeginFrame until the callback is disabled. - virtual void SetNeedsBeginFrame(bool enable) {} + virtual void SetNeedsBeginFrame(bool enable); protected: // Synchronously initialize context3d and enter hardware mode. @@ -116,7 +127,6 @@ class CC_EXPORT OutputSurface { void PostSwapBuffersComplete(); - OutputSurfaceClient* client_; struct cc::OutputSurface::Capabilities capabilities_; scoped_ptr<OutputSurfaceCallbacks> callbacks_; scoped_ptr<WebKit::WebGraphicsContext3D> context3d_; @@ -125,12 +135,34 @@ class CC_EXPORT OutputSurface { bool has_swap_buffers_complete_callback_; gfx::Size surface_size_; float device_scale_factor_; + base::WeakPtrFactory<OutputSurface> weak_ptr_factory_; + + // The FrameRateController is deprecated. + // Platforms should move to native BeginFrames instead. + void OnVSyncParametersChanged(base::TimeTicks timebase, + base::TimeDelta interval); + virtual void FrameRateControllerTick(bool throttled) OVERRIDE; + scoped_ptr<FrameRateController> frame_rate_controller_; + int max_frames_pending_; + int pending_swap_buffers_; + bool begin_frame_pending_; + + // Forwarded to OutputSurfaceClient but threaded through OutputSurface + // first so OutputSurface has a chance to update the FrameRateController + bool HasClient() { return !!client_; } + void SetNeedsRedrawRect(gfx::Rect damage_rect); + void BeginFrame(base::TimeTicks frame_time); + void DidSwapBuffers(); + void OnSwapBuffersComplete(const CompositorFrameAck* ack); + void DidLoseOutputSurface(); + void SetExternalDrawConstraints(const gfx::Transform& transform, + gfx::Rect viewport); private: - void SetContext3D(scoped_ptr<WebKit::WebGraphicsContext3D> context3d); - void SwapBuffersComplete(); + OutputSurfaceClient* client_; + friend class OutputSurfaceCallbacks; - base::WeakPtrFactory<OutputSurface> weak_ptr_factory_; + void SetContext3D(scoped_ptr<WebKit::WebGraphicsContext3D> context3d); DISALLOW_COPY_AND_ASSIGN(OutputSurface); }; |