Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Unified Diff: components/exo/surface.h

Issue 2610513006: exo: Implement presentation interface. (Closed)
Patch Set: dcastagna nits Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/exo/compositor_frame_sink_holder.cc ('k') | components/exo/surface.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/exo/surface.h
diff --git a/components/exo/surface.h b/components/exo/surface.h
index fcc0a71dd3367baa3840c6653b7c958768d83745..0aeaa0edaa9481a287195be1f8d3fc6d73a52346 100644
--- a/components/exo/surface.h
+++ b/components/exo/surface.h
@@ -24,6 +24,7 @@
#include "third_party/skia/include/core/SkRegion.h"
#include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
+#include "ui/compositor/compositor_vsync_manager.h"
#include "ui/gfx/geometry/rect.h"
namespace base {
@@ -60,7 +61,9 @@ using CursorProvider = Pointer;
// This class represents a rectangular area that is displayed on the screen.
// It has a location, size and pixel contents.
-class Surface : public ui::ContextFactoryObserver, public aura::WindowObserver {
+class Surface : public ui::ContextFactoryObserver,
+ public aura::WindowObserver,
+ public ui::CompositorVSyncManager::Observer {
public:
using PropertyDeallocator = void (*)(int64_t value);
@@ -87,11 +90,18 @@ class Surface : public ui::ContextFactoryObserver, public aura::WindowObserver {
// repainted.
void Damage(const gfx::Rect& rect);
- // Request notification when the next frame is displayed. Useful for
- // throttling redrawing operations, and driving animations.
+ // Request notification when it's a good time to produce a new frame. Useful
+ // for throttling redrawing operations, and driving animations.
using FrameCallback = base::Callback<void(base::TimeTicks frame_time)>;
void RequestFrameCallback(const FrameCallback& callback);
+ // Request notification when the next frame is displayed. Useful for
+ // throttling redrawing operations, and driving animations.
+ using PresentationCallback =
+ base::Callback<void(base::TimeTicks presentation_time,
+ base::TimeDelta refresh)>;
+ void RequestPresentationCallback(const PresentationCallback& callback);
+
// This sets the region of the surface that contains opaque content.
void SetOpaqueRegion(const SkRegion& region);
@@ -179,11 +189,15 @@ class Surface : public ui::ContextFactoryObserver, public aura::WindowObserver {
// Returns a trace value representing the state of the surface.
std::unique_ptr<base::trace_event::TracedValue> AsTracedValue() const;
- // Called when surface is being scheduled for a draw.
+ // Call this to indicate that surface is being scheduled for a draw.
void WillDraw();
- // Called when the begin frame source has changed.
- void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source);
+ // Returns true when there's an active frame callback that requires a
+ // BeginFrame() call.
+ bool NeedsBeginFrame() const;
+
+ // Call this to indicate that it's a good time to start producing a new frame.
+ void BeginFrame(base::TimeTicks frame_time);
// Check whether this Surface and its children need to create new cc::Surface
// IDs for their contents next time they get new buffer contents.
@@ -200,6 +214,10 @@ class Surface : public ui::ContextFactoryObserver, public aura::WindowObserver {
void OnWindowRemovingFromRootWindow(aura::Window* window,
aura::Window* new_root) override;
+ // Overridden from ui::CompositorVSyncManager::Observer:
+ void OnUpdateVSyncParameters(base::TimeTicks timebase,
+ base::TimeDelta interval) override;
+
// Sets the |value| of the given surface |property|. Setting to the default
// value (e.g., NULL) removes the property. The caller is responsible for the
// lifetime of any object set as a property on the Surface.
@@ -333,6 +351,19 @@ class Surface : public ui::ContextFactoryObserver, public aura::WindowObserver {
// be drawn. They fire at the first begin frame notification after this.
std::list<FrameCallback> pending_frame_callbacks_;
std::list<FrameCallback> frame_callbacks_;
+ std::list<FrameCallback> active_frame_callbacks_;
+
+ // These lists contains the callbacks to notify the client when surface
+ // contents have been presented. These callbacks move to
+ // |presentation_callbacks_| when Commit() is called. Later they are moved to
+ // |swapping_presentation_callbacks_| when the effect of the Commit() is
+ // scheduled to be drawn and then moved to |swapped_presentation_callbacks_|
+ // after receiving VSync parameters update for the previous frame. They fire
+ // at the next VSync parameters update after that.
+ std::list<PresentationCallback> pending_presentation_callbacks_;
+ std::list<PresentationCallback> presentation_callbacks_;
+ std::list<PresentationCallback> swapping_presentation_callbacks_;
+ std::list<PresentationCallback> swapped_presentation_callbacks_;
// This is the state that has yet to be committed.
State pending_state_;
« no previous file with comments | « components/exo/compositor_frame_sink_holder.cc ('k') | components/exo/surface.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698