2017-10-27 23:10:06 +00:00
|
|
|
/* -*- 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
|
2017-10-27 22:55:37 +00:00
|
|
|
* 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/. */
|
2016-02-24 23:54:50 +00:00
|
|
|
|
|
|
|
#include "VRDisplayHost.h"
|
2017-10-06 09:56:53 +00:00
|
|
|
#include "gfxPrefs.h"
|
2016-02-24 23:54:50 +00:00
|
|
|
#include "gfxVR.h"
|
2017-05-08 23:01:36 +00:00
|
|
|
#include "ipc/VRLayerParent.h"
|
2017-07-04 20:50:40 +00:00
|
|
|
#include "mozilla/layers/TextureHost.h"
|
|
|
|
#include "mozilla/dom/GamepadBinding.h" // For GamepadMappingType
|
2017-10-05 10:16:16 +00:00
|
|
|
#include "VRThread.h"
|
2016-02-24 23:54:50 +00:00
|
|
|
|
|
|
|
#if defined(XP_WIN)
|
|
|
|
|
|
|
|
#include <d3d11.h>
|
|
|
|
#include "gfxWindowsPlatform.h"
|
|
|
|
#include "../layers/d3d11/CompositorD3D11.h"
|
2017-09-18 23:19:49 +00:00
|
|
|
#include "mozilla/gfx/DeviceManagerDx.h"
|
2016-02-24 23:54:50 +00:00
|
|
|
#include "mozilla/layers/TextureD3D11.h"
|
|
|
|
|
2017-07-04 20:50:40 +00:00
|
|
|
#elif defined(XP_MACOSX)
|
|
|
|
|
|
|
|
#include "mozilla/gfx/MacIOSurface.h"
|
|
|
|
|
2016-02-24 23:54:50 +00:00
|
|
|
#endif
|
|
|
|
|
2018-06-04 22:45:04 +00:00
|
|
|
#if defined(MOZ_WIDGET_ANDROID)
|
2017-12-19 01:40:47 +00:00
|
|
|
#include "mozilla/layers/CompositorThread.h"
|
2018-06-04 22:45:04 +00:00
|
|
|
#endif // defined(MOZ_WIDGET_ANDROID)
|
2017-12-19 01:40:47 +00:00
|
|
|
|
|
|
|
|
2016-02-24 23:54:50 +00:00
|
|
|
using namespace mozilla;
|
|
|
|
using namespace mozilla::gfx;
|
|
|
|
using namespace mozilla::layers;
|
|
|
|
|
2017-09-18 23:19:49 +00:00
|
|
|
VRDisplayHost::AutoRestoreRenderState::AutoRestoreRenderState(VRDisplayHost* aDisplay)
|
|
|
|
: mDisplay(aDisplay)
|
|
|
|
, mSuccess(true)
|
|
|
|
{
|
|
|
|
#if defined(XP_WIN)
|
|
|
|
ID3D11DeviceContext1* context = mDisplay->GetD3DDeviceContext();
|
|
|
|
ID3DDeviceContextState* state = mDisplay->GetD3DDeviceContextState();
|
|
|
|
if (!context || !state) {
|
|
|
|
mSuccess = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
context->SwapDeviceContextState(state, getter_AddRefs(mPrevDeviceContextState));
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
VRDisplayHost::AutoRestoreRenderState::~AutoRestoreRenderState()
|
|
|
|
{
|
|
|
|
#if defined(XP_WIN)
|
|
|
|
ID3D11DeviceContext1* context = mDisplay->GetD3DDeviceContext();
|
|
|
|
if (context && mSuccess) {
|
|
|
|
context->SwapDeviceContextState(mPrevDeviceContextState, nullptr);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
VRDisplayHost::AutoRestoreRenderState::IsSuccess()
|
|
|
|
{
|
|
|
|
return mSuccess;
|
|
|
|
}
|
|
|
|
|
2016-10-04 08:22:42 +00:00
|
|
|
VRDisplayHost::VRDisplayHost(VRDeviceType aType)
|
2017-10-30 12:51:32 +00:00
|
|
|
: mDisplayInfo{}
|
|
|
|
, mLastUpdateDisplayInfo{}
|
|
|
|
, mFrameStarted(false)
|
2016-02-24 23:54:50 +00:00
|
|
|
{
|
|
|
|
MOZ_COUNT_CTOR(VRDisplayHost);
|
|
|
|
mDisplayInfo.mType = aType;
|
2017-01-24 09:49:11 +00:00
|
|
|
mDisplayInfo.mDisplayID = VRSystemManager::AllocateDisplayID();
|
2017-05-08 23:01:36 +00:00
|
|
|
mDisplayInfo.mPresentingGroups = 0;
|
|
|
|
mDisplayInfo.mGroupMask = kVRGroupContent;
|
|
|
|
mDisplayInfo.mFrameId = 0;
|
2018-06-04 22:45:04 +00:00
|
|
|
mDisplayInfo.mDisplayState.mPresentingGeneration = 0;
|
2018-03-14 00:09:54 +00:00
|
|
|
mDisplayInfo.mDisplayState.mDisplayName[0] = '\0';
|
2016-02-24 23:54:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VRDisplayHost::~VRDisplayHost()
|
|
|
|
{
|
2017-11-17 08:06:59 +00:00
|
|
|
if (mSubmitThread) {
|
|
|
|
mSubmitThread->Shutdown();
|
|
|
|
mSubmitThread = nullptr;
|
|
|
|
}
|
2016-02-24 23:54:50 +00:00
|
|
|
MOZ_COUNT_DTOR(VRDisplayHost);
|
|
|
|
}
|
|
|
|
|
2017-09-18 23:19:49 +00:00
|
|
|
#if defined(XP_WIN)
|
|
|
|
bool
|
|
|
|
VRDisplayHost::CreateD3DObjects()
|
|
|
|
{
|
|
|
|
if (!mDevice) {
|
2017-08-28 22:56:43 +00:00
|
|
|
RefPtr<ID3D11Device> device = gfx::DeviceManagerDx::Get()->GetVRDevice();
|
2017-09-18 23:19:49 +00:00
|
|
|
if (!device) {
|
|
|
|
NS_WARNING("VRDisplayHost::CreateD3DObjects failed to get a D3D11Device");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (FAILED(device->QueryInterface(__uuidof(ID3D11Device1), getter_AddRefs(mDevice)))) {
|
|
|
|
NS_WARNING("VRDisplayHost::CreateD3DObjects failed to get a D3D11Device1");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!mContext) {
|
|
|
|
mDevice->GetImmediateContext1(getter_AddRefs(mContext));
|
|
|
|
if (!mContext) {
|
|
|
|
NS_WARNING("VRDisplayHost::CreateD3DObjects failed to get an immediate context");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!mDeviceContextState) {
|
|
|
|
D3D_FEATURE_LEVEL featureLevels[] {
|
|
|
|
D3D_FEATURE_LEVEL_11_1,
|
|
|
|
D3D_FEATURE_LEVEL_11_0
|
|
|
|
};
|
|
|
|
mDevice->CreateDeviceContextState(0,
|
|
|
|
featureLevels,
|
|
|
|
2,
|
|
|
|
D3D11_SDK_VERSION,
|
|
|
|
__uuidof(ID3D11Device1),
|
|
|
|
nullptr,
|
|
|
|
getter_AddRefs(mDeviceContextState));
|
|
|
|
}
|
|
|
|
if (!mDeviceContextState) {
|
|
|
|
NS_WARNING("VRDisplayHost::CreateD3DObjects failed to get a D3D11DeviceContextState");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
ID3D11Device1*
|
|
|
|
VRDisplayHost::GetD3DDevice()
|
|
|
|
{
|
|
|
|
return mDevice;
|
|
|
|
}
|
|
|
|
|
|
|
|
ID3D11DeviceContext1*
|
|
|
|
VRDisplayHost::GetD3DDeviceContext()
|
|
|
|
{
|
|
|
|
return mContext;
|
|
|
|
}
|
|
|
|
|
|
|
|
ID3DDeviceContextState*
|
|
|
|
VRDisplayHost::GetD3DDeviceContextState()
|
|
|
|
{
|
|
|
|
return mDeviceContextState;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif // defined(XP_WIN)
|
|
|
|
|
2017-05-08 23:01:36 +00:00
|
|
|
void
|
|
|
|
VRDisplayHost::SetGroupMask(uint32_t aGroupMask)
|
|
|
|
{
|
|
|
|
mDisplayInfo.mGroupMask = aGroupMask;
|
|
|
|
}
|
|
|
|
|
2017-06-22 06:32:18 +00:00
|
|
|
bool
|
|
|
|
VRDisplayHost::GetIsConnected()
|
|
|
|
{
|
2018-03-14 00:09:54 +00:00
|
|
|
return mDisplayInfo.mDisplayState.mIsConnected;
|
2017-06-22 06:32:18 +00:00
|
|
|
}
|
|
|
|
|
2016-02-24 23:54:50 +00:00
|
|
|
void
|
|
|
|
VRDisplayHost::AddLayer(VRLayerParent *aLayer)
|
|
|
|
{
|
|
|
|
mLayers.AppendElement(aLayer);
|
2017-05-08 23:01:36 +00:00
|
|
|
mDisplayInfo.mPresentingGroups |= aLayer->GetGroup();
|
2016-02-24 23:54:50 +00:00
|
|
|
if (mLayers.Length() == 1) {
|
|
|
|
StartPresentation();
|
|
|
|
}
|
2016-09-02 21:45:54 +00:00
|
|
|
|
|
|
|
// Ensure that the content process receives the change immediately
|
|
|
|
VRManager* vm = VRManager::Get();
|
|
|
|
vm->RefreshVRDisplays();
|
2016-02-24 23:54:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
VRDisplayHost::RemoveLayer(VRLayerParent *aLayer)
|
|
|
|
{
|
|
|
|
mLayers.RemoveElement(aLayer);
|
|
|
|
if (mLayers.Length() == 0) {
|
|
|
|
StopPresentation();
|
|
|
|
}
|
2017-05-08 23:01:36 +00:00
|
|
|
mDisplayInfo.mPresentingGroups = 0;
|
|
|
|
for (auto layer : mLayers) {
|
|
|
|
mDisplayInfo.mPresentingGroups |= layer->GetGroup();
|
|
|
|
}
|
2016-09-02 21:45:54 +00:00
|
|
|
|
|
|
|
// Ensure that the content process receives the change immediately
|
|
|
|
VRManager* vm = VRManager::Get();
|
|
|
|
vm->RefreshVRDisplays();
|
2016-02-24 23:54:50 +00:00
|
|
|
}
|
|
|
|
|
2017-05-08 23:01:36 +00:00
|
|
|
void
|
|
|
|
VRDisplayHost::StartFrame()
|
|
|
|
{
|
2017-10-03 22:11:18 +00:00
|
|
|
AUTO_PROFILER_TRACING("VR", "GetSensorState");
|
2017-09-06 08:08:21 +00:00
|
|
|
|
2017-05-08 23:01:36 +00:00
|
|
|
mLastFrameStart = TimeStamp::Now();
|
|
|
|
++mDisplayInfo.mFrameId;
|
|
|
|
mDisplayInfo.mLastSensorState[mDisplayInfo.mFrameId % kVRMaxLatencyFrames] = GetSensorState();
|
2017-07-14 23:08:49 +00:00
|
|
|
mFrameStarted = true;
|
2017-05-08 23:01:36 +00:00
|
|
|
}
|
2016-02-24 23:54:50 +00:00
|
|
|
|
|
|
|
void
|
2017-05-08 23:01:36 +00:00
|
|
|
VRDisplayHost::NotifyVSync()
|
2016-02-24 23:54:50 +00:00
|
|
|
{
|
2017-05-08 23:01:36 +00:00
|
|
|
/**
|
|
|
|
* We will trigger a new frame immediately after a successful frame texture
|
|
|
|
* submission. If content fails to call VRDisplay.submitFrame after
|
2017-10-06 09:56:53 +00:00
|
|
|
* dom.vr.display.rafMaxDuration milliseconds has elapsed since the last
|
2017-05-08 23:01:36 +00:00
|
|
|
* VRDisplay.requestAnimationFrame, we act as a "watchdog" and kick-off
|
|
|
|
* a new VRDisplay.requestAnimationFrame to avoid a render loop stall and
|
|
|
|
* to give content a chance to recover.
|
|
|
|
*
|
|
|
|
* If the lower level VR platform API's are rejecting submitted frames,
|
|
|
|
* such as when the Oculus "Health and Safety Warning" is displayed,
|
|
|
|
* we will not kick off the next frame immediately after VRDisplay.submitFrame
|
|
|
|
* as it would result in an unthrottled render loop that would free run at
|
|
|
|
* potentially extreme frame rates. To ensure that content has a chance to
|
|
|
|
* resume its presentation when the frames are accepted once again, we rely
|
|
|
|
* on this "watchdog" to act as a VR refresh driver cycling at a rate defined
|
2017-10-06 09:56:53 +00:00
|
|
|
* by dom.vr.display.rafMaxDuration.
|
2017-05-08 23:01:36 +00:00
|
|
|
*
|
|
|
|
* This number must be larger than the slowest expected frame time during
|
|
|
|
* normal VR presentation, but small enough not to break content that
|
|
|
|
* makes assumptions of reasonably minimal VSync rate.
|
|
|
|
*
|
|
|
|
* The slowest expected refresh rate for a VR display currently is an
|
|
|
|
* Oculus CV1 when ASW (Asynchronous Space Warp) is enabled, at 45hz.
|
2017-10-06 09:56:53 +00:00
|
|
|
* A dom.vr.display.rafMaxDuration value of 50 milliseconds results in a 20hz
|
2017-05-08 23:01:36 +00:00
|
|
|
* rate, which avoids inadvertent triggering of the watchdog during
|
|
|
|
* Oculus ASW even if every second frame is dropped.
|
|
|
|
*/
|
|
|
|
bool bShouldStartFrame = false;
|
|
|
|
|
|
|
|
if (mDisplayInfo.mPresentingGroups == 0) {
|
|
|
|
// If this display isn't presenting, refresh the sensors and trigger
|
|
|
|
// VRDisplay.requestAnimationFrame at the normal 2d display refresh rate.
|
|
|
|
bShouldStartFrame = true;
|
|
|
|
} else {
|
|
|
|
// If content fails to call VRDisplay.submitFrame, we must eventually
|
|
|
|
// time-out and trigger a new frame.
|
|
|
|
if (mLastFrameStart.IsNull()) {
|
|
|
|
bShouldStartFrame = true;
|
|
|
|
} else {
|
|
|
|
TimeDuration duration = TimeStamp::Now() - mLastFrameStart;
|
2017-10-06 09:56:53 +00:00
|
|
|
if (duration.ToMilliseconds() > gfxPrefs::VRDisplayRafMaxDuration()) {
|
2017-05-08 23:01:36 +00:00
|
|
|
bShouldStartFrame = true;
|
|
|
|
}
|
|
|
|
}
|
2016-02-24 23:54:50 +00:00
|
|
|
}
|
2017-05-08 23:01:36 +00:00
|
|
|
|
|
|
|
if (bShouldStartFrame) {
|
|
|
|
VRManager *vm = VRManager::Get();
|
|
|
|
MOZ_ASSERT(vm);
|
|
|
|
vm->NotifyVRVsync(mDisplayInfo.mDisplayID);
|
2016-02-24 23:54:50 +00:00
|
|
|
}
|
2017-05-08 23:01:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2017-11-17 08:06:59 +00:00
|
|
|
VRDisplayHost::SubmitFrameInternal(const layers::SurfaceDescriptor &aTexture,
|
|
|
|
uint64_t aFrameId,
|
|
|
|
const gfx::Rect& aLeftEyeRect,
|
|
|
|
const gfx::Rect& aRightEyeRect)
|
2017-05-08 23:01:36 +00:00
|
|
|
{
|
2018-06-04 22:45:04 +00:00
|
|
|
#if !defined(MOZ_WIDGET_ANDROID)
|
2017-11-17 08:06:59 +00:00
|
|
|
MOZ_ASSERT(mSubmitThread->GetThread() == NS_GetCurrentThread());
|
2018-06-04 22:45:04 +00:00
|
|
|
#endif // !defined(MOZ_WIDGET_ANDROID)
|
2017-10-03 22:11:18 +00:00
|
|
|
AUTO_PROFILER_TRACING("VR", "SubmitFrameAtVRDisplayHost");
|
2017-09-06 08:08:21 +00:00
|
|
|
|
2018-05-08 18:31:28 +00:00
|
|
|
if (!SubmitFrame(aTexture, aFrameId, aLeftEyeRect, aRightEyeRect)) {
|
|
|
|
return;
|
2017-07-22 00:30:34 +00:00
|
|
|
}
|
2017-07-04 20:50:40 +00:00
|
|
|
|
2018-06-04 22:45:04 +00:00
|
|
|
#if defined(XP_WIN) || defined(XP_MACOSX) || defined(MOZ_WIDGET_ANDROID)
|
2017-11-01 00:25:40 +00:00
|
|
|
|
2017-05-08 23:01:36 +00:00
|
|
|
/**
|
|
|
|
* Trigger the next VSync immediately after we are successfully
|
|
|
|
* submitting frames. As SubmitFrame is responsible for throttling
|
|
|
|
* the render loop, if we don't successfully call it, we shouldn't trigger
|
|
|
|
* NotifyVRVsync immediately, as it will run unbounded.
|
|
|
|
* If NotifyVRVsync is not called here due to SubmitFrame failing, the
|
|
|
|
* fallback "watchdog" code in VRDisplayHost::NotifyVSync() will cause
|
|
|
|
* frames to continue at a lower refresh rate until frame submission
|
|
|
|
* succeeds again.
|
|
|
|
*/
|
2017-10-05 10:16:16 +00:00
|
|
|
VRManager* vm = VRManager::Get();
|
|
|
|
MessageLoop* loop = VRListenerThreadHolder::Loop();
|
|
|
|
|
|
|
|
loop->PostTask(NewRunnableMethod<const uint32_t>(
|
2017-10-16 05:30:46 +00:00
|
|
|
"gfx::VRManager::NotifyVRVsync",
|
2017-10-05 10:16:16 +00:00
|
|
|
vm, &VRManager::NotifyVRVsync, mDisplayInfo.mDisplayID
|
|
|
|
));
|
2016-02-24 23:54:50 +00:00
|
|
|
#endif
|
2017-07-04 20:50:40 +00:00
|
|
|
}
|
2016-02-24 23:54:50 +00:00
|
|
|
|
2017-11-17 08:06:59 +00:00
|
|
|
void
|
|
|
|
VRDisplayHost::SubmitFrame(VRLayerParent* aLayer,
|
|
|
|
const layers::SurfaceDescriptor &aTexture,
|
|
|
|
uint64_t aFrameId,
|
|
|
|
const gfx::Rect& aLeftEyeRect,
|
|
|
|
const gfx::Rect& aRightEyeRect)
|
|
|
|
{
|
|
|
|
if ((mDisplayInfo.mGroupMask & aLayer->GetGroup()) == 0) {
|
|
|
|
// Suppress layers hidden by the group mask
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure that we only accept the first SubmitFrame call per RAF cycle.
|
|
|
|
if (!mFrameStarted || aFrameId != mDisplayInfo.mFrameId) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-05-08 18:31:28 +00:00
|
|
|
mFrameStarted = false;
|
|
|
|
|
2017-12-19 01:40:47 +00:00
|
|
|
RefPtr<Runnable> submit =
|
2017-11-17 08:06:59 +00:00
|
|
|
NewRunnableMethod<StoreCopyPassByConstLRef<layers::SurfaceDescriptor>, uint64_t,
|
|
|
|
StoreCopyPassByConstLRef<gfx::Rect>, StoreCopyPassByConstLRef<gfx::Rect>>(
|
|
|
|
"gfx::VRDisplayHost::SubmitFrameInternal", this, &VRDisplayHost::SubmitFrameInternal,
|
2017-12-19 01:40:47 +00:00
|
|
|
aTexture, aFrameId, aLeftEyeRect, aRightEyeRect);
|
2018-05-08 18:31:28 +00:00
|
|
|
|
2018-06-04 22:45:04 +00:00
|
|
|
#if !defined(MOZ_WIDGET_ANDROID)
|
2018-05-08 18:31:28 +00:00
|
|
|
if (!mSubmitThread) {
|
|
|
|
mSubmitThread = new VRThread(NS_LITERAL_CSTRING("VR_SubmitFrame"));
|
|
|
|
}
|
2017-12-19 01:40:47 +00:00
|
|
|
mSubmitThread->Start();
|
|
|
|
mSubmitThread->PostTask(submit.forget());
|
|
|
|
#else
|
|
|
|
CompositorThreadHolder::Loop()->PostTask(submit.forget());
|
2018-06-04 22:45:04 +00:00
|
|
|
#endif // defined(MOZ_WIDGET_ANDROID)
|
2017-11-17 08:06:59 +00:00
|
|
|
}
|
|
|
|
|
2016-02-24 23:54:50 +00:00
|
|
|
bool
|
|
|
|
VRDisplayHost::CheckClearDisplayInfoDirty()
|
|
|
|
{
|
|
|
|
if (mDisplayInfo == mLastUpdateDisplayInfo) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
mLastUpdateDisplayInfo = mDisplayInfo;
|
|
|
|
return true;
|
|
|
|
}
|
2016-10-07 08:58:01 +00:00
|
|
|
|
2017-07-14 09:01:09 +00:00
|
|
|
VRControllerHost::VRControllerHost(VRDeviceType aType, dom::GamepadHand aHand,
|
|
|
|
uint32_t aDisplayID)
|
2018-03-14 00:09:54 +00:00
|
|
|
: mControllerInfo{}
|
2017-08-01 20:36:26 +00:00
|
|
|
, mVibrateIndex(0)
|
2016-10-07 08:58:01 +00:00
|
|
|
{
|
|
|
|
MOZ_COUNT_CTOR(VRControllerHost);
|
|
|
|
mControllerInfo.mType = aType;
|
2018-07-11 19:20:51 +00:00
|
|
|
mControllerInfo.mControllerState.hand = aHand;
|
2017-07-14 09:01:09 +00:00
|
|
|
mControllerInfo.mMappingType = dom::GamepadMappingType::_empty;
|
|
|
|
mControllerInfo.mDisplayID = aDisplayID;
|
|
|
|
mControllerInfo.mControllerID = VRSystemManager::AllocateControllerID();
|
2016-10-07 08:58:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
VRControllerHost::~VRControllerHost()
|
|
|
|
{
|
|
|
|
MOZ_COUNT_DTOR(VRControllerHost);
|
2016-10-13 06:30:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const VRControllerInfo&
|
|
|
|
VRControllerHost::GetControllerInfo() const
|
|
|
|
{
|
|
|
|
return mControllerInfo;
|
|
|
|
}
|
|
|
|
|
2016-11-08 00:15:01 +00:00
|
|
|
void
|
|
|
|
VRControllerHost::SetButtonPressed(uint64_t aBit)
|
|
|
|
{
|
2018-07-11 19:20:51 +00:00
|
|
|
mControllerInfo.mControllerState.buttonPressed = aBit;
|
2016-11-08 00:15:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t
|
|
|
|
VRControllerHost::GetButtonPressed()
|
|
|
|
{
|
2018-07-11 19:20:51 +00:00
|
|
|
return mControllerInfo.mControllerState.buttonPressed;
|
2016-11-08 00:15:01 +00:00
|
|
|
}
|
2016-10-24 10:09:11 +00:00
|
|
|
|
2017-04-06 11:00:20 +00:00
|
|
|
void
|
|
|
|
VRControllerHost::SetButtonTouched(uint64_t aBit)
|
|
|
|
{
|
2018-07-11 19:20:51 +00:00
|
|
|
mControllerInfo.mControllerState.buttonTouched = aBit;
|
2017-04-06 11:00:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t
|
|
|
|
VRControllerHost::GetButtonTouched()
|
|
|
|
{
|
2018-07-11 19:20:51 +00:00
|
|
|
return mControllerInfo.mControllerState.buttonTouched;
|
2017-04-06 11:00:20 +00:00
|
|
|
}
|
|
|
|
|
2016-10-24 10:09:11 +00:00
|
|
|
void
|
|
|
|
VRControllerHost::SetPose(const dom::GamepadPoseState& aPose)
|
|
|
|
{
|
|
|
|
mPose = aPose;
|
|
|
|
}
|
|
|
|
|
|
|
|
const dom::GamepadPoseState&
|
|
|
|
VRControllerHost::GetPose()
|
|
|
|
{
|
|
|
|
return mPose;
|
|
|
|
}
|
|
|
|
|
2017-02-06 08:07:20 +00:00
|
|
|
dom::GamepadHand
|
|
|
|
VRControllerHost::GetHand()
|
|
|
|
{
|
2018-07-11 19:20:51 +00:00
|
|
|
return mControllerInfo.mControllerState.hand;
|
2017-02-06 08:07:20 +00:00
|
|
|
}
|
|
|
|
|
2017-02-02 06:57:58 +00:00
|
|
|
void
|
|
|
|
VRControllerHost::SetVibrateIndex(uint64_t aIndex)
|
|
|
|
{
|
|
|
|
mVibrateIndex = aIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t
|
|
|
|
VRControllerHost::GetVibrateIndex()
|
|
|
|
{
|
|
|
|
return mVibrateIndex;
|
|
|
|
}
|