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.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 <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "chrome/browser/android/vr_shell/vr_web_contents_observer.h" | 29 #include "chrome/browser/android/vr_shell/vr_web_contents_observer.h" |
30 #include "content/public/browser/navigation_controller.h" | 30 #include "content/public/browser/navigation_controller.h" |
31 #include "content/public/browser/render_view_host.h" | 31 #include "content/public/browser/render_view_host.h" |
32 #include "content/public/browser/render_widget_host.h" | 32 #include "content/public/browser/render_widget_host.h" |
33 #include "content/public/browser/render_widget_host_view.h" | 33 #include "content/public/browser/render_widget_host_view.h" |
34 #include "content/public/browser/web_contents.h" | 34 #include "content/public/browser/web_contents.h" |
35 #include "content/public/common/content_features.h" | 35 #include "content/public/common/content_features.h" |
36 #include "content/public/common/referrer.h" | 36 #include "content/public/common/referrer.h" |
37 #include "device/vr/android/gvr/gvr_device.h" | 37 #include "device/vr/android/gvr/gvr_device.h" |
38 #include "device/vr/android/gvr/gvr_device_provider.h" | 38 #include "device/vr/android/gvr/gvr_device_provider.h" |
| 39 #include "gpu/command_buffer/common/mailbox.h" |
39 #include "jni/VrShellImpl_jni.h" | 40 #include "jni/VrShellImpl_jni.h" |
40 #include "third_party/WebKit/public/platform/WebInputEvent.h" | 41 #include "third_party/WebKit/public/platform/WebInputEvent.h" |
41 #include "ui/android/view_android.h" | 42 #include "ui/android/view_android.h" |
42 #include "ui/android/window_android.h" | 43 #include "ui/android/window_android.h" |
43 #include "ui/base/page_transition_types.h" | 44 #include "ui/base/page_transition_types.h" |
44 #include "ui/display/display.h" | 45 #include "ui/display/display.h" |
45 #include "ui/display/screen.h" | 46 #include "ui/display/screen.h" |
46 #include "ui/gfx/transform.h" | 47 #include "ui/gfx/transform.h" |
47 #include "ui/gfx/transform_util.h" | 48 #include "ui/gfx/transform_util.h" |
48 | 49 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 ui_contents_->GetController().LoadURL( | 164 ui_contents_->GetController().LoadURL( |
164 url, content::Referrer(), | 165 url, content::Referrer(), |
165 ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string("")); | 166 ui::PageTransition::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string("")); |
166 } | 167 } |
167 | 168 |
168 bool RegisterVrShell(JNIEnv* env) { | 169 bool RegisterVrShell(JNIEnv* env) { |
169 return RegisterNativesImpl(env); | 170 return RegisterNativesImpl(env); |
170 } | 171 } |
171 | 172 |
172 VrShell::~VrShell() { | 173 VrShell::~VrShell() { |
| 174 delegate_provider_->RemoveDelegate(); |
173 { | 175 { |
174 // The GvrLayout is, and must always be, used only on the UI thread, and the | 176 // The GvrLayout is, and must always be, used only on the UI thread, and the |
175 // GvrApi used for rendering should only be used from the GL thread as it's | 177 // GvrApi used for rendering should only be used from the GL thread as it's |
176 // not thread safe. However, the GvrLayout owns the GvrApi instance, and | 178 // not thread safe. However, the GvrLayout owns the GvrApi instance, and |
177 // when it gets shut down it deletes the GvrApi instance with it. Therefore, | 179 // when it gets shut down it deletes the GvrApi instance with it. Therefore, |
178 // we need to block shutting down the GvrLayout on stopping our GL thread | 180 // we need to block shutting down the GvrLayout on stopping our GL thread |
179 // from using the GvrApi instance. | 181 // from using the GvrApi instance. |
180 // base::Thread::Stop, which is called when destroying the thread, asserts | 182 // base::Thread::Stop, which is called when destroying the thread, asserts |
181 // that IO is allowed to prevent jank, but there shouldn't be any concerns | 183 // that IO is allowed to prevent jank, but there shouldn't be any concerns |
182 // regarding jank in this case, because we're switching from 3D to 2D, | 184 // regarding jank in this case, because we're switching from 3D to 2D, |
183 // adding/removing a bunch of Java views, and probably changing device | 185 // adding/removing a bunch of Java views, and probably changing device |
184 // orientation here. | 186 // orientation here. |
185 base::ThreadRestrictions::ScopedAllowIO allow_io; | 187 base::ThreadRestrictions::ScopedAllowIO allow_io; |
186 gl_thread_.reset(); | 188 gl_thread_.reset(); |
187 } | 189 } |
188 delegate_provider_->RemoveDelegate(); | |
189 g_instance = nullptr; | 190 g_instance = nullptr; |
190 } | 191 } |
191 | 192 |
192 void VrShell::PostToGlThreadWhenReady(const base::Closure& task) { | 193 void VrShell::PostToGlThreadWhenReady(const base::Closure& task) { |
193 // TODO(mthiesse): Remove this blocking wait. Queue up events if thread isn't | 194 // TODO(mthiesse): Remove this blocking wait. Queue up events if thread isn't |
194 // finished starting? | 195 // finished starting? |
195 gl_thread_->WaitUntilThreadStarted(); | 196 gl_thread_->WaitUntilThreadStarted(); |
196 gl_thread_->task_runner()->PostTask(FROM_HERE, task); | 197 gl_thread_->task_runner()->PostTask(FROM_HERE, task); |
197 } | 198 } |
198 | 199 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 } | 265 } |
265 | 266 |
266 void VrShell::SetWebVrMode(JNIEnv* env, | 267 void VrShell::SetWebVrMode(JNIEnv* env, |
267 const base::android::JavaParamRef<jobject>& obj, | 268 const base::android::JavaParamRef<jobject>& obj, |
268 bool enabled) { | 269 bool enabled) { |
269 webvr_mode_ = enabled; | 270 webvr_mode_ = enabled; |
270 if (metrics_helper_) | 271 if (metrics_helper_) |
271 metrics_helper_->SetWebVREnabled(enabled); | 272 metrics_helper_->SetWebVREnabled(enabled); |
272 PostToGlThreadWhenReady(base::Bind(&VrShellGl::SetWebVrMode, | 273 PostToGlThreadWhenReady(base::Bind(&VrShellGl::SetWebVrMode, |
273 gl_thread_->GetVrShellGl(), enabled)); | 274 gl_thread_->GetVrShellGl(), enabled)); |
| 275 |
274 html_interface_->SetMode(enabled ? UiInterface::Mode::WEB_VR | 276 html_interface_->SetMode(enabled ? UiInterface::Mode::WEB_VR |
275 : UiInterface::Mode::STANDARD); | 277 : UiInterface::Mode::STANDARD); |
276 } | 278 } |
277 | 279 |
278 void VrShell::OnLoadProgressChanged(JNIEnv* env, | 280 void VrShell::OnLoadProgressChanged(JNIEnv* env, |
279 const JavaParamRef<jobject>& obj, | 281 const JavaParamRef<jobject>& obj, |
280 double progress) { | 282 double progress) { |
281 html_interface_->SetLoadProgress(progress); | 283 html_interface_->SetLoadProgress(progress); |
282 } | 284 } |
283 | 285 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 jboolean incognito, | 319 jboolean incognito, |
318 jint id) { | 320 jint id) { |
319 html_interface_->RemoveTab(incognito, id); | 321 html_interface_->RemoveTab(incognito, id); |
320 } | 322 } |
321 | 323 |
322 void VrShell::SetWebVRSecureOrigin(bool secure_origin) { | 324 void VrShell::SetWebVRSecureOrigin(bool secure_origin) { |
323 // TODO(cjgrant): Align this state with the logic that drives the omnibox. | 325 // TODO(cjgrant): Align this state with the logic that drives the omnibox. |
324 html_interface_->SetWebVRSecureOrigin(secure_origin); | 326 html_interface_->SetWebVRSecureOrigin(secure_origin); |
325 } | 327 } |
326 | 328 |
327 void VrShell::SubmitWebVRFrame() {} | 329 void VrShell::SubmitWebVRFrame(int16_t frame_index, |
| 330 const gpu::MailboxHolder& mailbox) { |
| 331 TRACE_EVENT1("gpu", "SubmitWebVRFrame", "frame", frame_index); |
| 332 |
| 333 PostToGlThreadWhenReady(base::Bind(&VrShellGl::SubmitWebVRFrame, |
| 334 gl_thread_->GetVrShellGl(), frame_index, |
| 335 mailbox)); |
| 336 } |
328 | 337 |
329 void VrShell::UpdateWebVRTextureBounds(int16_t frame_index, | 338 void VrShell::UpdateWebVRTextureBounds(int16_t frame_index, |
330 const gvr::Rectf& left_bounds, | 339 const gvr::Rectf& left_bounds, |
331 const gvr::Rectf& right_bounds) { | 340 const gvr::Rectf& right_bounds, |
| 341 const gvr::Sizei& source_size) { |
332 PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds, | 342 PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds, |
333 gl_thread_->GetVrShellGl(), frame_index, | 343 gl_thread_->GetVrShellGl(), frame_index, |
334 left_bounds, right_bounds)); | 344 left_bounds, right_bounds, source_size)); |
335 } | 345 } |
336 | 346 |
337 bool VrShell::SupportsPresentation() { | 347 bool VrShell::SupportsPresentation() { |
338 return true; | 348 return true; |
339 } | 349 } |
340 | 350 |
341 void VrShell::ResetPose() { | 351 void VrShell::ResetPose() { |
342 gl_thread_->task_runner()->PostTask( | 352 gl_thread_->task_runner()->PostTask( |
343 FROM_HERE, base::Bind(&VrShellGl::ResetPose, gl_thread_->GetVrShellGl())); | 353 FROM_HERE, base::Bind(&VrShellGl::ResetPose, gl_thread_->GetVrShellGl())); |
344 } | 354 } |
(...skipping 26 matching lines...) Expand all Loading... |
371 } | 381 } |
372 | 382 |
373 void VrShell::ContentSurfaceChanged(jobject surface) { | 383 void VrShell::ContentSurfaceChanged(jobject surface) { |
374 content_surface_ = surface; | 384 content_surface_ = surface; |
375 content_compositor_->SurfaceChanged(surface); | 385 content_compositor_->SurfaceChanged(surface); |
376 JNIEnv* env = base::android::AttachCurrentThread(); | 386 JNIEnv* env = base::android::AttachCurrentThread(); |
377 Java_VrShellImpl_contentSurfaceChanged(env, j_vr_shell_.obj()); | 387 Java_VrShellImpl_contentSurfaceChanged(env, j_vr_shell_.obj()); |
378 } | 388 } |
379 | 389 |
380 void VrShell::GvrDelegateReady() { | 390 void VrShell::GvrDelegateReady() { |
| 391 PostToGlThreadWhenReady(base::Bind( |
| 392 &VrShellGl::SetSubmitClient, gl_thread_->GetVrShellGl(), |
| 393 base::Passed( |
| 394 delegate_provider_->TakeSubmitFrameClient().PassInterface()))); |
381 delegate_provider_->SetDelegate(this, gvr_api_); | 395 delegate_provider_->SetDelegate(this, gvr_api_); |
382 } | 396 } |
383 | 397 |
384 void VrShell::AppButtonPressed() { | 398 void VrShell::AppButtonPressed() { |
385 if (vr_shell_enabled_) | 399 if (vr_shell_enabled_) |
386 html_interface_->HandleAppButtonClicked(); | 400 html_interface_->HandleAppButtonClicked(); |
387 } | 401 } |
388 | 402 |
389 void VrShell::ContentPhysicalBoundsChanged(JNIEnv* env, | 403 void VrShell::ContentPhysicalBoundsChanged(JNIEnv* env, |
390 const JavaParamRef<jobject>& object, | 404 const JavaParamRef<jobject>& object, |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 pose->position.value()[0] = decomposed_transform.translate[0]; | 630 pose->position.value()[0] = decomposed_transform.translate[0]; |
617 pose->position.value()[1] = decomposed_transform.translate[1]; | 631 pose->position.value()[1] = decomposed_transform.translate[1]; |
618 pose->position.value()[2] = decomposed_transform.translate[2]; | 632 pose->position.value()[2] = decomposed_transform.translate[2]; |
619 } | 633 } |
620 | 634 |
621 return pose; | 635 return pose; |
622 } | 636 } |
623 | 637 |
624 device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo( | 638 device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo( |
625 gvr::GvrApi* gvr_api, | 639 gvr::GvrApi* gvr_api, |
626 gvr::Sizei compositor_size, | 640 gvr::Sizei recommended_size, |
627 uint32_t device_id) { | 641 uint32_t device_id) { |
628 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); | 642 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); |
629 | 643 |
630 device::mojom::VRDisplayInfoPtr device = device::mojom::VRDisplayInfo::New(); | 644 device::mojom::VRDisplayInfoPtr device = device::mojom::VRDisplayInfo::New(); |
631 | 645 |
632 device->index = device_id; | 646 device->index = device_id; |
633 | 647 |
634 device->capabilities = device::mojom::VRDisplayCapabilities::New(); | 648 device->capabilities = device::mojom::VRDisplayCapabilities::New(); |
635 device->capabilities->hasOrientation = true; | 649 device->capabilities->hasOrientation = true; |
636 device->capabilities->hasPosition = false; | 650 device->capabilities->hasPosition = false; |
637 device->capabilities->hasExternalDisplay = false; | 651 device->capabilities->hasExternalDisplay = false; |
638 device->capabilities->canPresent = true; | 652 device->capabilities->canPresent = true; |
639 | 653 |
640 std::string vendor = gvr_api->GetViewerVendor(); | 654 std::string vendor = gvr_api->GetViewerVendor(); |
641 std::string model = gvr_api->GetViewerModel(); | 655 std::string model = gvr_api->GetViewerModel(); |
642 device->displayName = vendor + " " + model; | 656 device->displayName = vendor + " " + model; |
643 | 657 |
644 gvr::BufferViewportList gvr_buffer_viewports = | 658 gvr::BufferViewportList gvr_buffer_viewports = |
645 gvr_api->CreateEmptyBufferViewportList(); | 659 gvr_api->CreateEmptyBufferViewportList(); |
646 gvr_buffer_viewports.SetToRecommendedBufferViewports(); | 660 gvr_buffer_viewports.SetToRecommendedBufferViewports(); |
647 | 661 |
648 device->leftEye = device::mojom::VREyeParameters::New(); | 662 device->leftEye = device::mojom::VREyeParameters::New(); |
649 device->rightEye = device::mojom::VREyeParameters::New(); | 663 device->rightEye = device::mojom::VREyeParameters::New(); |
650 for (auto eye : {GVR_LEFT_EYE, GVR_RIGHT_EYE}) { | 664 for (auto eye : {GVR_LEFT_EYE, GVR_RIGHT_EYE}) { |
651 device::mojom::VREyeParametersPtr& eye_params = | 665 device::mojom::VREyeParametersPtr& eye_params = |
652 (eye == GVR_LEFT_EYE) ? device->leftEye : device->rightEye; | 666 (eye == GVR_LEFT_EYE) ? device->leftEye : device->rightEye; |
653 eye_params->fieldOfView = device::mojom::VRFieldOfView::New(); | 667 eye_params->fieldOfView = device::mojom::VRFieldOfView::New(); |
654 eye_params->offset.resize(3); | 668 eye_params->offset.resize(3); |
655 eye_params->renderWidth = compositor_size.width / 2; | 669 eye_params->renderWidth = recommended_size.width / 2; |
656 eye_params->renderHeight = compositor_size.height; | 670 eye_params->renderHeight = recommended_size.height; |
657 | 671 |
658 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); | 672 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); |
659 gvr_buffer_viewports.GetBufferViewport(eye, &eye_viewport); | 673 gvr_buffer_viewports.GetBufferViewport(eye, &eye_viewport); |
660 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); | 674 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); |
661 eye_params->fieldOfView->upDegrees = eye_fov.top; | 675 eye_params->fieldOfView->upDegrees = eye_fov.top; |
662 eye_params->fieldOfView->downDegrees = eye_fov.bottom; | 676 eye_params->fieldOfView->downDegrees = eye_fov.bottom; |
663 eye_params->fieldOfView->leftDegrees = eye_fov.left; | 677 eye_params->fieldOfView->leftDegrees = eye_fov.left; |
664 eye_params->fieldOfView->rightDegrees = eye_fov.right; | 678 eye_params->fieldOfView->rightDegrees = eye_fov.right; |
665 | 679 |
666 gvr::Mat4f eye_mat = gvr_api->GetEyeFromHeadMatrix(eye); | 680 gvr::Mat4f eye_mat = gvr_api->GetEyeFromHeadMatrix(eye); |
(...skipping 20 matching lines...) Expand all Loading... |
687 jboolean reprojected_rendering) { | 701 jboolean reprojected_rendering) { |
688 return reinterpret_cast<intptr_t>(new VrShell( | 702 return reinterpret_cast<intptr_t>(new VrShell( |
689 env, obj, reinterpret_cast<ui::WindowAndroid*>(content_window_android), | 703 env, obj, reinterpret_cast<ui::WindowAndroid*>(content_window_android), |
690 content::WebContents::FromJavaWebContents(ui_web_contents), | 704 content::WebContents::FromJavaWebContents(ui_web_contents), |
691 reinterpret_cast<ui::WindowAndroid*>(ui_window_android), for_web_vr, | 705 reinterpret_cast<ui::WindowAndroid*>(ui_window_android), for_web_vr, |
692 VrShellDelegate::GetNativeVrShellDelegate(env, delegate), | 706 VrShellDelegate::GetNativeVrShellDelegate(env, delegate), |
693 reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering)); | 707 reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering)); |
694 } | 708 } |
695 | 709 |
696 } // namespace vr_shell | 710 } // namespace vr_shell |
OLD | NEW |