Line data Source code
1 : /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 : * This Source Code Form is subject to the terms of the Mozilla Public
3 : * License, v. 2.0. If a copy of the MPL was not distributed with this
4 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 : */
6 :
7 : #ifndef GFX_SOFTWARE_VSYNC_SOURCE_H
8 : #define GFX_SOFTWARE_VSYNC_SOURCE_H
9 :
10 : #include "mozilla/Monitor.h"
11 : #include "mozilla/RefPtr.h"
12 : #include "mozilla/TimeStamp.h"
13 : #include "base/thread.h"
14 : #include "nsISupportsImpl.h"
15 : #include "VsyncSource.h"
16 :
17 : class SoftwareDisplay final : public mozilla::gfx::VsyncSource::Display
18 : {
19 1051 : NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SoftwareDisplay)
20 :
21 : public:
22 : SoftwareDisplay();
23 : virtual void EnableVsync() override;
24 : virtual void DisableVsync() override;
25 : virtual bool IsVsyncEnabled() override;
26 : bool IsInSoftwareVsyncThread();
27 : virtual void NotifyVsync(mozilla::TimeStamp aVsyncTimestamp) override;
28 : virtual mozilla::TimeDuration GetVsyncRate() override;
29 : void ScheduleNextVsync(mozilla::TimeStamp aVsyncTimestamp);
30 : void Shutdown() override;
31 :
32 : protected:
33 : ~SoftwareDisplay();
34 :
35 : private:
36 : mozilla::TimeDuration mVsyncRate;
37 : // Use a chromium thread because nsITimers* fire on the main thread
38 : base::Thread* mVsyncThread;
39 : RefPtr<mozilla::CancelableRunnable> mCurrentVsyncTask; // only access on vsync thread
40 : bool mVsyncEnabled; // Only access on main thread
41 : }; // SoftwareDisplay
42 :
43 : // Fallback option to use a software timer to mimic vsync. Useful for gtests
44 : // To mimic a hardware vsync thread, we create a dedicated software timer
45 : // vsync thread.
46 : class SoftwareVsyncSource : public mozilla::gfx::VsyncSource
47 : {
48 : public:
49 : SoftwareVsyncSource();
50 : ~SoftwareVsyncSource();
51 :
52 33 : virtual Display& GetGlobalDisplay() override
53 : {
54 33 : MOZ_ASSERT(mGlobalDisplay != nullptr);
55 33 : return *mGlobalDisplay;
56 : }
57 :
58 : private:
59 : RefPtr<SoftwareDisplay> mGlobalDisplay;
60 : };
61 :
62 : #endif /* GFX_SOFTWARE_VSYNC_SOURCE_H */
|