Bug 1765399 - Move SoftwareVsyncSource into the mozilla::gfx namespace. r=smaug

Differential Revision: https://phabricator.services.mozilla.com/D144376
This commit is contained in:
Markus Stange 2022-05-05 02:15:18 +00:00
Родитель 2d423f22c5
Коммит d53e3d4836
4 изменённых файлов: 33 добавлений и 29 удалений

Просмотреть файл

@ -9,13 +9,13 @@
#include "gfxPlatform.h" #include "gfxPlatform.h"
#include "nsThreadUtils.h" #include "nsThreadUtils.h"
using namespace mozilla; namespace mozilla::gfx {
SoftwareVsyncSource::SoftwareVsyncSource() : mVsyncEnabled(false) { SoftwareVsyncSource::SoftwareVsyncSource() : mVsyncEnabled(false) {
// Mimic 60 fps // Mimic 60 fps
MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(NS_IsMainThread());
const double rate = 1000.0 / (double)gfxPlatform::GetSoftwareVsyncRate(); const double rate = 1000.0 / (double)gfxPlatform::GetSoftwareVsyncRate();
mVsyncRate = mozilla::TimeDuration::FromMilliseconds(rate); mVsyncRate = TimeDuration::FromMilliseconds(rate);
mVsyncThread = new base::Thread("SoftwareVsyncThread"); mVsyncThread = new base::Thread("SoftwareVsyncThread");
MOZ_RELEASE_ASSERT(mVsyncThread->Start(), MOZ_RELEASE_ASSERT(mVsyncThread->Start(),
"GFX: Could not start software vsync thread"); "GFX: Could not start software vsync thread");
@ -79,13 +79,12 @@ bool SoftwareVsyncSource::IsInSoftwareVsyncThread() {
return mVsyncThread->thread_id() == PlatformThread::CurrentId(); return mVsyncThread->thread_id() == PlatformThread::CurrentId();
} }
void SoftwareVsyncSource::NotifyVsync( void SoftwareVsyncSource::NotifyVsync(const TimeStamp& aVsyncTimestamp,
const mozilla::TimeStamp& aVsyncTimestamp, const TimeStamp& aOutputTimestamp) {
const mozilla::TimeStamp& aOutputTimestamp) {
MOZ_ASSERT(IsInSoftwareVsyncThread()); MOZ_ASSERT(IsInSoftwareVsyncThread());
mozilla::TimeStamp displayVsyncTime = aVsyncTimestamp; TimeStamp displayVsyncTime = aVsyncTimestamp;
mozilla::TimeStamp now = mozilla::TimeStamp::Now(); TimeStamp now = TimeStamp::Now();
// Posted tasks can only have integer millisecond delays // Posted tasks can only have integer millisecond delays
// whereas TimeDurations can have floating point delays. // whereas TimeDurations can have floating point delays.
// Thus the vsync timestamp can be in the future, which large parts // Thus the vsync timestamp can be in the future, which large parts
@ -102,24 +101,22 @@ void SoftwareVsyncSource::NotifyVsync(
ScheduleNextVsync(aVsyncTimestamp); ScheduleNextVsync(aVsyncTimestamp);
} }
mozilla::TimeDuration SoftwareVsyncSource::GetVsyncRate() { return mVsyncRate; } TimeDuration SoftwareVsyncSource::GetVsyncRate() { return mVsyncRate; }
void SoftwareVsyncSource::ScheduleNextVsync( void SoftwareVsyncSource::ScheduleNextVsync(TimeStamp aVsyncTimestamp) {
mozilla::TimeStamp aVsyncTimestamp) {
MOZ_ASSERT(IsInSoftwareVsyncThread()); MOZ_ASSERT(IsInSoftwareVsyncThread());
mozilla::TimeStamp nextVsync = aVsyncTimestamp + mVsyncRate; TimeStamp nextVsync = aVsyncTimestamp + mVsyncRate;
mozilla::TimeDuration delay = nextVsync - mozilla::TimeStamp::Now(); TimeDuration delay = nextVsync - TimeStamp::Now();
if (delay.ToMilliseconds() < 0) { if (delay.ToMilliseconds() < 0) {
delay = mozilla::TimeDuration::FromMilliseconds(0); delay = TimeDuration::FromMilliseconds(0);
nextVsync = mozilla::TimeStamp::Now(); nextVsync = TimeStamp::Now();
} }
TimeStamp outputTime = nextVsync + mVsyncRate; TimeStamp outputTime = nextVsync + mVsyncRate;
mCurrentVsyncTask = mCurrentVsyncTask = NewCancelableRunnableMethod<TimeStamp, TimeStamp>(
NewCancelableRunnableMethod<mozilla::TimeStamp, mozilla::TimeStamp>( "SoftwareVsyncSource::NotifyVsync", this,
"SoftwareVsyncSource::NotifyVsync", this, &SoftwareVsyncSource::NotifyVsync, nextVsync, outputTime);
&SoftwareVsyncSource::NotifyVsync, nextVsync, outputTime);
RefPtr<Runnable> addrefedTask = mCurrentVsyncTask; RefPtr<Runnable> addrefedTask = mCurrentVsyncTask;
mVsyncThread->message_loop()->PostDelayedTask(addrefedTask.forget(), mVsyncThread->message_loop()->PostDelayedTask(addrefedTask.forget(),
@ -133,3 +130,5 @@ void SoftwareVsyncSource::Shutdown() {
delete mVsyncThread; delete mVsyncThread;
mVsyncThread = nullptr; mVsyncThread = nullptr;
} }
} // namespace mozilla::gfx

Просмотреть файл

@ -14,10 +14,12 @@
#include "nsISupportsImpl.h" #include "nsISupportsImpl.h"
#include "VsyncSource.h" #include "VsyncSource.h"
namespace mozilla::gfx {
// Fallback option to use a software timer to mimic vsync. Useful for gtests // Fallback option to use a software timer to mimic vsync. Useful for gtests
// To mimic a hardware vsync thread, we create a dedicated software timer // To mimic a hardware vsync thread, we create a dedicated software timer
// vsync thread. // vsync thread.
class SoftwareVsyncSource : public mozilla::gfx::VsyncSource { class SoftwareVsyncSource : public VsyncSource {
public: public:
explicit SoftwareVsyncSource(); explicit SoftwareVsyncSource();
virtual ~SoftwareVsyncSource(); virtual ~SoftwareVsyncSource();
@ -26,19 +28,20 @@ class SoftwareVsyncSource : public mozilla::gfx::VsyncSource {
void DisableVsync() override; void DisableVsync() override;
bool IsVsyncEnabled() override; bool IsVsyncEnabled() override;
bool IsInSoftwareVsyncThread(); bool IsInSoftwareVsyncThread();
void NotifyVsync(const mozilla::TimeStamp& aVsyncTimestamp, void NotifyVsync(const TimeStamp& aVsyncTimestamp,
const mozilla::TimeStamp& aOutputTimestamp) override; const TimeStamp& aOutputTimestamp) override;
mozilla::TimeDuration GetVsyncRate() override; TimeDuration GetVsyncRate() override;
void ScheduleNextVsync(mozilla::TimeStamp aVsyncTimestamp); void ScheduleNextVsync(TimeStamp aVsyncTimestamp);
void Shutdown() override; void Shutdown() override;
protected: protected:
mozilla::TimeDuration mVsyncRate; TimeDuration mVsyncRate;
// Use a chromium thread because nsITimers* fire on the main thread // Use a chromium thread because nsITimers* fire on the main thread
base::Thread* mVsyncThread; base::Thread* mVsyncThread;
RefPtr<mozilla::CancelableRunnable> RefPtr<CancelableRunnable> mCurrentVsyncTask; // only access on vsync thread
mCurrentVsyncTask; // only access on vsync thread bool mVsyncEnabled; // Only access on main thread
bool mVsyncEnabled; // Only access on main thread
}; };
} // namespace mozilla::gfx
#endif /* GFX_SOFTWARE_VSYNC_SOURCE_H */ #endif /* GFX_SOFTWARE_VSYNC_SOURCE_H */

Просмотреть файл

@ -2998,7 +2998,8 @@ RefPtr<mozilla::VsyncDispatcher> gfxPlatform::GetGlobalVsyncDispatcher() {
*/ */
already_AddRefed<mozilla::gfx::VsyncSource> already_AddRefed<mozilla::gfx::VsyncSource>
gfxPlatform::CreateSoftwareVsyncSource() { gfxPlatform::CreateSoftwareVsyncSource() {
RefPtr<mozilla::gfx::VsyncSource> softwareVsync = new SoftwareVsyncSource(); RefPtr<mozilla::gfx::VsyncSource> softwareVsync =
new mozilla::gfx::SoftwareVsyncSource();
return softwareVsync.forget(); return softwareVsync.forget();
} }

Просмотреть файл

@ -852,7 +852,8 @@ class GtkVsyncSource final : public VsyncSource {
bool mVsyncEnabled; bool mVsyncEnabled;
}; };
class XrandrSoftwareVsyncSource final : public SoftwareVsyncSource { class XrandrSoftwareVsyncSource final
: public mozilla::gfx::SoftwareVsyncSource {
public: public:
XrandrSoftwareVsyncSource() { XrandrSoftwareVsyncSource() {
MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(NS_IsMainThread());