mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 14:25:52 +00:00
Bug 1299937 - Part 4: Handling vibrate haptic promise in VRManager; r=qdot
MozReview-Commit-ID: 3KZ8MNx3Dnq --HG-- extra : rebase_source : 1b11f7948da7477e31f7448878a6d5874ba69087
This commit is contained in:
parent
3905da3aea
commit
c1d89a986e
@ -60,7 +60,8 @@ NS_IMPL_ISUPPORTS(GamepadManager, nsIObserver)
|
|||||||
GamepadManager::GamepadManager()
|
GamepadManager::GamepadManager()
|
||||||
: mEnabled(false),
|
: mEnabled(false),
|
||||||
mNonstandardEventsEnabled(false),
|
mNonstandardEventsEnabled(false),
|
||||||
mShuttingDown(false)
|
mShuttingDown(false),
|
||||||
|
mPromiseID(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
@ -667,17 +668,29 @@ GamepadManager::Update(const GamepadChangeEvent& aEvent)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
already_AddRefed<Promise>
|
||||||
GamepadManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
GamepadManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||||
double aIntensity, double aDuration)
|
double aIntensity, double aDuration,
|
||||||
|
nsIGlobalObject* aGlobal, ErrorResult& aRv)
|
||||||
{
|
{
|
||||||
|
RefPtr<Promise> promise = Promise::Create(aGlobal, aRv);
|
||||||
|
if (NS_WARN_IF(aRv.Failed())) {
|
||||||
|
aRv.Throw(NS_ERROR_FAILURE);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (aControllerIdx >= VR_GAMEPAD_IDX_OFFSET) {
|
if (aControllerIdx >= VR_GAMEPAD_IDX_OFFSET) {
|
||||||
uint32_t index = aControllerIdx - VR_GAMEPAD_IDX_OFFSET;
|
uint32_t index = aControllerIdx - VR_GAMEPAD_IDX_OFFSET;
|
||||||
|
mVRChannelChild->AddPromise(mPromiseID, promise);
|
||||||
mVRChannelChild->SendVibrateHaptic(index, aHapticIndex,
|
mVRChannelChild->SendVibrateHaptic(index, aHapticIndex,
|
||||||
aIntensity, aDuration);
|
aIntensity, aDuration,
|
||||||
|
mPromiseID);
|
||||||
} else {
|
} else {
|
||||||
// TODO: Bug 680289, implement for standard gamepads
|
// TODO: Bug 680289, implement for standard gamepads
|
||||||
}
|
}
|
||||||
|
|
||||||
|
++mPromiseID;
|
||||||
|
return promise.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Override nsIIPCBackgroundChildCreateCallback
|
//Override nsIIPCBackgroundChildCreateCallback
|
||||||
|
@ -85,8 +85,9 @@ class GamepadManager final : public nsIObserver,
|
|||||||
void Update(const GamepadChangeEvent& aGamepadEvent);
|
void Update(const GamepadChangeEvent& aGamepadEvent);
|
||||||
|
|
||||||
// Trigger vibrate haptic event to gamepad channels.
|
// Trigger vibrate haptic event to gamepad channels.
|
||||||
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
already_AddRefed<Promise> VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||||
double aIntensity, double aDuration);
|
double aIntensity, double aDuration,
|
||||||
|
nsIGlobalObject* aGlobal, ErrorResult& aRv);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
GamepadManager();
|
GamepadManager();
|
||||||
@ -153,6 +154,7 @@ class GamepadManager final : public nsIObserver,
|
|||||||
// Inner windows that are listening for gamepad events.
|
// Inner windows that are listening for gamepad events.
|
||||||
// has been sent to that window.
|
// has been sent to that window.
|
||||||
nsTArray<RefPtr<nsGlobalWindow>> mListeners;
|
nsTArray<RefPtr<nsGlobalWindow>> mListeners;
|
||||||
|
uint32_t mPromiseID;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace dom
|
} // namespace dom
|
||||||
|
@ -425,11 +425,12 @@ VRManager::NotifyGamepadChange(const T& aInfo)
|
|||||||
|
|
||||||
void
|
void
|
||||||
VRManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
VRManager::VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||||
double aIntensity, double aDuration)
|
double aIntensity, double aDuration, uint32_t aPromiseID)
|
||||||
|
|
||||||
{
|
{
|
||||||
for (uint32_t i = 0; i < mManagers.Length(); ++i) {
|
for (uint32_t i = 0; i < mManagers.Length(); ++i) {
|
||||||
mManagers[i]->VibrateHaptic(aControllerIdx, aHapticIndex,
|
mManagers[i]->VibrateHaptic(aControllerIdx, aHapticIndex,
|
||||||
aIntensity, aDuration);
|
aIntensity, aDuration, aPromiseID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ public:
|
|||||||
void GetVRControllerInfo(nsTArray<VRControllerInfo>& aControllerInfo);
|
void GetVRControllerInfo(nsTArray<VRControllerInfo>& aControllerInfo);
|
||||||
void CreateVRTestSystem();
|
void CreateVRTestSystem();
|
||||||
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||||
double aIntensity, double aDuration);
|
double aIntensity, double aDuration, uint32_t aPromiseID);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
VRManager();
|
VRManager();
|
||||||
|
@ -55,7 +55,7 @@ parent:
|
|||||||
async ControllerListenerAdded();
|
async ControllerListenerAdded();
|
||||||
async ControllerListenerRemoved();
|
async ControllerListenerRemoved();
|
||||||
async VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
async VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||||
double aIntensity, double aDuration);
|
double aIntensity, double aDuration, uint32_t aPromiseID);
|
||||||
|
|
||||||
async CreateVRTestSystem();
|
async CreateVRTestSystem();
|
||||||
async CreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID);
|
async CreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID);
|
||||||
@ -82,6 +82,8 @@ child:
|
|||||||
async NotifyVSync();
|
async NotifyVSync();
|
||||||
async NotifyVRVSync(uint32_t aDisplayID);
|
async NotifyVRVSync(uint32_t aDisplayID);
|
||||||
async GamepadUpdate(GamepadChangeEvent aGamepadEvent);
|
async GamepadUpdate(GamepadChangeEvent aGamepadEvent);
|
||||||
|
async ReplyGamepadVibrateHaptic(uint32_t aPromiseID);
|
||||||
|
|
||||||
async ReplyCreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID,
|
async ReplyCreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID,
|
||||||
uint32_t aDeviceID);
|
uint32_t aDeviceID);
|
||||||
async ReplyCreateVRServiceTestController(nsCString aID, uint32_t aPromiseID,
|
async ReplyCreateVRServiceTestController(nsCString aID, uint32_t aPromiseID,
|
||||||
|
@ -677,5 +677,25 @@ VRManagerChild::HandleFatalError(const char* aName, const char* aMsg) const
|
|||||||
dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid());
|
dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
VRManagerChild::AddPromise(const uint32_t& aID, dom::Promise* aPromise)
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(!mGamepadPromiseList.Get(aID, nullptr));
|
||||||
|
mGamepadPromiseList.Put(aID, aPromise);
|
||||||
|
}
|
||||||
|
|
||||||
|
mozilla::ipc::IPCResult
|
||||||
|
VRManagerChild::RecvReplyGamepadVibrateHaptic(const uint32_t& aPromiseID)
|
||||||
|
{
|
||||||
|
RefPtr<dom::Promise> p;
|
||||||
|
if (!mGamepadPromiseList.Get(aPromiseID, getter_AddRefs(p))) {
|
||||||
|
MOZ_CRASH("We should always have a promise.");
|
||||||
|
}
|
||||||
|
|
||||||
|
p->MaybeResolve(true);
|
||||||
|
mGamepadPromiseList.Remove(aPromiseID);
|
||||||
|
return IPC_OK();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace gfx
|
} // namespace gfx
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
namespace dom {
|
namespace dom {
|
||||||
|
class Promise;
|
||||||
class GamepadManager;
|
class GamepadManager;
|
||||||
class Navigator;
|
class Navigator;
|
||||||
class VRDisplay;
|
class VRDisplay;
|
||||||
@ -50,6 +51,8 @@ public:
|
|||||||
int GetInputFrameID();
|
int GetInputFrameID();
|
||||||
bool GetVRDisplays(nsTArray<RefPtr<VRDisplayClient> >& aDisplays);
|
bool GetVRDisplays(nsTArray<RefPtr<VRDisplayClient> >& aDisplays);
|
||||||
bool RefreshVRDisplaysWithCallback(uint64_t aWindowId);
|
bool RefreshVRDisplaysWithCallback(uint64_t aWindowId);
|
||||||
|
void AddPromise(const uint32_t& aID, dom::Promise* aPromise);
|
||||||
|
|
||||||
void CreateVRServiceTestDisplay(const nsCString& aID, dom::Promise* aPromise);
|
void CreateVRServiceTestDisplay(const nsCString& aID, dom::Promise* aPromise);
|
||||||
void CreateVRServiceTestController(const nsCString& aID, dom::Promise* aPromise);
|
void CreateVRServiceTestController(const nsCString& aID, dom::Promise* aPromise);
|
||||||
|
|
||||||
@ -120,6 +123,8 @@ protected:
|
|||||||
virtual mozilla::ipc::IPCResult RecvNotifyVSync() override;
|
virtual mozilla::ipc::IPCResult RecvNotifyVSync() override;
|
||||||
virtual mozilla::ipc::IPCResult RecvNotifyVRVSync(const uint32_t& aDisplayID) override;
|
virtual mozilla::ipc::IPCResult RecvNotifyVRVSync(const uint32_t& aDisplayID) override;
|
||||||
virtual mozilla::ipc::IPCResult RecvGamepadUpdate(const GamepadChangeEvent& aGamepadEvent) override;
|
virtual mozilla::ipc::IPCResult RecvGamepadUpdate(const GamepadChangeEvent& aGamepadEvent) override;
|
||||||
|
virtual mozilla::ipc::IPCResult RecvReplyGamepadVibrateHaptic(const uint32_t& aPromiseID) override;
|
||||||
|
|
||||||
virtual mozilla::ipc::IPCResult RecvReplyCreateVRServiceTestDisplay(const nsCString& aID,
|
virtual mozilla::ipc::IPCResult RecvReplyCreateVRServiceTestDisplay(const nsCString& aID,
|
||||||
const uint32_t& aPromiseID,
|
const uint32_t& aPromiseID,
|
||||||
const uint32_t& aDeviceID) override;
|
const uint32_t& aDeviceID) override;
|
||||||
@ -186,6 +191,7 @@ private:
|
|||||||
|
|
||||||
layers::LayersBackend mBackend;
|
layers::LayersBackend mBackend;
|
||||||
RefPtr<layers::SyncObject> mSyncObject;
|
RefPtr<layers::SyncObject> mSyncObject;
|
||||||
|
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mGamepadPromiseList; // TODO: check if it can merge into one list?
|
||||||
uint32_t mPromiseID;
|
uint32_t mPromiseID;
|
||||||
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mPromiseList;
|
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mPromiseList;
|
||||||
RefPtr<dom::VRMockDisplay> mVRMockDisplay;
|
RefPtr<dom::VRMockDisplay> mVRMockDisplay;
|
||||||
|
@ -442,11 +442,12 @@ mozilla::ipc::IPCResult
|
|||||||
VRManagerParent::RecvVibrateHaptic(const uint32_t& aControllerIdx,
|
VRManagerParent::RecvVibrateHaptic(const uint32_t& aControllerIdx,
|
||||||
const uint32_t& aHapticIndex,
|
const uint32_t& aHapticIndex,
|
||||||
const double& aIntensity,
|
const double& aIntensity,
|
||||||
const double& aDuration)
|
const double& aDuration,
|
||||||
|
const uint32_t& aPromiseID)
|
||||||
{
|
{
|
||||||
VRManager* vm = VRManager::Get();
|
VRManager* vm = VRManager::Get();
|
||||||
vm->VibrateHaptic(aControllerIdx, aHapticIndex, aIntensity,
|
vm->VibrateHaptic(aControllerIdx, aHapticIndex, aIntensity,
|
||||||
aDuration);
|
aDuration, aPromiseID);
|
||||||
return IPC_OK();
|
return IPC_OK();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,8 @@ protected:
|
|||||||
virtual mozilla::ipc::IPCResult RecvControllerListenerAdded() override;
|
virtual mozilla::ipc::IPCResult RecvControllerListenerAdded() override;
|
||||||
virtual mozilla::ipc::IPCResult RecvControllerListenerRemoved() override;
|
virtual mozilla::ipc::IPCResult RecvControllerListenerRemoved() override;
|
||||||
virtual mozilla::ipc::IPCResult RecvVibrateHaptic(const uint32_t& aControllerIdx, const uint32_t& aHapticIndex,
|
virtual mozilla::ipc::IPCResult RecvVibrateHaptic(const uint32_t& aControllerIdx, const uint32_t& aHapticIndex,
|
||||||
const double& aIntensity, const double& aDuration) override;
|
const double& aIntensity, const double& aDuration, const uint32_t& aPromiseID) override;
|
||||||
|
|
||||||
virtual mozilla::ipc::IPCResult RecvCreateVRTestSystem() override;
|
virtual mozilla::ipc::IPCResult RecvCreateVRTestSystem() override;
|
||||||
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestDisplay(const nsCString& aID, const uint32_t& aPromiseID) override;
|
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestDisplay(const nsCString& aID, const uint32_t& aPromiseID) override;
|
||||||
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestController(const nsCString& aID, const uint32_t& aPromiseID) override;
|
virtual mozilla::ipc::IPCResult RecvCreateVRServiceTestController(const nsCString& aID, const uint32_t& aPromiseID) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user