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

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

Issue 2658643003: Refactor GvrDelegate ownership into GvrDelegateProvider and fix more threading violations. (Closed)
Patch Set: Address comments Created 3 years, 10 months 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
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.h" 5 #include "chrome/browser/android/vr_shell/vr_shell.h"
6 6
7 #include <android/native_window_jni.h> 7 #include <android/native_window_jni.h>
8 8
9 #include "base/memory/ptr_util.h" 9 #include "base/memory/ptr_util.h"
10 #include "base/metrics/histogram_macros.h" 10 #include "base/metrics/histogram_macros.h"
11 #include "base/threading/platform_thread.h" 11 #include "base/threading/platform_thread.h"
12 #include "base/threading/thread.h" 12 #include "base/threading/thread.h"
13 #include "base/threading/thread_restrictions.h" 13 #include "base/threading/thread_restrictions.h"
14 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
15 #include "base/values.h" 15 #include "base/values.h"
16 #include "chrome/browser/android/vr_shell/ui_interface.h" 16 #include "chrome/browser/android/vr_shell/ui_interface.h"
17 #include "chrome/browser/android/vr_shell/vr_compositor.h" 17 #include "chrome/browser/android/vr_shell/vr_compositor.h"
18 #include "chrome/browser/android/vr_shell/vr_gl_thread.h" 18 #include "chrome/browser/android/vr_shell/vr_gl_thread.h"
19 #include "chrome/browser/android/vr_shell/vr_input_manager.h" 19 #include "chrome/browser/android/vr_shell/vr_input_manager.h"
20 #include "chrome/browser/android/vr_shell/vr_shell_delegate.h" 20 #include "chrome/browser/android/vr_shell/vr_shell_delegate.h"
21 #include "chrome/browser/android/vr_shell/vr_shell_gl.h" 21 #include "chrome/browser/android/vr_shell/vr_shell_gl.h"
22 #include "chrome/browser/android/vr_shell/vr_usage_monitor.h" 22 #include "chrome/browser/android/vr_shell/vr_usage_monitor.h"
23 #include "chrome/browser/android/vr_shell/vr_web_contents_observer.h" 23 #include "chrome/browser/android/vr_shell/vr_web_contents_observer.h"
24 #include "content/public/browser/navigation_controller.h" 24 #include "content/public/browser/navigation_controller.h"
25 #include "content/public/browser/render_view_host.h" 25 #include "content/public/browser/render_view_host.h"
26 #include "content/public/browser/render_widget_host.h" 26 #include "content/public/browser/render_widget_host.h"
27 #include "content/public/browser/render_widget_host_view.h" 27 #include "content/public/browser/render_widget_host_view.h"
28 #include "content/public/browser/web_contents.h" 28 #include "content/public/browser/web_contents.h"
29 #include "content/public/common/referrer.h" 29 #include "content/public/common/referrer.h"
30 #include "device/vr/android/gvr/gvr_device.h"
30 #include "device/vr/android/gvr/gvr_device_provider.h" 31 #include "device/vr/android/gvr/gvr_device_provider.h"
31 #include "jni/VrShellImpl_jni.h" 32 #include "jni/VrShellImpl_jni.h"
32 #include "third_party/WebKit/public/platform/WebInputEvent.h" 33 #include "third_party/WebKit/public/platform/WebInputEvent.h"
33 #include "ui/android/view_android.h" 34 #include "ui/android/view_android.h"
34 #include "ui/android/window_android.h" 35 #include "ui/android/window_android.h"
35 #include "ui/base/page_transition_types.h" 36 #include "ui/base/page_transition_types.h"
36 #include "ui/display/display.h" 37 #include "ui/display/display.h"
37 #include "ui/display/screen.h" 38 #include "ui/display/screen.h"
38 #include "ui/gfx/transform.h" 39 #include "ui/gfx/transform.h"
39 #include "ui/gfx/transform_util.h" 40 #include "ui/gfx/transform_util.h"
(...skipping 28 matching lines...) Expand all
68 : WebContentsObserver(ui_contents), 69 : WebContentsObserver(ui_contents),
69 main_contents_(main_contents), 70 main_contents_(main_contents),
70 content_compositor_( 71 content_compositor_(
71 base::MakeUnique<VrCompositor>(content_window, false)), 72 base::MakeUnique<VrCompositor>(content_window, false)),
72 ui_contents_(ui_contents), 73 ui_contents_(ui_contents),
73 ui_compositor_(base::MakeUnique<VrCompositor>(ui_window, true)), 74 ui_compositor_(base::MakeUnique<VrCompositor>(ui_window, true)),
74 delegate_provider_(delegate), 75 delegate_provider_(delegate),
75 metrics_helper_(base::MakeUnique<VrMetricsHelper>(main_contents_)), 76 metrics_helper_(base::MakeUnique<VrMetricsHelper>(main_contents_)),
76 main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), 77 main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
77 reprojected_rendering_(reprojected_rendering), 78 reprojected_rendering_(reprojected_rendering),
79 gvr_api_(gvr_api),
78 weak_ptr_factory_(this) { 80 weak_ptr_factory_(this) {
79 DCHECK(g_instance == nullptr); 81 DCHECK(g_instance == nullptr);
80 g_instance = this; 82 g_instance = this;
81 j_vr_shell_.Reset(env, obj); 83 j_vr_shell_.Reset(env, obj);
82 84
83 content_input_manager_ = base::MakeUnique<VrInputManager>(main_contents_); 85 content_input_manager_ = base::MakeUnique<VrInputManager>(main_contents_);
84 ui_input_manager_ = base::MakeUnique<VrInputManager>(ui_contents_); 86 ui_input_manager_ = base::MakeUnique<VrInputManager>(ui_contents_);
85 87
86 content_compositor_->SetLayer(main_contents_); 88 content_compositor_->SetLayer(main_contents_);
87 ui_compositor_->SetLayer(ui_contents_); 89 ui_compositor_->SetLayer(ui_contents_);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 } 232 }
231 } 233 }
232 234
233 void VrShell::OnLoadProgressChanged( 235 void VrShell::OnLoadProgressChanged(
234 JNIEnv* env, 236 JNIEnv* env,
235 const base::android::JavaParamRef<jobject>& obj, 237 const base::android::JavaParamRef<jobject>& obj,
236 double progress) { 238 double progress) {
237 html_interface_->SetLoadProgress(progress); 239 html_interface_->SetLoadProgress(progress);
238 } 240 }
239 241
240 void VrShell::SetWebVRRenderSurfaceSize(int width, int height) {
241 // TODO(klausw,crbug.com/655722): Change the GVR render size and set the WebVR
242 // render surface size.
243 }
244
245 gvr::Sizei VrShell::GetWebVRCompositorSurfaceSize() {
246 const gfx::Size& size = content_compositor_->GetWindowBounds();
247 return {size.width(), size.height()};
248 }
249
250 void VrShell::SetWebVRSecureOrigin(bool secure_origin) { 242 void VrShell::SetWebVRSecureOrigin(bool secure_origin) {
251 // TODO(cjgrant): Align this state with the logic that drives the omnibox. 243 // TODO(cjgrant): Align this state with the logic that drives the omnibox.
252 html_interface_->SetWebVRSecureOrigin(secure_origin); 244 html_interface_->SetWebVRSecureOrigin(secure_origin);
253 } 245 }
254 246
255 void VrShell::SubmitWebVRFrame() {} 247 void VrShell::SubmitWebVRFrame() {}
256 248
257 void VrShell::UpdateWebVRTextureBounds(int16_t frame_index, 249 void VrShell::UpdateWebVRTextureBounds(int16_t frame_index,
258 const gvr::Rectf& left_bounds, 250 const gvr::Rectf& left_bounds,
259 const gvr::Rectf& right_bounds) { 251 const gvr::Rectf& right_bounds) {
260 PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds, 252 PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds,
261 gl_thread_->GetVrShellGl(), frame_index, 253 gl_thread_->GetVrShellGl(), frame_index,
262 left_bounds, right_bounds)); 254 left_bounds, right_bounds));
263 } 255 }
264 256
265 // TODO(mthiesse): Do not expose GVR API outside of GL thread. 257 bool VrShell::SupportsPresentation() {
266 // It's not thread-safe. 258 return true;
267 gvr::GvrApi* VrShell::gvr_api() { 259 }
268 if (gl_thread_->GetVrShellGlUnsafe()) { 260
269 return gl_thread_->GetVrShellGlUnsafe()->gvr_api(); 261 void VrShell::ResetPose() {
270 } 262 gl_thread_->task_runner()->PostTask(
271 CHECK(false); 263 FROM_HERE, base::Bind(&VrShellGl::ResetPose, gl_thread_->GetVrShellGl()));
272 return nullptr; 264 }
265
266 void VrShell::CreateVRDisplayInfo(
267 const base::Callback<void(device::mojom::VRDisplayInfoPtr)>& callback,
268 uint32_t device_id) {
269 PostToGlThreadWhenReady(base::Bind(&VrShellGl::CreateVRDisplayInfo,
270 gl_thread_->GetVrShellGl(),
271 callback, device_id));
273 } 272 }
274 273
275 void VrShell::SurfacesChanged(jobject content_surface, jobject ui_surface) { 274 void VrShell::SurfacesChanged(jobject content_surface, jobject ui_surface) {
276 content_compositor_->SurfaceChanged(content_surface); 275 content_compositor_->SurfaceChanged(content_surface);
277 ui_compositor_->SurfaceChanged(ui_surface); 276 ui_compositor_->SurfaceChanged(ui_surface);
278 } 277 }
279 278
280 void VrShell::GvrDelegateReady() { 279 void VrShell::GvrDelegateReady() {
281 delegate_provider_->SetDelegate(this); 280 delegate_provider_->SetDelegate(this, gvr_api_);
282 } 281 }
283 282
284 void VrShell::AppButtonPressed() { 283 void VrShell::AppButtonPressed() {
285 #if defined(ENABLE_VR_SHELL) 284 #if defined(ENABLE_VR_SHELL)
286 html_interface_->SetMenuMode(!html_interface_->GetMenuMode()); 285 html_interface_->SetMenuMode(!html_interface_->GetMenuMode());
287 286
288 // TODO(mthiesse): The page is no longer visible when in menu mode. We 287 // TODO(mthiesse): The page is no longer visible when in menu mode. We
289 // should unfocus or otherwise let it know it's hidden. 288 // should unfocus or otherwise let it know it's hidden.
290 if (html_interface_->GetMode() == UiInterface::Mode::WEB_VR) { 289 if (html_interface_->GetMode() == UiInterface::Mode::WEB_VR) {
291 if (delegate_provider_->device_provider()) { 290 if (delegate_provider_->device_provider()) {
292 if (html_interface_->GetMenuMode()) { 291 if (html_interface_->GetMenuMode()) {
293 delegate_provider_->device_provider()->OnDisplayBlur(); 292 delegate_provider_->device_provider()->Device()->OnBlur();
294 } else { 293 } else {
295 delegate_provider_->device_provider()->OnDisplayFocus(); 294 delegate_provider_->device_provider()->Device()->OnFocus();
296 } 295 }
297 } 296 }
298 } 297 }
299 #endif 298 #endif
300 } 299 }
301 300
302 void VrShell::ContentPhysicalBoundsChanged(JNIEnv* env, 301 void VrShell::ContentPhysicalBoundsChanged(JNIEnv* env,
303 const JavaParamRef<jobject>& object, 302 const JavaParamRef<jobject>& object,
304 jint width, jint height, 303 jint width, jint height,
305 jfloat dpr) { 304 jfloat dpr) {
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 472
474 pose->position.emplace(3); 473 pose->position.emplace(3);
475 pose->position.value()[0] = decomposed_transform.translate[0]; 474 pose->position.value()[0] = decomposed_transform.translate[0];
476 pose->position.value()[1] = decomposed_transform.translate[1]; 475 pose->position.value()[1] = decomposed_transform.translate[1];
477 pose->position.value()[2] = decomposed_transform.translate[2]; 476 pose->position.value()[2] = decomposed_transform.translate[2];
478 } 477 }
479 478
480 return pose; 479 return pose;
481 } 480 }
482 481
482 device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo(
483 gvr::GvrApi* gvr_api, gvr::Sizei compositor_size, uint32_t device_id) {
484 TRACE_EVENT0("input", "GvrDevice::GetVRDevice");
485
486 device::mojom::VRDisplayInfoPtr device = device::mojom::VRDisplayInfo::New();
487
488 device->index = device_id;
489
490 device->capabilities = device::mojom::VRDisplayCapabilities::New();
491 device->capabilities->hasOrientation = true;
492 device->capabilities->hasPosition = false;
493 device->capabilities->hasExternalDisplay = false;
494 device->capabilities->canPresent = true;
495
496 std::string vendor = gvr_api->GetViewerVendor();
497 std::string model = gvr_api->GetViewerModel();
498 device->displayName = vendor + " " + model;
499
500 gvr::BufferViewportList gvr_buffer_viewports =
501 gvr_api->CreateEmptyBufferViewportList();
502 gvr_buffer_viewports.SetToRecommendedBufferViewports();
503
504 device->leftEye = device::mojom::VREyeParameters::New();
505 device->rightEye = device::mojom::VREyeParameters::New();
506 for (auto eye : {GVR_LEFT_EYE, GVR_RIGHT_EYE}) {
507 device::mojom::VREyeParametersPtr& eye_params =
508 (eye == GVR_LEFT_EYE) ? device->leftEye : device->rightEye;
509 eye_params->fieldOfView = device::mojom::VRFieldOfView::New();
510 eye_params->offset.resize(3);
511 eye_params->renderWidth = compositor_size.width / 2;
512 eye_params->renderHeight = compositor_size.height;
513
514 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport();
515 gvr_buffer_viewports.GetBufferViewport(eye, &eye_viewport);
516 gvr::Rectf eye_fov = eye_viewport.GetSourceFov();
517 eye_params->fieldOfView->upDegrees = eye_fov.top;
518 eye_params->fieldOfView->downDegrees = eye_fov.bottom;
519 eye_params->fieldOfView->leftDegrees = eye_fov.left;
520 eye_params->fieldOfView->rightDegrees = eye_fov.right;
521
522 gvr::Mat4f eye_mat = gvr_api->GetEyeFromHeadMatrix(eye);
523 eye_params->offset[0] = -eye_mat.m[0][3];
524 eye_params->offset[1] = -eye_mat.m[1][3];
525 eye_params->offset[2] = -eye_mat.m[2][3];
526 }
527
528 return device;
529 }
530
483 // ---------------------------------------------------------------------------- 531 // ----------------------------------------------------------------------------
484 // Native JNI methods 532 // Native JNI methods
485 // ---------------------------------------------------------------------------- 533 // ----------------------------------------------------------------------------
486 534
487 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, 535 jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj,
488 const JavaParamRef<jobject>& content_web_contents, 536 const JavaParamRef<jobject>& content_web_contents,
489 jlong content_window_android, 537 jlong content_window_android,
490 const JavaParamRef<jobject>& ui_web_contents, 538 const JavaParamRef<jobject>& ui_web_contents,
491 jlong ui_window_android, jboolean for_web_vr, 539 jlong ui_window_android, jboolean for_web_vr,
492 const base::android::JavaParamRef<jobject>& delegate, 540 const base::android::JavaParamRef<jobject>& delegate,
493 jlong gvr_api, jboolean reprojected_rendering) { 541 jlong gvr_api, jboolean reprojected_rendering) {
494 return reinterpret_cast<intptr_t>(new VrShell( 542 return reinterpret_cast<intptr_t>(new VrShell(
495 env, obj, content::WebContents::FromJavaWebContents(content_web_contents), 543 env, obj, content::WebContents::FromJavaWebContents(content_web_contents),
496 reinterpret_cast<ui::WindowAndroid*>(content_window_android), 544 reinterpret_cast<ui::WindowAndroid*>(content_window_android),
497 content::WebContents::FromJavaWebContents(ui_web_contents), 545 content::WebContents::FromJavaWebContents(ui_web_contents),
498 reinterpret_cast<ui::WindowAndroid*>(ui_window_android), 546 reinterpret_cast<ui::WindowAndroid*>(ui_window_android),
499 for_web_vr, VrShellDelegate::GetNativeDelegate(env, delegate), 547 for_web_vr, VrShellDelegate::GetNativeVrShellDelegate(env, delegate),
500 reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering)); 548 reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering));
501 } 549 }
502 550
503 } // namespace vr_shell 551 } // namespace vr_shell
OLDNEW
« no previous file with comments | « chrome/browser/android/vr_shell/vr_shell.h ('k') | chrome/browser/android/vr_shell/vr_shell_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698