/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef mozilla_widget_VsyncDispatcher_h #define mozilla_widget_VsyncDispatcher_h #include "base/message_loop.h" #include "mozilla/Mutex.h" #include "nsISupportsImpl.h" #include "nsTArray.h" #include "ThreadSafeRefcountingWithMainThreadDestruction.h" class MessageLoop; namespace mozilla { class TimeStamp; namespace layers { class CompositorVsyncObserver; } class VsyncObserver { // Must be destroyed on main thread since the compositor is as well NS_INLINE_DECL_THREADSAFE_REFCOUNTING_WITH_MAIN_THREAD_DESTRUCTION(VsyncObserver) public: // The method called when a vsync occurs. Return true if some work was done. // Vsync notifications will occur on the hardware vsync thread virtual bool NotifyVsync(TimeStamp aVsyncTimestamp) = 0; protected: VsyncObserver() {} virtual ~VsyncObserver() {} }; // VsyncDispatcher is used to dispatch vsync events to the registered observers. class VsyncDispatcher { NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VsyncDispatcher) public: static VsyncDispatcher* GetInstance(); // Called on the vsync thread when a hardware vsync occurs void NotifyVsync(TimeStamp aVsyncTimestamp); // Compositor vsync observers must be added/removed on the compositor thread void AddCompositorVsyncObserver(VsyncObserver* aVsyncObserver); void RemoveCompositorVsyncObserver(VsyncObserver* aVsyncObserver); private: VsyncDispatcher(); virtual ~VsyncDispatcher(); void DispatchTouchEvents(bool aNotifiedCompositors, TimeStamp aVsyncTime); // Called on the vsync thread. Returns true if observers were notified bool NotifyVsyncObservers(TimeStamp aVsyncTimestamp, nsTArray>& aObservers); // Can have multiple compositors. On desktop, this is 1 compositor per window Mutex mCompositorObserverLock; nsTArray> mCompositorObservers; }; } // namespace mozilla #endif // __mozilla_widget_VsyncDispatcher_h