| Index: device/vr/android/gvr/gvr_device.cc
|
| diff --git a/device/vr/android/gvr/gvr_device.cc b/device/vr/android/gvr/gvr_device.cc
|
| index a8efa67a88130747971749e249c5c46decba54df..5abea2b03ee59a772dec257db55ae7284eb3707e 100644
|
| --- a/device/vr/android/gvr/gvr_device.cc
|
| +++ b/device/vr/android/gvr/gvr_device.cc
|
| @@ -19,138 +19,25 @@
|
|
|
| namespace device {
|
|
|
| -GvrDevice::GvrDevice(GvrDeviceProvider* provider, GvrDelegate* delegate)
|
| - : VRDevice(), delegate_(delegate), gvr_provider_(provider) {}
|
| +GvrDevice::GvrDevice(GvrDeviceProvider* provider)
|
| + : VRDevice(), gvr_provider_(provider) {}
|
|
|
| GvrDevice::~GvrDevice() {}
|
|
|
| -mojom::VRDisplayInfoPtr GvrDevice::GetVRDevice() {
|
| - TRACE_EVENT0("input", "GvrDevice::GetVRDevice");
|
| -
|
| - mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New();
|
| -
|
| - device->index = id();
|
| -
|
| - device->capabilities = mojom::VRDisplayCapabilities::New();
|
| - device->capabilities->hasOrientation = true;
|
| - device->capabilities->hasPosition = false;
|
| - device->capabilities->hasExternalDisplay = false;
|
| - device->capabilities->canPresent = true;
|
| -
|
| - device->leftEye = mojom::VREyeParameters::New();
|
| - device->rightEye = mojom::VREyeParameters::New();
|
| - mojom::VREyeParametersPtr& left_eye = device->leftEye;
|
| - mojom::VREyeParametersPtr& right_eye = device->rightEye;
|
| -
|
| - left_eye->fieldOfView = mojom::VRFieldOfView::New();
|
| - right_eye->fieldOfView = mojom::VRFieldOfView::New();
|
| -
|
| - left_eye->offset.resize(3);
|
| - right_eye->offset.resize(3);
|
| -
|
| - // Set the render target size to "invalid" to indicate that
|
| - // we can't render into it yet. Other code uses this to check
|
| - // for valid state.
|
| - gvr::Sizei render_target_size = kInvalidRenderTargetSize;
|
| - left_eye->renderWidth = render_target_size.width / 2;
|
| - left_eye->renderHeight = render_target_size.height;
|
| -
|
| - right_eye->renderWidth = left_eye->renderWidth;
|
| - right_eye->renderHeight = left_eye->renderHeight;
|
| -
|
| - gvr::GvrApi* gvr_api = GetGvrApi();
|
| - if (!gvr_api) {
|
| - // We may not be able to get an instance of GvrApi right away, so
|
| - // stub in some data till we have one.
|
| - device->displayName = "Unknown";
|
| -
|
| - left_eye->fieldOfView->upDegrees = 45;
|
| - left_eye->fieldOfView->downDegrees = 45;
|
| - left_eye->fieldOfView->leftDegrees = 45;
|
| - left_eye->fieldOfView->rightDegrees = 45;
|
| -
|
| - right_eye->fieldOfView->upDegrees = 45;
|
| - right_eye->fieldOfView->downDegrees = 45;
|
| - right_eye->fieldOfView->leftDegrees = 45;
|
| - right_eye->fieldOfView->rightDegrees = 45;
|
| -
|
| - left_eye->offset[0] = -0.0;
|
| - left_eye->offset[1] = -0.0;
|
| - left_eye->offset[2] = -0.03;
|
| -
|
| - right_eye->offset[0] = 0.0;
|
| - right_eye->offset[1] = 0.0;
|
| - right_eye->offset[2] = 0.03;
|
| -
|
| - // Tell the delegate not to draw yet, to avoid a race condition
|
| - // (and visible wobble) on entering VR.
|
| - if (delegate_) {
|
| - delegate_->SetWebVRRenderSurfaceSize(kInvalidRenderTargetSize.width,
|
| - kInvalidRenderTargetSize.height);
|
| - }
|
| -
|
| - return device;
|
| +void GvrDevice::GetVRDevice(
|
| + const base::Callback<void(mojom::VRDisplayInfoPtr)>& callback) {
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (delegate) {
|
| + delegate->CreateVRDisplayInfo(callback, id());
|
| + } else {
|
| + callback.Run(nullptr);
|
| }
|
| -
|
| - // In compositor mode, we have to use the current compositor window's
|
| - // surface size. Would be nice to change it, but that needs more browser
|
| - // internals to be modified. TODO(klausw,crbug.com/655722): remove this once
|
| - // we can pick our own surface size.
|
| - gvr::Sizei compositor_size = delegate_->GetWebVRCompositorSurfaceSize();
|
| - left_eye->renderWidth = compositor_size.width / 2;
|
| - left_eye->renderHeight = compositor_size.height;
|
| - right_eye->renderWidth = left_eye->renderWidth;
|
| - right_eye->renderHeight = left_eye->renderHeight;
|
| -
|
| - std::string vendor = gvr_api->GetViewerVendor();
|
| - std::string model = gvr_api->GetViewerModel();
|
| - device->displayName = vendor + " " + model;
|
| -
|
| - gvr::BufferViewportList gvr_buffer_viewports =
|
| - gvr_api->CreateEmptyBufferViewportList();
|
| - gvr_buffer_viewports.SetToRecommendedBufferViewports();
|
| -
|
| - gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport();
|
| - gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport);
|
| - gvr::Rectf eye_fov = eye_viewport.GetSourceFov();
|
| - left_eye->fieldOfView->upDegrees = eye_fov.top;
|
| - left_eye->fieldOfView->downDegrees = eye_fov.bottom;
|
| - left_eye->fieldOfView->leftDegrees = eye_fov.left;
|
| - left_eye->fieldOfView->rightDegrees = eye_fov.right;
|
| -
|
| - eye_viewport = gvr_api->CreateBufferViewport();
|
| - gvr_buffer_viewports.GetBufferViewport(GVR_RIGHT_EYE, &eye_viewport);
|
| - eye_fov = eye_viewport.GetSourceFov();
|
| - right_eye->fieldOfView->upDegrees = eye_fov.top;
|
| - right_eye->fieldOfView->downDegrees = eye_fov.bottom;
|
| - right_eye->fieldOfView->leftDegrees = eye_fov.left;
|
| - right_eye->fieldOfView->rightDegrees = eye_fov.right;
|
| -
|
| - gvr::Mat4f left_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_LEFT_EYE);
|
| - left_eye->offset[0] = -left_eye_mat.m[0][3];
|
| - left_eye->offset[1] = -left_eye_mat.m[1][3];
|
| - left_eye->offset[2] = -left_eye_mat.m[2][3];
|
| -
|
| - gvr::Mat4f right_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
|
| - right_eye->offset[0] = -right_eye_mat.m[0][3];
|
| - right_eye->offset[1] = -right_eye_mat.m[1][3];
|
| - right_eye->offset[2] = -right_eye_mat.m[2][3];
|
| -
|
| - if (delegate_) {
|
| - delegate_->SetWebVRRenderSurfaceSize(2 * left_eye->renderWidth,
|
| - left_eye->renderHeight);
|
| - }
|
| -
|
| - return device;
|
| }
|
|
|
| void GvrDevice::ResetPose() {
|
| - gvr::GvrApi* gvr_api = GetGvrApi();
|
| -
|
| - // Should never call RecenterTracking when using with Daydream viewers. On
|
| - // those devices recentering should only be done via the controller.
|
| - if (gvr_api && gvr_api->GetViewerType() == GVR_VIEWER_TYPE_CARDBOARD)
|
| - gvr_api->RecenterTracking();
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (delegate)
|
| + delegate->ResetPose();
|
| }
|
|
|
| void GvrDevice::RequestPresent(const base::Callback<void(bool)>& callback) {
|
| @@ -159,8 +46,9 @@ void GvrDevice::RequestPresent(const base::Callback<void(bool)>& callback) {
|
|
|
| void GvrDevice::SetSecureOrigin(bool secure_origin) {
|
| secure_origin_ = secure_origin;
|
| - if (delegate_)
|
| - delegate_->SetWebVRSecureOrigin(secure_origin_);
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (delegate)
|
| + delegate->SetWebVRSecureOrigin(secure_origin_);
|
| }
|
|
|
| void GvrDevice::ExitPresent() {
|
| @@ -169,14 +57,16 @@ void GvrDevice::ExitPresent() {
|
| }
|
|
|
| void GvrDevice::SubmitFrame(mojom::VRPosePtr pose) {
|
| - if (delegate_)
|
| - delegate_->SubmitWebVRFrame();
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (delegate)
|
| + delegate->SubmitWebVRFrame();
|
| }
|
|
|
| void GvrDevice::UpdateLayerBounds(int16_t frame_index,
|
| mojom::VRLayerBoundsPtr left_bounds,
|
| mojom::VRLayerBoundsPtr right_bounds) {
|
| - if (!delegate_)
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (!delegate)
|
| return;
|
|
|
| gvr::Rectf left_gvr_bounds;
|
| @@ -191,30 +81,32 @@ void GvrDevice::UpdateLayerBounds(int16_t frame_index,
|
| right_gvr_bounds.right = right_bounds->left + right_bounds->width;
|
| right_gvr_bounds.bottom = 1.0f - (right_bounds->top + right_bounds->height);
|
|
|
| - delegate_->UpdateWebVRTextureBounds(frame_index, left_gvr_bounds,
|
| - right_gvr_bounds);
|
| + delegate->UpdateWebVRTextureBounds(frame_index, left_gvr_bounds,
|
| + right_gvr_bounds);
|
| }
|
|
|
| void GvrDevice::GetVRVSyncProvider(mojom::VRVSyncProviderRequest request) {
|
| - if (delegate_)
|
| - delegate_->OnVRVsyncProviderRequest(std::move(request));
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (delegate)
|
| + delegate->OnVRVsyncProviderRequest(std::move(request));
|
| }
|
|
|
| -void GvrDevice::SetDelegate(GvrDelegate* delegate) {
|
| - delegate_ = delegate;
|
| -
|
| +void GvrDevice::OnDelegateChanged() {
|
| + GvrDelegate* delegate = GetGvrDelegate();
|
| + if (!delegate || !delegate->SupportsPresentation())
|
| + OnExitPresent();
|
| // Notify the clients that this device has changed
|
| - if (delegate_) {
|
| - delegate_->SetWebVRSecureOrigin(secure_origin_);
|
| - OnChanged();
|
| - }
|
| -}
|
| + if (delegate)
|
| + delegate->SetWebVRSecureOrigin(secure_origin_);
|
|
|
| -gvr::GvrApi* GvrDevice::GetGvrApi() {
|
| - if (!delegate_)
|
| - return nullptr;
|
| + OnChanged();
|
| +}
|
|
|
| - return delegate_->gvr_api();
|
| +GvrDelegate* GvrDevice::GetGvrDelegate() {
|
| + GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
|
| + if (delegate_provider)
|
| + return delegate_provider->GetDelegate();
|
| + return nullptr;
|
| }
|
|
|
| } // namespace device
|
|
|