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 "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
9 #include "base/threading/thread_task_runner_handle.h" | 9 #include "base/threading/thread_task_runner_handle.h" |
10 #include "chrome/browser/android/vr_shell/ui_elements.h" | 10 #include "chrome/browser/android/vr_shell/ui_elements.h" |
11 #include "chrome/browser/android/vr_shell/ui_interface.h" | |
12 #include "chrome/browser/android/vr_shell/ui_scene.h" | 11 #include "chrome/browser/android/vr_shell/ui_scene.h" |
13 #include "chrome/browser/android/vr_shell/vr_controller.h" | 12 #include "chrome/browser/android/vr_shell/vr_controller.h" |
14 #include "chrome/browser/android/vr_shell/vr_gl_util.h" | 13 #include "chrome/browser/android/vr_shell/vr_gl_util.h" |
15 #include "chrome/browser/android/vr_shell/vr_input_manager.h" | 14 #include "chrome/browser/android/vr_shell/vr_input_manager.h" |
16 #include "chrome/browser/android/vr_shell/vr_math.h" | 15 #include "chrome/browser/android/vr_shell/vr_math.h" |
17 #include "chrome/browser/android/vr_shell/vr_shell.h" | 16 #include "chrome/browser/android/vr_shell/vr_shell.h" |
18 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h" | 17 #include "chrome/browser/android/vr_shell/vr_shell_renderer.h" |
19 #include "third_party/WebKit/public/platform/WebInputEvent.h" | 18 #include "third_party/WebKit/public/platform/WebInputEvent.h" |
20 #include "ui/gfx/vsync_provider.h" | 19 #include "ui/gfx/vsync_provider.h" |
21 #include "ui/gl/android/scoped_java_surface.h" | 20 #include "ui/gl/android/scoped_java_surface.h" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
165 return pixels[0]; | 164 return pixels[0]; |
166 } | 165 } |
167 VLOG(1) << "WebVR: reject decoded pose index " << (int)pixels[0] << | 166 VLOG(1) << "WebVR: reject decoded pose index " << (int)pixels[0] << |
168 ", bad magic number " << (int)pixels[1] << ", " << (int)pixels[2]; | 167 ", bad magic number " << (int)pixels[1] << ", " << (int)pixels[2]; |
169 return -1; | 168 return -1; |
170 } | 169 } |
171 | 170 |
172 } // namespace | 171 } // namespace |
173 | 172 |
174 VrShellGl::VrShellGl( | 173 VrShellGl::VrShellGl( |
175 VrShell* vr_shell, | |
176 const base::WeakPtr<VrShell>& weak_vr_shell, | 174 const base::WeakPtr<VrShell>& weak_vr_shell, |
177 const base::WeakPtr<VrInputManager>& content_input_manager, | 175 const base::WeakPtr<VrInputManager>& content_input_manager, |
178 const base::WeakPtr<VrInputManager>& ui_input_manager, | 176 const base::WeakPtr<VrInputManager>& ui_input_manager, |
179 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner, | 177 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner, |
180 gvr_context* gvr_api) | 178 gvr_context* gvr_api, |
181 : task_runner_(base::ThreadTaskRunnerHandle::Get()), | 179 bool initially_web_vr) |
182 vr_shell_(vr_shell), | 180 : web_vr_mode_(initially_web_vr), |
181 task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
183 weak_vr_shell_(weak_vr_shell), | 182 weak_vr_shell_(weak_vr_shell), |
184 content_input_manager_(content_input_manager), | 183 content_input_manager_(content_input_manager), |
185 ui_input_manager_(ui_input_manager), | 184 ui_input_manager_(ui_input_manager), |
186 main_thread_task_runner_(std::move(main_thread_task_runner)), | 185 main_thread_task_runner_(std::move(main_thread_task_runner)), |
187 weak_ptr_factory_(this) { | 186 weak_ptr_factory_(this) { |
188 GvrInit(gvr_api); | 187 GvrInit(gvr_api); |
189 } | 188 } |
190 | 189 |
191 VrShellGl::~VrShellGl() { | 190 VrShellGl::~VrShellGl() { |
192 draw_task_.Cancel(); | 191 draw_task_.Cancel(); |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
376 webvr_right_viewport_.get()); | 375 webvr_right_viewport_.get()); |
377 webvr_right_viewport_->SetSourceBufferIndex(kFramePrimaryBuffer); | 376 webvr_right_viewport_->SetSourceBufferIndex(kFramePrimaryBuffer); |
378 | 377 |
379 main_thread_task_runner_->PostTask(FROM_HERE, base::Bind( | 378 main_thread_task_runner_->PostTask(FROM_HERE, base::Bind( |
380 &VrShell::GvrDelegateReady, weak_vr_shell_)); | 379 &VrShell::GvrDelegateReady, weak_vr_shell_)); |
381 } | 380 } |
382 | 381 |
383 void VrShellGl::UpdateController(const gvr::Vec3f& forward_vector) { | 382 void VrShellGl::UpdateController(const gvr::Vec3f& forward_vector) { |
384 controller_->UpdateState(); | 383 controller_->UpdateState(); |
385 | 384 |
386 #if defined(ENABLE_VR_SHELL) | |
387 // TODO(mthiesse): Fix menu button handling, which should be posted to the UI | |
388 // thread instead of handled here. | |
389 | 385 |
390 // Note that button up/down state is transient, so ButtonUpHappened only | 386 // Note that button up/down state is transient, so ButtonUpHappened only |
391 // returns true for a single frame (and we're guaranteed not to miss it). | 387 // returns true for a single frame (and we're guaranteed not to miss it). |
392 if (controller_->ButtonUpHappened( | 388 if (controller_->ButtonUpHappened( |
393 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_APP)) { | 389 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_APP)) { |
394 // html_interface_->SetMenuMode(!html_interface_->GetMenuMode()); | 390 main_thread_task_runner_->PostTask( |
391 FROM_HERE, base::Bind(&VrShell::AppButtonPressed, weak_vr_shell_)); | |
392 } | |
395 | 393 |
396 // TODO(mthiesse): The page is no longer visible when in menu mode. We | 394 if (web_vr_mode_) { |
397 // should unfocus or otherwise let it know it's hidden. | |
398 // if (html_interface_->GetMode() == UiInterface::Mode::WEB_VR) { | |
399 // const auto&& task = html_interface_->GetMenuMode() ? | |
400 // &device::GvrDeviceProvider::OnDisplayBlur : | |
401 // &device::GvrDeviceProvider::OnDisplayFocus; | |
402 // main_thread_task_runner_->PostTask( | |
403 // FROM_HERE, base::Bind(task, delegate_->GetDeviceProvider())); | |
404 // } | |
405 } | |
406 #endif | |
407 if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) { | |
408 // Process screen touch events for Cardboard button compatibility. | 395 // Process screen touch events for Cardboard button compatibility. |
409 // Also send tap events for controller "touchpad click" events. | 396 // Also send tap events for controller "touchpad click" events. |
410 if (touch_pending_ || controller_->ButtonUpHappened( | 397 if (touch_pending_ || controller_->ButtonUpHappened( |
411 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) { | 398 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) { |
412 touch_pending_ = false; | 399 touch_pending_ = false; |
413 std::unique_ptr<WebGestureEvent> gesture(new WebGestureEvent()); | 400 std::unique_ptr<WebGestureEvent> gesture(new WebGestureEvent()); |
414 gesture->sourceDevice = blink::WebGestureDeviceTouchpad; | 401 gesture->sourceDevice = blink::WebGestureDeviceTouchpad; |
415 gesture->timeStampSeconds = | 402 gesture->timeStampSeconds = |
416 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 403 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); |
417 gesture->type = WebInputEvent::GestureTapDown; | 404 gesture->type = WebInputEvent::GestureTapDown; |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
605 | 592 |
606 void VrShellGl::DrawFrame() { | 593 void VrShellGl::DrawFrame() { |
607 TRACE_EVENT0("gpu", "VrShellGl::DrawFrame"); | 594 TRACE_EVENT0("gpu", "VrShellGl::DrawFrame"); |
608 // Reset the viewport list to just the pair of viewports for the | 595 // Reset the viewport list to just the pair of viewports for the |
609 // primary buffer each frame. Head-locked viewports get added by | 596 // primary buffer each frame. Head-locked viewports get added by |
610 // DrawVrShell if needed. | 597 // DrawVrShell if needed. |
611 buffer_viewport_list_->SetToRecommendedBufferViewports(); | 598 buffer_viewport_list_->SetToRecommendedBufferViewports(); |
612 | 599 |
613 // TODO(klausw): Fix this. Resizing buffers here leads to webVR mode showing | 600 // TODO(klausw): Fix this. Resizing buffers here leads to webVR mode showing |
614 // nothing but a black screen. | 601 // nothing but a black screen. |
615 // if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) { | 602 // if (web_vr_mode_) { |
616 // // If needed, resize the primary buffer for use with WebVR. | 603 // // If needed, resize the primary buffer for use with WebVR. |
617 // if (render_size_primary_ != render_size_primary_webvr_) { | 604 // if (render_size_primary_ != render_size_primary_webvr_) { |
618 // if (!render_size_primary_webvr_.width) { | 605 // if (!render_size_primary_webvr_.width) { |
619 // VLOG(2) << "WebVR rendering size not known yet, dropping frame"; | 606 // VLOG(2) << "WebVR rendering size not known yet, dropping frame"; |
620 // return; | 607 // return; |
621 // } | 608 // } |
622 // render_size_primary_ = render_size_primary_webvr_; | 609 // render_size_primary_ = render_size_primary_webvr_; |
623 // swap_chain_->ResizeBuffer(kFramePrimaryBuffer, render_size_primary_); | 610 // swap_chain_->ResizeBuffer(kFramePrimaryBuffer, render_size_primary_); |
624 // } | 611 // } |
625 // } else { | 612 // } else { |
(...skipping 21 matching lines...) Expand all Loading... | |
647 } | 634 } |
648 | 635 |
649 frame.BindBuffer(kFramePrimaryBuffer); | 636 frame.BindBuffer(kFramePrimaryBuffer); |
650 | 637 |
651 // Update the render position of all UI elements (including desktop). | 638 // Update the render position of all UI elements (including desktop). |
652 const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f; | 639 const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f; |
653 scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds()); | 640 scene_->UpdateTransforms(screen_tilt, UiScene::TimeInMicroseconds()); |
654 | 641 |
655 UpdateController(GetForwardVector(head_pose)); | 642 UpdateController(GetForwardVector(head_pose)); |
656 | 643 |
657 if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) { | 644 if (web_vr_mode_) { |
658 DrawWebVr(); | 645 DrawWebVr(); |
659 | 646 |
660 // When using async reprojection, we need to know which pose was used in | 647 // When using async reprojection, we need to know which pose was used in |
661 // the WebVR app for drawing this frame. Due to unknown amounts of | 648 // the WebVR app for drawing this frame. Due to unknown amounts of |
662 // buffering in the compositor and SurfaceTexture, we read the pose number | 649 // buffering in the compositor and SurfaceTexture, we read the pose number |
663 // from a corner pixel. There's no point in doing this for legacy | 650 // from a corner pixel. There's no point in doing this for legacy |
664 // distortion rendering since that doesn't need a pose, and reading back | 651 // distortion rendering since that doesn't need a pose, and reading back |
665 // pixels is an expensive operation. TODO(klausw,crbug.com/655722): stop | 652 // pixels is an expensive operation. TODO(klausw,crbug.com/655722): stop |
666 // doing this once we have working no-compositor rendering for WebVR. | 653 // doing this once we have working no-compositor rendering for WebVR. |
667 if (gvr_api_->GetAsyncReprojectionEnabled()) { | 654 if (gvr_api_->GetAsyncReprojectionEnabled()) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
705 if (!rect->visible) { | 692 if (!rect->visible) { |
706 continue; | 693 continue; |
707 } | 694 } |
708 if (rect->lock_to_fov) { | 695 if (rect->lock_to_fov) { |
709 head_locked_elements.push_back(rect.get()); | 696 head_locked_elements.push_back(rect.get()); |
710 } else { | 697 } else { |
711 world_elements.push_back(rect.get()); | 698 world_elements.push_back(rect.get()); |
712 } | 699 } |
713 } | 700 } |
714 | 701 |
715 if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) { | 702 if (web_vr_mode_) { |
716 // WebVR is incompatible with 3D world compositing since the | 703 // WebVR is incompatible with 3D world compositing since the |
717 // depth buffer was already populated with unknown scaling - the | 704 // depth buffer was already populated with unknown scaling - the |
718 // WebVR app has full control over zNear/zFar. Just leave the | 705 // WebVR app has full control over zNear/zFar. Just leave the |
719 // existing content in place in the primary buffer without | 706 // existing content in place in the primary buffer without |
720 // clearing. Currently, there aren't any world elements in WebVR | 707 // clearing. Currently, there aren't any world elements in WebVR |
721 // mode, this will need further testing if those get added | 708 // mode, this will need further testing if those get added |
722 // later. | 709 // later. |
723 } else { | 710 } else { |
724 // Non-WebVR mode, enable depth testing and clear the primary buffers. | 711 // Non-WebVR mode, enable depth testing and clear the primary buffers. |
725 glEnable(GL_CULL_FACE); | 712 glEnable(GL_CULL_FACE); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
788 glViewport(pixel_rect.left, pixel_rect.bottom, | 775 glViewport(pixel_rect.left, pixel_rect.bottom, |
789 pixel_rect.right - pixel_rect.left, | 776 pixel_rect.right - pixel_rect.left, |
790 pixel_rect.top - pixel_rect.bottom); | 777 pixel_rect.top - pixel_rect.bottom); |
791 | 778 |
792 const gvr::Mat4f render_matrix = MatrixMul( | 779 const gvr::Mat4f render_matrix = MatrixMul( |
793 PerspectiveMatrixFromView( | 780 PerspectiveMatrixFromView( |
794 buffer_viewport_->GetSourceFov(), kZNear, kZFar), | 781 buffer_viewport_->GetSourceFov(), kZNear, kZFar), |
795 view_matrix); | 782 view_matrix); |
796 | 783 |
797 DrawElements(render_matrix, elements); | 784 DrawElements(render_matrix, elements); |
798 if (head_pose != nullptr && | 785 if (head_pose != nullptr && !web_vr_mode_) { |
799 vr_shell_->GetUiInterface()->GetMode() != UiInterface::Mode::WEB_VR) { | |
800 DrawCursor(render_matrix); | 786 DrawCursor(render_matrix); |
801 } | 787 } |
802 } | 788 } |
803 } | 789 } |
804 | 790 |
805 void VrShellGl::DrawElements( | 791 void VrShellGl::DrawElements( |
806 const gvr::Mat4f& render_matrix, | 792 const gvr::Mat4f& render_matrix, |
807 const std::vector<const ContentRectangle*>& elements) { | 793 const std::vector<const ContentRectangle*>& elements) { |
808 for (const auto& rect : elements) { | 794 for (const auto& rect : elements) { |
809 Rectf copy_rect; | 795 Rectf copy_rect; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
930 } | 916 } |
931 | 917 |
932 void VrShellGl::OnResume() { | 918 void VrShellGl::OnResume() { |
933 gvr_api_->RefreshViewerProfile(); | 919 gvr_api_->RefreshViewerProfile(); |
934 gvr_api_->ResumeTracking(); | 920 gvr_api_->ResumeTracking(); |
935 controller_->OnResume(); | 921 controller_->OnResume(); |
936 draw_task_.Reset(base::Bind(&VrShellGl::DrawFrame, base::Unretained(this))); | 922 draw_task_.Reset(base::Bind(&VrShellGl::DrawFrame, base::Unretained(this))); |
937 ScheduleNextDrawFrame(); | 923 ScheduleNextDrawFrame(); |
938 } | 924 } |
939 | 925 |
940 void VrShellGl::SetWebVrMode(bool enabled) { | 926 void VrShellGl::SetWebVrMode(bool enabled) { |
bshe
2016/12/14 16:06:46
Is this function ever being called?
mthiesse
2016/12/14 16:20:43
Yes, VrShell::SetWebVrMode posts to it.
bshe
2016/12/14 17:36:51
dooh. Missed that...
| |
941 if (enabled) { | 927 web_vr_mode_ = enabled; |
942 vr_shell_->GetUiInterface()->SetMode(UiInterface::Mode::WEB_VR); | |
943 } else { | |
944 vr_shell_->GetUiInterface()->SetMode(UiInterface::Mode::STANDARD); | |
945 } | |
946 } | 928 } |
947 | 929 |
948 void VrShellGl::UpdateWebVRTextureBounds(const gvr::Rectf& left_bounds, | 930 void VrShellGl::UpdateWebVRTextureBounds(const gvr::Rectf& left_bounds, |
949 const gvr::Rectf& right_bounds) { | 931 const gvr::Rectf& right_bounds) { |
950 webvr_left_viewport_->SetSourceUv(left_bounds); | 932 webvr_left_viewport_->SetSourceUv(left_bounds); |
951 webvr_right_viewport_->SetSourceUv(right_bounds); | 933 webvr_right_viewport_->SetSourceUv(right_bounds); |
952 } | 934 } |
953 | 935 |
954 gvr::GvrApi* VrShellGl::gvr_api() { | 936 gvr::GvrApi* VrShellGl::gvr_api() { |
955 return gvr_api_.get(); | 937 return gvr_api_.get(); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1004 | 986 |
1005 task_runner_->PostDelayedTask(FROM_HERE, draw_task_.callback(), target - now); | 987 task_runner_->PostDelayedTask(FROM_HERE, draw_task_.callback(), target - now); |
1006 } | 988 } |
1007 | 989 |
1008 void VrShellGl::ForceExitVR() { | 990 void VrShellGl::ForceExitVR() { |
1009 main_thread_task_runner_->PostTask( | 991 main_thread_task_runner_->PostTask( |
1010 FROM_HERE, base::Bind(&VrShell::ForceExitVR, weak_vr_shell_)); | 992 FROM_HERE, base::Bind(&VrShell::ForceExitVR, weak_vr_shell_)); |
1011 } | 993 } |
1012 | 994 |
1013 } // namespace vr_shell | 995 } // namespace vr_shell |
OLD | NEW |