Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: chrome/browser/android/vr_shell/vr_shell_gl.cc

Issue 2570553004: Clean up some VrShell threading issues and remove unnecessary WeakPtr types. (Closed)
Patch Set: rebase Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_gl.h ('k') | device/vr/android/gvr/gvr_delegate.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 } 169 }
171 170
172 int64_t TimeInMicroseconds() { 171 int64_t TimeInMicroseconds() {
173 return std::chrono::duration_cast<std::chrono::microseconds>( 172 return std::chrono::duration_cast<std::chrono::microseconds>(
174 std::chrono::steady_clock::now().time_since_epoch()).count(); 173 std::chrono::steady_clock::now().time_since_epoch()).count();
175 } 174 }
176 175
177 } // namespace 176 } // namespace
178 177
179 VrShellGl::VrShellGl( 178 VrShellGl::VrShellGl(
180 VrShell* vr_shell,
181 const base::WeakPtr<VrShell>& weak_vr_shell, 179 const base::WeakPtr<VrShell>& weak_vr_shell,
182 const base::WeakPtr<VrInputManager>& content_input_manager, 180 const base::WeakPtr<VrInputManager>& content_input_manager,
183 const base::WeakPtr<VrInputManager>& ui_input_manager, 181 const base::WeakPtr<VrInputManager>& ui_input_manager,
184 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner, 182 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
185 gvr_context* gvr_api) 183 gvr_context* gvr_api,
186 : task_runner_(base::ThreadTaskRunnerHandle::Get()), 184 bool initially_web_vr)
187 vr_shell_(vr_shell), 185 : web_vr_mode_(initially_web_vr),
186 task_runner_(base::ThreadTaskRunnerHandle::Get()),
188 weak_vr_shell_(weak_vr_shell), 187 weak_vr_shell_(weak_vr_shell),
189 content_input_manager_(content_input_manager), 188 content_input_manager_(content_input_manager),
190 ui_input_manager_(ui_input_manager), 189 ui_input_manager_(ui_input_manager),
191 main_thread_task_runner_(std::move(main_thread_task_runner)), 190 main_thread_task_runner_(std::move(main_thread_task_runner)),
192 weak_ptr_factory_(this) { 191 weak_ptr_factory_(this) {
193 GvrInit(gvr_api); 192 GvrInit(gvr_api);
194 } 193 }
195 194
196 VrShellGl::~VrShellGl() { 195 VrShellGl::~VrShellGl() {
197 draw_task_.Cancel(); 196 draw_task_.Cancel();
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 webvr_right_viewport_.get()); 379 webvr_right_viewport_.get());
381 webvr_right_viewport_->SetSourceBufferIndex(kFramePrimaryBuffer); 380 webvr_right_viewport_->SetSourceBufferIndex(kFramePrimaryBuffer);
382 381
383 main_thread_task_runner_->PostTask(FROM_HERE, base::Bind( 382 main_thread_task_runner_->PostTask(FROM_HERE, base::Bind(
384 &VrShell::GvrDelegateReady, weak_vr_shell_)); 383 &VrShell::GvrDelegateReady, weak_vr_shell_));
385 } 384 }
386 385
387 void VrShellGl::UpdateController(const gvr::Vec3f& forward_vector) { 386 void VrShellGl::UpdateController(const gvr::Vec3f& forward_vector) {
388 controller_->UpdateState(); 387 controller_->UpdateState();
389 388
390 #if defined(ENABLE_VR_SHELL)
391 // TODO(mthiesse): Fix menu button handling, which should be posted to the UI
392 // thread instead of handled here.
393 389
394 // Note that button up/down state is transient, so ButtonUpHappened only 390 // Note that button up/down state is transient, so ButtonUpHappened only
395 // returns true for a single frame (and we're guaranteed not to miss it). 391 // returns true for a single frame (and we're guaranteed not to miss it).
396 if (controller_->ButtonUpHappened( 392 if (controller_->ButtonUpHappened(
397 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_APP)) { 393 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_APP)) {
398 // html_interface_->SetMenuMode(!html_interface_->GetMenuMode()); 394 main_thread_task_runner_->PostTask(
395 FROM_HERE, base::Bind(&VrShell::AppButtonPressed, weak_vr_shell_));
396 }
399 397
400 // TODO(mthiesse): The page is no longer visible when in menu mode. We 398 if (web_vr_mode_) {
401 // should unfocus or otherwise let it know it's hidden.
402 // if (html_interface_->GetMode() == UiInterface::Mode::WEB_VR) {
403 // const auto&& task = html_interface_->GetMenuMode() ?
404 // &device::GvrDeviceProvider::OnDisplayBlur :
405 // &device::GvrDeviceProvider::OnDisplayFocus;
406 // main_thread_task_runner_->PostTask(
407 // FROM_HERE, base::Bind(task, delegate_->GetDeviceProvider()));
408 // }
409 }
410 #endif
411 if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) {
412 // Process screen touch events for Cardboard button compatibility. 399 // Process screen touch events for Cardboard button compatibility.
413 // Also send tap events for controller "touchpad click" events. 400 // Also send tap events for controller "touchpad click" events.
414 if (touch_pending_ || controller_->ButtonUpHappened( 401 if (touch_pending_ || controller_->ButtonUpHappened(
415 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) { 402 gvr::ControllerButton::GVR_CONTROLLER_BUTTON_CLICK)) {
416 touch_pending_ = false; 403 touch_pending_ = false;
417 std::unique_ptr<WebGestureEvent> gesture(new WebGestureEvent()); 404 std::unique_ptr<WebGestureEvent> gesture(new WebGestureEvent());
418 gesture->sourceDevice = blink::WebGestureDeviceTouchpad; 405 gesture->sourceDevice = blink::WebGestureDeviceTouchpad;
419 gesture->timeStampSeconds = 406 gesture->timeStampSeconds =
420 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); 407 (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF();
421 gesture->type = WebInputEvent::GestureTapDown; 408 gesture->type = WebInputEvent::GestureTapDown;
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 } 619 }
633 620
634 frame.BindBuffer(kFramePrimaryBuffer); 621 frame.BindBuffer(kFramePrimaryBuffer);
635 622
636 // Update the render position of all UI elements (including desktop). 623 // Update the render position of all UI elements (including desktop).
637 const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f; 624 const float screen_tilt = kDesktopScreenTiltDefault * M_PI / 180.0f;
638 scene_->UpdateTransforms(screen_tilt, TimeInMicroseconds()); 625 scene_->UpdateTransforms(screen_tilt, TimeInMicroseconds());
639 626
640 UpdateController(GetForwardVector(head_pose)); 627 UpdateController(GetForwardVector(head_pose));
641 628
642 if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) { 629 if (web_vr_mode_) {
643 DrawWebVr(); 630 DrawWebVr();
644 631
645 // When using async reprojection, we need to know which pose was used in 632 // When using async reprojection, we need to know which pose was used in
646 // the WebVR app for drawing this frame. Due to unknown amounts of 633 // the WebVR app for drawing this frame. Due to unknown amounts of
647 // buffering in the compositor and SurfaceTexture, we read the pose number 634 // buffering in the compositor and SurfaceTexture, we read the pose number
648 // from a corner pixel. There's no point in doing this for legacy 635 // from a corner pixel. There's no point in doing this for legacy
649 // distortion rendering since that doesn't need a pose, and reading back 636 // distortion rendering since that doesn't need a pose, and reading back
650 // pixels is an expensive operation. TODO(klausw,crbug.com/655722): stop 637 // pixels is an expensive operation. TODO(klausw,crbug.com/655722): stop
651 // doing this once we have working no-compositor rendering for WebVR. 638 // doing this once we have working no-compositor rendering for WebVR.
652 if (gvr_api_->GetAsyncReprojectionEnabled()) { 639 if (gvr_api_->GetAsyncReprojectionEnabled()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 if (!rect->visible) { 677 if (!rect->visible) {
691 continue; 678 continue;
692 } 679 }
693 if (rect->lock_to_fov) { 680 if (rect->lock_to_fov) {
694 head_locked_elements.push_back(rect.get()); 681 head_locked_elements.push_back(rect.get());
695 } else { 682 } else {
696 world_elements.push_back(rect.get()); 683 world_elements.push_back(rect.get());
697 } 684 }
698 } 685 }
699 686
700 if (vr_shell_->GetUiInterface()->GetMode() == UiInterface::Mode::WEB_VR) { 687 if (web_vr_mode_) {
701 // WebVR is incompatible with 3D world compositing since the 688 // WebVR is incompatible with 3D world compositing since the
702 // depth buffer was already populated with unknown scaling - the 689 // depth buffer was already populated with unknown scaling - the
703 // WebVR app has full control over zNear/zFar. Just leave the 690 // WebVR app has full control over zNear/zFar. Just leave the
704 // existing content in place in the primary buffer without 691 // existing content in place in the primary buffer without
705 // clearing. Currently, there aren't any world elements in WebVR 692 // clearing. Currently, there aren't any world elements in WebVR
706 // mode, this will need further testing if those get added 693 // mode, this will need further testing if those get added
707 // later. 694 // later.
708 } else { 695 } else {
709 // Non-WebVR mode, enable depth testing and clear the primary buffers. 696 // Non-WebVR mode, enable depth testing and clear the primary buffers.
710 glEnable(GL_CULL_FACE); 697 glEnable(GL_CULL_FACE);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 glViewport(pixel_rect.left, pixel_rect.bottom, 753 glViewport(pixel_rect.left, pixel_rect.bottom,
767 pixel_rect.right - pixel_rect.left, 754 pixel_rect.right - pixel_rect.left,
768 pixel_rect.top - pixel_rect.bottom); 755 pixel_rect.top - pixel_rect.bottom);
769 756
770 const gvr::Mat4f render_matrix = MatrixMul( 757 const gvr::Mat4f render_matrix = MatrixMul(
771 PerspectiveMatrixFromView( 758 PerspectiveMatrixFromView(
772 buffer_viewport_->GetSourceFov(), kZNear, kZFar), 759 buffer_viewport_->GetSourceFov(), kZNear, kZFar),
773 view_matrix); 760 view_matrix);
774 761
775 DrawElements(render_matrix, elements); 762 DrawElements(render_matrix, elements);
776 if (head_pose != nullptr && 763 if (head_pose != nullptr && !web_vr_mode_) {
777 vr_shell_->GetUiInterface()->GetMode() != UiInterface::Mode::WEB_VR) {
778 DrawCursor(render_matrix); 764 DrawCursor(render_matrix);
779 } 765 }
780 } 766 }
781 } 767 }
782 768
783 void VrShellGl::DrawElements( 769 void VrShellGl::DrawElements(
784 const gvr::Mat4f& render_matrix, 770 const gvr::Mat4f& render_matrix,
785 const std::vector<const ContentRectangle*>& elements) { 771 const std::vector<const ContentRectangle*>& elements) {
786 for (const auto& rect : elements) { 772 for (const auto& rect : elements) {
787 Rectf copy_rect; 773 Rectf copy_rect;
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 895
910 void VrShellGl::OnResume() { 896 void VrShellGl::OnResume() {
911 gvr_api_->RefreshViewerProfile(); 897 gvr_api_->RefreshViewerProfile();
912 gvr_api_->ResumeTracking(); 898 gvr_api_->ResumeTracking();
913 controller_->OnResume(); 899 controller_->OnResume();
914 draw_task_.Reset(base::Bind(&VrShellGl::DrawFrame, base::Unretained(this))); 900 draw_task_.Reset(base::Bind(&VrShellGl::DrawFrame, base::Unretained(this)));
915 ScheduleNextDrawFrame(); 901 ScheduleNextDrawFrame();
916 } 902 }
917 903
918 void VrShellGl::SetWebVrMode(bool enabled) { 904 void VrShellGl::SetWebVrMode(bool enabled) {
919 if (enabled) { 905 web_vr_mode_ = enabled;
920 vr_shell_->GetUiInterface()->SetMode(UiInterface::Mode::WEB_VR);
921 } else {
922 vr_shell_->GetUiInterface()->SetMode(UiInterface::Mode::STANDARD);
923 }
924 } 906 }
925 907
926 void VrShellGl::UpdateWebVRTextureBounds(const gvr::Rectf& left_bounds, 908 void VrShellGl::UpdateWebVRTextureBounds(const gvr::Rectf& left_bounds,
927 const gvr::Rectf& right_bounds) { 909 const gvr::Rectf& right_bounds) {
928 webvr_left_viewport_->SetSourceUv(left_bounds); 910 webvr_left_viewport_->SetSourceUv(left_bounds);
929 webvr_right_viewport_->SetSourceUv(right_bounds); 911 webvr_right_viewport_->SetSourceUv(right_bounds);
930 } 912 }
931 913
932 gvr::GvrApi* VrShellGl::gvr_api() { 914 gvr::GvrApi* VrShellGl::gvr_api() {
933 return gvr_api_.get(); 915 return gvr_api_.get();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 void VrShellGl::ForceExitVr() { 968 void VrShellGl::ForceExitVr() {
987 main_thread_task_runner_->PostTask( 969 main_thread_task_runner_->PostTask(
988 FROM_HERE, base::Bind(&VrShell::ForceExitVr, weak_vr_shell_)); 970 FROM_HERE, base::Bind(&VrShell::ForceExitVr, weak_vr_shell_));
989 } 971 }
990 972
991 void VrShellGl::UpdateScene(std::unique_ptr<base::ListValue> commands) { 973 void VrShellGl::UpdateScene(std::unique_ptr<base::ListValue> commands) {
992 scene_->HandleCommands(std::move(commands), TimeInMicroseconds()); 974 scene_->HandleCommands(std::move(commands), TimeInMicroseconds());
993 } 975 }
994 976
995 } // namespace vr_shell 977 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell_gl.h ('k') | device/vr/android/gvr/gvr_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698