Bug 1299928 - Part 6: Making GamepadManager is only run at the same process at VRMangerChild; r?kip
MozReview-Commit-ID: HrPHptVNgtq
--- a/dom/gamepad/GamepadManager.cpp
+++ b/dom/gamepad/GamepadManager.cpp
@@ -620,16 +620,17 @@ GamepadManager::ActorCreated(PBackground
MOZ_ASSERT(initedChild == child);
child->SendGamepadListenerAdded();
mChannelChildren.AppendElement(child);
#if defined(XP_WIN) || defined(XP_MACOSX) || defined(XP_LINUX)
// Construct VRManagerChannel and ask adding the connected
// VR controllers to GamepadManager
mVRChannelChild = gfx::VRManagerChild::Get();
+ mVRChannelChild->SetGamepadManager(this);
mVRChannelChild->SendControllerListenerAdded();
#endif
}
//Override nsIIPCBackgroundChildCreateCallback
void
GamepadManager::ActorFailed()
{
--- a/gfx/vr/ipc/VRManagerChild.cpp
+++ b/gfx/vr/ipc/VRManagerChild.cpp
@@ -481,24 +481,21 @@ VRManagerChild::RecvNotifyVRVSync(const
}
return true;
}
bool
VRManagerChild::RecvGamepadUpdate(const GamepadChangeEvent& aGamepadEvent)
{
- // VRManagerChild could be at other processes,
- // but GamepadManager is only allowed to be run at Content process.
- if (XRE_IsContentProcess()) {
- RefPtr<dom::GamepadManager> serivce(dom::GamepadManager::GetService());
-
- if (serivce) {
- serivce->Update(aGamepadEvent);
- }
+ // VRManagerChild could be at other processes, but GamepadManager
+ // only exists at the content process or the parent process
+ // in non-e10s mode.
+ if (mGamepadManager) {
+ mGamepadManager->Update(aGamepadEvent);
}
return true;
}
void
VRManagerChild::RunFrameRequestCallbacks()
{
@@ -587,10 +584,18 @@ VRManagerChild::RemoveListener(dom::VREv
}
void
VRManagerChild::FatalError(const char* const aName, const char* const aMsg) const
{
dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid());
}
+void
+VRManagerChild::SetGamepadManager(dom::GamepadManager* aGamepadManager)
+{
+ MOZ_ASSERT(aGamepadManager);
+
+ mGamepadManager = aGamepadManager;
+}
+
} // namespace gfx
} // namespace mozilla
--- a/gfx/vr/ipc/VRManagerChild.h
+++ b/gfx/vr/ipc/VRManagerChild.h
@@ -12,16 +12,17 @@
#include "mozilla/ipc/SharedMemory.h" // for SharedMemory, etc
#include "ThreadSafeRefcountingWithMainThreadDestruction.h"
#include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator
#include "mozilla/layers/LayersTypes.h" // for LayersBackend
#include "mozilla/layers/TextureForwarder.h"
namespace mozilla {
namespace dom {
+class GamepadManager;
class Navigator;
class VRDisplay;
class VREventObserver;
} // namespace dom
namespace layers {
class PCompositableChild;
class TextureClient;
}
@@ -72,16 +73,19 @@ public:
virtual MessageLoop* GetMessageLoop() const override { return mMessageLoop; }
virtual base::ProcessId GetParentPid() const override { return OtherPid(); }
nsresult ScheduleFrameRequestCallback(mozilla::dom::FrameRequestCallback& aCallback,
int32_t *aHandle);
void CancelFrameRequestCallback(int32_t aHandle);
void RunFrameRequestCallbacks();
+ // GamepadManager has to be set by the content side to make sure we are using
+ // the same singleton GamepadManager from the same process.
+ void SetGamepadManager(dom::GamepadManager* aGamepadManager);
void UpdateDisplayInfo(nsTArray<VRDisplayInfo>& aDisplayUpdates);
void FireDOMVRDisplayConnectEvent();
void FireDOMVRDisplayDisconnectEvent();
void FireDOMVRDisplayPresentChangeEvent();
virtual void FatalError(const char* const aName, const char* const aMsg) const override;
@@ -146,16 +150,17 @@ private:
* Notify id of Texture When host side end its use. Transaction id is used to
* make sure if there is no newer usage.
*/
void NotifyNotUsed(uint64_t aTextureId, uint64_t aFwdTransactionId);
nsTArray<RefPtr<VRDisplayClient> > mDisplays;
bool mDisplaysInitialized;
nsTArray<dom::Navigator*> mNavigatorCallbacks;
+ dom::GamepadManager* mGamepadManager;
int32_t mInputFrameID;
MessageLoop* mMessageLoop;
struct FrameRequest;
nsTArray<FrameRequest> mFrameRequestCallbacks;