mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 06:15:43 +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()
|
||||
: mEnabled(false),
|
||||
mNonstandardEventsEnabled(false),
|
||||
mShuttingDown(false)
|
||||
mShuttingDown(false),
|
||||
mPromiseID(0)
|
||||
{}
|
||||
|
||||
nsresult
|
||||
@ -667,17 +668,29 @@ GamepadManager::Update(const GamepadChangeEvent& aEvent)
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
already_AddRefed<Promise>
|
||||
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) {
|
||||
uint32_t index = aControllerIdx - VR_GAMEPAD_IDX_OFFSET;
|
||||
mVRChannelChild->AddPromise(mPromiseID, promise);
|
||||
mVRChannelChild->SendVibrateHaptic(index, aHapticIndex,
|
||||
aIntensity, aDuration);
|
||||
aIntensity, aDuration,
|
||||
mPromiseID);
|
||||
} else {
|
||||
// TODO: Bug 680289, implement for standard gamepads
|
||||
}
|
||||
|
||||
++mPromiseID;
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
//Override nsIIPCBackgroundChildCreateCallback
|
||||
|
@ -85,8 +85,9 @@ class GamepadManager final : public nsIObserver,
|
||||
void Update(const GamepadChangeEvent& aGamepadEvent);
|
||||
|
||||
// Trigger vibrate haptic event to gamepad channels.
|
||||
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||
double aIntensity, double aDuration);
|
||||
already_AddRefed<Promise> VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||
double aIntensity, double aDuration,
|
||||
nsIGlobalObject* aGlobal, ErrorResult& aRv);
|
||||
|
||||
protected:
|
||||
GamepadManager();
|
||||
@ -153,6 +154,7 @@ class GamepadManager final : public nsIObserver,
|
||||
// Inner windows that are listening for gamepad events.
|
||||
// has been sent to that window.
|
||||
nsTArray<RefPtr<nsGlobalWindow>> mListeners;
|
||||
uint32_t mPromiseID;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
|
@ -425,11 +425,12 @@ VRManager::NotifyGamepadChange(const T& aInfo)
|
||||
|
||||
void
|
||||
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) {
|
||||
mManagers[i]->VibrateHaptic(aControllerIdx, aHapticIndex,
|
||||
aIntensity, aDuration);
|
||||
aIntensity, aDuration, aPromiseID);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ public:
|
||||
void GetVRControllerInfo(nsTArray<VRControllerInfo>& aControllerInfo);
|
||||
void CreateVRTestSystem();
|
||||
void VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||
double aIntensity, double aDuration);
|
||||
double aIntensity, double aDuration, uint32_t aPromiseID);
|
||||
|
||||
protected:
|
||||
VRManager();
|
||||
|
@ -55,7 +55,7 @@ parent:
|
||||
async ControllerListenerAdded();
|
||||
async ControllerListenerRemoved();
|
||||
async VibrateHaptic(uint32_t aControllerIdx, uint32_t aHapticIndex,
|
||||
double aIntensity, double aDuration);
|
||||
double aIntensity, double aDuration, uint32_t aPromiseID);
|
||||
|
||||
async CreateVRTestSystem();
|
||||
async CreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID);
|
||||
@ -82,6 +82,8 @@ child:
|
||||
async NotifyVSync();
|
||||
async NotifyVRVSync(uint32_t aDisplayID);
|
||||
async GamepadUpdate(GamepadChangeEvent aGamepadEvent);
|
||||
async ReplyGamepadVibrateHaptic(uint32_t aPromiseID);
|
||||
|
||||
async ReplyCreateVRServiceTestDisplay(nsCString aID, uint32_t aPromiseID,
|
||||
uint32_t aDeviceID);
|
||||
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());
|
||||
}
|
||||
|
||||
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 mozilla
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
class Promise;
|
||||
class GamepadManager;
|
||||
class Navigator;
|
||||
class VRDisplay;
|
||||
@ -50,6 +51,8 @@ public:
|
||||
int GetInputFrameID();
|
||||
bool GetVRDisplays(nsTArray<RefPtr<VRDisplayClient> >& aDisplays);
|
||||
bool RefreshVRDisplaysWithCallback(uint64_t aWindowId);
|
||||
void AddPromise(const uint32_t& aID, dom::Promise* aPromise);
|
||||
|
||||
void CreateVRServiceTestDisplay(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 RecvNotifyVRVSync(const uint32_t& aDisplayID) 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,
|
||||
const uint32_t& aPromiseID,
|
||||
const uint32_t& aDeviceID) override;
|
||||
@ -186,6 +191,7 @@ private:
|
||||
|
||||
layers::LayersBackend mBackend;
|
||||
RefPtr<layers::SyncObject> mSyncObject;
|
||||
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mGamepadPromiseList; // TODO: check if it can merge into one list?
|
||||
uint32_t mPromiseID;
|
||||
nsRefPtrHashtable<nsUint32HashKey, dom::Promise> mPromiseList;
|
||||
RefPtr<dom::VRMockDisplay> mVRMockDisplay;
|
||||
|
@ -442,11 +442,12 @@ mozilla::ipc::IPCResult
|
||||
VRManagerParent::RecvVibrateHaptic(const uint32_t& aControllerIdx,
|
||||
const uint32_t& aHapticIndex,
|
||||
const double& aIntensity,
|
||||
const double& aDuration)
|
||||
const double& aDuration,
|
||||
const uint32_t& aPromiseID)
|
||||
{
|
||||
VRManager* vm = VRManager::Get();
|
||||
vm->VibrateHaptic(aControllerIdx, aHapticIndex, aIntensity,
|
||||
aDuration);
|
||||
aDuration, aPromiseID);
|
||||
return IPC_OK();
|
||||
}
|
||||
|
||||
|
@ -92,7 +92,8 @@ protected:
|
||||
virtual mozilla::ipc::IPCResult RecvControllerListenerAdded() override;
|
||||
virtual mozilla::ipc::IPCResult RecvControllerListenerRemoved() override;
|
||||
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 RecvCreateVRServiceTestDisplay(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