Chromium Code Reviews| Index: chrome/browser/android/vr_shell/non_presenting_gvr_delegate.cc |
| diff --git a/chrome/browser/android/vr_shell/non_presenting_gvr_delegate.cc b/chrome/browser/android/vr_shell/non_presenting_gvr_delegate.cc |
| index c25da54458e04fc8f1922be5bb5c9247182402dd..c2457ba4176e627bc8351dec29fdc59ff6924d6c 100644 |
| --- a/chrome/browser/android/vr_shell/non_presenting_gvr_delegate.cc |
| +++ b/chrome/browser/android/vr_shell/non_presenting_gvr_delegate.cc |
| @@ -20,7 +20,11 @@ NonPresentingGvrDelegate::NonPresentingGvrDelegate(gvr_context* context) |
| : task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| binding_(this), |
| weak_ptr_factory_(this) { |
| - gvr_api_ = gvr::GvrApi::WrapNonOwned(context); |
| + // Context may be null, see VrShellDelegate#createNonPresentingNativeContext |
| + // for possible reasons a context could fail to be created. For example, |
| + // the user might uninstall apps or clear data after VR support was detected. |
| + if (context) |
| + gvr_api_ = gvr::GvrApi::WrapNonOwned(context); |
| } |
| NonPresentingGvrDelegate::~NonPresentingGvrDelegate() { |
| @@ -40,7 +44,8 @@ void NonPresentingGvrDelegate::OnVRVsyncProviderRequest( |
| void NonPresentingGvrDelegate::Pause() { |
| vsync_task_.Cancel(); |
| vsync_paused_ = true; |
| - gvr_api_->PauseTracking(); |
| + if (gvr_api_) |
| + gvr_api_->PauseTracking(); |
| } |
| void NonPresentingGvrDelegate::Resume() { |
| @@ -60,12 +65,14 @@ NonPresentingGvrDelegate::OnSwitchToPresentingDelegate() { |
| void NonPresentingGvrDelegate::StopVSyncLoop() { |
| vsync_task_.Cancel(); |
| + binding_.Close(); |
| if (!callback_.is_null()) { |
| base::ResetAndReturn(&callback_) |
| .Run(nullptr, base::TimeDelta(), -1, |
| - device::mojom::VRVSyncProvider::Status::RETRY); |
| + device::mojom::VRVSyncProvider::Status::CLOSING); |
| } |
| - gvr_api_->PauseTracking(); |
| + if (gvr_api_) |
| + gvr_api_->PauseTracking(); |
| // If the loop is stopped, it's not considered to be paused. |
| vsync_paused_ = false; |
| } |
| @@ -73,8 +80,10 @@ void NonPresentingGvrDelegate::StopVSyncLoop() { |
| void NonPresentingGvrDelegate::StartVSyncLoop() { |
| vsync_task_.Reset( |
| base::Bind(&NonPresentingGvrDelegate::OnVSync, base::Unretained(this))); |
| - gvr_api_->RefreshViewerProfile(); |
| - gvr_api_->ResumeTracking(); |
| + if (gvr_api_) { |
| + gvr_api_->RefreshViewerProfile(); |
| + gvr_api_->ResumeTracking(); |
| + } |
| OnVSync(); |
| } |
| @@ -136,6 +145,12 @@ void NonPresentingGvrDelegate::SendVSync(base::TimeDelta time, |
| gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); |
| target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; |
| + if (!gvr_api_) { |
| + callback.Run(device::mojom::VRPosePtr(nullptr), time, -1, |
| + device::mojom::VRVSyncProvider::Status::SUCCESS); |
| + return; |
| + } |
| + |
| gvr::Mat4f head_mat = gvr_api_->ApplyNeckModel( |
| gvr_api_->GetHeadSpaceFromStartSpaceRotation(target_time), 1.0f); |
| callback.Run(VrShell::VRPosePtrFromGvrPose(head_mat), time, -1, |
| @@ -156,8 +171,16 @@ void NonPresentingGvrDelegate::ResetPose() { |
| void NonPresentingGvrDelegate::CreateVRDisplayInfo( |
| const base::Callback<void(device::mojom::VRDisplayInfoPtr)>& callback, |
| uint32_t device_id) { |
| - callback.Run(VrShell::CreateVRDisplayInfo( |
| - gvr_api_.get(), device::kInvalidRenderTargetSize, device_id)); |
| + if (!gvr_api_) { |
| + callback.Run(device::mojom::VRDisplayInfoPtr(nullptr)); |
| + return; |
| + } |
| + |
| + gvr::Sizei webvr_size = VrShell::GetRecommendedWebVrSize(gvr_api_.get()); |
|
klausw
2017/03/10 02:49:32
Calling the static GetRecommendedWebVrSize here in
|
| + DVLOG(1) << __FUNCTION__ << ": resize recommended to " << webvr_size.width |
| + << "x" << webvr_size.height; |
| + callback.Run( |
| + VrShell::CreateVRDisplayInfo(gvr_api_.get(), webvr_size, device_id)); |
| } |
| } // namespace vr_shell |