forked from mirrors/gecko-dev
To allow `requestAnimationFrame()` and similar things to run at monitor speed if there is only a window-specific vsyncsource available. This is the case for Wayland and, in the future, EGL/X11. Other backends may opt for window specific vsyncsources as well at some point. The idea is to, instead of using global vsync objects, expose a vsyncsource from nsWindow and use it for refresh drivers. For the content process, move VsyncChild to BrowserChild, so for each Browserchild there is only one VsyncChild to which all refresh drivers connect. IPC in managed either by PBrowser or PBackground. Right now, PBrowser is only used on Wayland, as both PBrowser and the Wayland vsyncsource run on the main thread. Other backends keep using the background thread for now. While at it, make it so that we constantly update the refresh rate. This is necessary for Wayland, but also on other platforms variable refresh rates are increasingly common. Do that by transimitting the vsync rate `SendNotify()`. How to test: - run the Wayland backend - enable `widget.wayland_vsync.enabled` - optionally: disable `privacy.reduceTimerPrecision` - run `vsynctester.com` or `testufo.com` Expected results: Instead of fixed 60Hz, things should update at monitor refresh rate - e.g. 144Hz Original patch by Kenny Levinsen. Depends on D98254 Differential Revision: https://phabricator.services.mozilla.com/D93173
54 lines
1.6 KiB
C++
54 lines
1.6 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* 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_dom_ipc_VsyncParent_h
|
|
#define mozilla_dom_ipc_VsyncParent_h
|
|
|
|
#include "mozilla/dom/PVsyncParent.h"
|
|
#include "mozilla/VsyncDispatcher.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "mozilla/RefPtr.h"
|
|
#include "VsyncSource.h"
|
|
|
|
class nsIThread;
|
|
|
|
namespace mozilla::dom {
|
|
|
|
// Use PBackground thread in the main process to send vsync notifications to
|
|
// content process. This actor will be released when its parent protocol calls
|
|
// DeallocPVsyncParent().
|
|
class VsyncParent final : public PVsyncParent, public VsyncObserver {
|
|
friend class PVsyncParent;
|
|
|
|
public:
|
|
VsyncParent();
|
|
void UpdateVsyncSource(const RefPtr<gfx::VsyncSource>& aVsyncSource);
|
|
|
|
private:
|
|
virtual ~VsyncParent() = default;
|
|
|
|
virtual bool NotifyVsync(const VsyncEvent& aVsync) override;
|
|
virtual void ActorDestroy(ActorDestroyReason aActorDestroyReason) override;
|
|
|
|
mozilla::ipc::IPCResult RecvObserve();
|
|
mozilla::ipc::IPCResult RecvUnobserve();
|
|
|
|
void DispatchVsyncEvent(const VsyncEvent& aVsync);
|
|
void UpdateVsyncRate();
|
|
|
|
bool IsOnInitialThread();
|
|
void AssertIsOnInitialThread();
|
|
|
|
bool mObservingVsync;
|
|
bool mDestroyed;
|
|
nsCOMPtr<nsIThread> mInitialThread;
|
|
RefPtr<gfx::VsyncSource> mVsyncSource;
|
|
RefPtr<RefreshTimerVsyncDispatcher> mVsyncDispatcher;
|
|
};
|
|
|
|
} // namespace mozilla::dom
|
|
|
|
#endif // mozilla_dom_ipc_VsyncParent_h
|