| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/android/vr_shell/vr_shell_gl.h" | 5 #include "chrome/browser/android/vr_shell/vr_shell_gl.h" |
| 6 | 6 |
| 7 #include <chrono> | 7 #include <chrono> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 124 return mouse_event; | 124 return mouse_event; |
| 125 } | 125 } |
| 126 | 126 |
| 127 enum class ViewerType { | 127 enum class ViewerType { |
| 128 UNKNOWN_TYPE = 0, | 128 UNKNOWN_TYPE = 0, |
| 129 CARDBOARD = 1, | 129 CARDBOARD = 1, |
| 130 DAYDREAM = 2, | 130 DAYDREAM = 2, |
| 131 VIEWER_TYPE_MAX, | 131 VIEWER_TYPE_MAX, |
| 132 }; | 132 }; |
| 133 | 133 |
| 134 int64_t TimeInMicroseconds() { | |
| 135 return std::chrono::duration_cast<std::chrono::microseconds>( | |
| 136 std::chrono::steady_clock::now().time_since_epoch()) | |
| 137 .count(); | |
| 138 } | |
| 139 | |
| 140 void RunVRDisplayInfoCallback( | 134 void RunVRDisplayInfoCallback( |
| 141 const base::Callback<void(device::mojom::VRDisplayInfoPtr)>& callback, | 135 const base::Callback<void(device::mojom::VRDisplayInfoPtr)>& callback, |
| 142 device::mojom::VRDisplayInfoPtr info) { | 136 device::mojom::VRDisplayInfoPtr info) { |
| 143 callback.Run(std::move(info)); | 137 callback.Run(std::move(info)); |
| 144 } | 138 } |
| 145 | 139 |
| 146 } // namespace | 140 } // namespace |
| 147 | 141 |
| 148 VrShellGl::VrShellGl( | 142 VrShellGl::VrShellGl( |
| 149 const base::WeakPtr<VrShell>& weak_vr_shell, | 143 const base::WeakPtr<VrShell>& weak_vr_shell, |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 ? &VrShell::ProcessContentGesture | 709 ? &VrShell::ProcessContentGesture |
| 716 : &VrShell::ProcessUIGesture; | 710 : &VrShell::ProcessUIGesture; |
| 717 main_thread_task_runner_->PostTask( | 711 main_thread_task_runner_->PostTask( |
| 718 FROM_HERE, | 712 FROM_HERE, |
| 719 base::Bind(target, weak_vr_shell_, base::Passed(std::move(event)))); | 713 base::Bind(target, weak_vr_shell_, base::Passed(std::move(event)))); |
| 720 } | 714 } |
| 721 | 715 |
| 722 void VrShellGl::DrawFrame(int16_t frame_index) { | 716 void VrShellGl::DrawFrame(int16_t frame_index) { |
| 723 TRACE_EVENT1("gpu", "VrShellGl::DrawFrame", "frame", frame_index); | 717 TRACE_EVENT1("gpu", "VrShellGl::DrawFrame", "frame", frame_index); |
| 724 | 718 |
| 719 base::TimeTicks current_time = base::TimeTicks::Now(); |
| 720 |
| 725 // Reset the viewport list to just the pair of viewports for the | 721 // Reset the viewport list to just the pair of viewports for the |
| 726 // primary buffer each frame. Head-locked viewports get added by | 722 // primary buffer each frame. Head-locked viewports get added by |
| 727 // DrawVrShell if needed. | 723 // DrawVrShell if needed. |
| 728 buffer_viewport_list_->SetToRecommendedBufferViewports(); | 724 buffer_viewport_list_->SetToRecommendedBufferViewports(); |
| 729 | 725 |
| 730 // If needed, resize the primary buffer for use with WebVR. Resizing | 726 // If needed, resize the primary buffer for use with WebVR. Resizing |
| 731 // needs to happen before acquiring a frame. | 727 // needs to happen before acquiring a frame. |
| 732 if (ShouldDrawWebVr()) { | 728 if (ShouldDrawWebVr()) { |
| 733 // Process all pending_bounds_ changes targeted for before this | 729 // Process all pending_bounds_ changes targeted for before this |
| 734 // frame, being careful of wrapping frame indices. | 730 // frame, being careful of wrapping frame indices. |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 if (position.x == 0.0f && position.y == 0.0f && position.z == 0.0f) { | 812 if (position.x == 0.0f && position.y == 0.0f && position.z == 0.0f) { |
| 817 // This appears to be a 3DOF pose without a neck model. Add one. | 813 // This appears to be a 3DOF pose without a neck model. Add one. |
| 818 // The head pose has redundant data. Assume we're only using the | 814 // The head pose has redundant data. Assume we're only using the |
| 819 // object_from_reference_matrix, we're not updating position_external. | 815 // object_from_reference_matrix, we're not updating position_external. |
| 820 // TODO: Not sure what object_from_reference_matrix is. The new api removed | 816 // TODO: Not sure what object_from_reference_matrix is. The new api removed |
| 821 // it. For now, removing it seems working fine. | 817 // it. For now, removing it seems working fine. |
| 822 gvr_api_->ApplyNeckModel(head_pose, 1.0f); | 818 gvr_api_->ApplyNeckModel(head_pose, 1.0f); |
| 823 } | 819 } |
| 824 | 820 |
| 825 // Update the render position of all UI elements (including desktop). | 821 // Update the render position of all UI elements (including desktop). |
| 826 scene_->UpdateTransforms(TimeInMicroseconds()); | 822 scene_->UpdateTransforms(current_time); |
| 827 | 823 |
| 828 { | 824 { |
| 829 // TODO(crbug.com/704690): Acquire controller state in a way that's timely | 825 // TODO(crbug.com/704690): Acquire controller state in a way that's timely |
| 830 // for both the gamepad API and UI input handling. | 826 // for both the gamepad API and UI input handling. |
| 831 TRACE_EVENT0("gpu", "VrShellGl::UpdateController"); | 827 TRACE_EVENT0("gpu", "VrShellGl::UpdateController"); |
| 832 UpdateController(); | 828 UpdateController(); |
| 833 HandleControllerInput(GetForwardVector(head_pose)); | 829 HandleControllerInput(GetForwardVector(head_pose)); |
| 834 } | 830 } |
| 835 | 831 |
| 836 DrawWorldElements(head_pose); | 832 DrawWorldElements(head_pose); |
| (...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1261 vsync_task_.Reset(base::Bind(&VrShellGl::OnVSync, base::Unretained(this))); | 1257 vsync_task_.Reset(base::Bind(&VrShellGl::OnVSync, base::Unretained(this))); |
| 1262 OnVSync(); | 1258 OnVSync(); |
| 1263 } | 1259 } |
| 1264 | 1260 |
| 1265 void VrShellGl::ForceExitVr() { | 1261 void VrShellGl::ForceExitVr() { |
| 1266 main_thread_task_runner_->PostTask( | 1262 main_thread_task_runner_->PostTask( |
| 1267 FROM_HERE, base::Bind(&VrShell::ForceExitVr, weak_vr_shell_)); | 1263 FROM_HERE, base::Bind(&VrShell::ForceExitVr, weak_vr_shell_)); |
| 1268 } | 1264 } |
| 1269 | 1265 |
| 1270 void VrShellGl::UpdateScene(std::unique_ptr<base::ListValue> commands) { | 1266 void VrShellGl::UpdateScene(std::unique_ptr<base::ListValue> commands) { |
| 1271 scene_->HandleCommands(std::move(commands), TimeInMicroseconds()); | 1267 scene_->HandleCommands(std::move(commands), base::TimeTicks::Now()); |
| 1272 } | 1268 } |
| 1273 | 1269 |
| 1274 void VrShellGl::SendVSync(base::TimeDelta time, | 1270 void VrShellGl::SendVSync(base::TimeDelta time, |
| 1275 const GetVSyncCallback& callback) { | 1271 const GetVSyncCallback& callback) { |
| 1276 uint8_t frame_index = frame_index_++; | 1272 uint8_t frame_index = frame_index_++; |
| 1277 | 1273 |
| 1278 TRACE_EVENT1("input", "VrShellGl::SendVSync", "frame", frame_index); | 1274 TRACE_EVENT1("input", "VrShellGl::SendVSync", "frame", frame_index); |
| 1279 | 1275 |
| 1280 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); | 1276 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); |
| 1281 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; | 1277 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1297 // appropriate recommended render resolution as the default size during | 1293 // appropriate recommended render resolution as the default size during |
| 1298 // InitializeGl. Revisit if the initialization order changes. | 1294 // InitializeGl. Revisit if the initialization order changes. |
| 1299 device::mojom::VRDisplayInfoPtr info = VrShell::CreateVRDisplayInfo( | 1295 device::mojom::VRDisplayInfoPtr info = VrShell::CreateVRDisplayInfo( |
| 1300 gvr_api_.get(), webvr_surface_size_, device_id); | 1296 gvr_api_.get(), webvr_surface_size_, device_id); |
| 1301 main_thread_task_runner_->PostTask( | 1297 main_thread_task_runner_->PostTask( |
| 1302 FROM_HERE, | 1298 FROM_HERE, |
| 1303 base::Bind(&RunVRDisplayInfoCallback, callback, base::Passed(&info))); | 1299 base::Bind(&RunVRDisplayInfoCallback, callback, base::Passed(&info))); |
| 1304 } | 1300 } |
| 1305 | 1301 |
| 1306 } // namespace vr_shell | 1302 } // namespace vr_shell |
| OLD | NEW |