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

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

Issue 2738683002: WebVR compositor bypass via BrowserMain context + mailbox (Closed)
Patch Set: Less hacked up version Created 3 years, 9 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 <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 18 matching lines...) Expand all
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 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
317 jboolean incognito, 318 jboolean incognito,
318 jint id) { 319 jint id) {
319 html_interface_->RemoveTab(incognito, id); 320 html_interface_->RemoveTab(incognito, id);
320 } 321 }
321 322
322 void VrShell::SetWebVRSecureOrigin(bool secure_origin) { 323 void VrShell::SetWebVRSecureOrigin(bool secure_origin) {
323 // TODO(cjgrant): Align this state with the logic that drives the omnibox. 324 // TODO(cjgrant): Align this state with the logic that drives the omnibox.
324 html_interface_->SetWebVRSecureOrigin(secure_origin); 325 html_interface_->SetWebVRSecureOrigin(secure_origin);
325 } 326 }
326 327
327 void VrShell::SubmitWebVRFrame() {} 328 void VrShell::SubmitWebVRFrame(
329 int16_t frame_index,
330 const gpu::MailboxHolder& mailbox,
331 device::mojom::VRSubmitFrameClientPtr submit_client) {
332 TRACE_EVENT1("gpu", "SubmitWebVRFrame", "frame", frame_index);
333
334 // Save the submit completion client for later, we'll call the
335 // next lifecycle stages on it later. Use extra boolean maps
336 // to track when they get called since they could potentially
337 // be out of order, do cleanup once both were called.
338 webvr_submit_clients_.insert(
339 std::make_pair(frame_index, std::move(submit_client)));
340 webvr_submit_client_transferring_.insert({frame_index, true});
341 webvr_submit_client_rendering_.insert({frame_index, true});
342
343 PostToGlThreadWhenReady(base::Bind(&VrShellGl::SubmitWebVRFrame,
344 gl_thread_->GetVrShellGl(), frame_index,
345 mailbox));
346 }
347
348 void VrShell::OnSubmitWebVRFrameTransferred(int frame_index) {
349 DCHECK(webvr_submit_clients_.find(frame_index) !=
350 webvr_submit_clients_.end());
351 webvr_submit_clients_[frame_index]->OnSubmitFrameTransferred();
352 webvr_submit_client_transferring_[frame_index] = false;
353 if (!webvr_submit_client_rendering_[frame_index]) {
354 webvr_submit_clients_.erase(frame_index);
355 webvr_submit_client_transferring_.erase(frame_index);
356 webvr_submit_client_rendering_.erase(frame_index);
357 }
358 }
359
360 void VrShell::OnSubmitWebVRFrameRendered(int frame_index) {
361 DCHECK(webvr_submit_clients_.find(frame_index) !=
362 webvr_submit_clients_.end());
363 webvr_submit_clients_[frame_index]->OnSubmitFrameRendered();
364 webvr_submit_client_rendering_[frame_index] = false;
365 if (!webvr_submit_client_transferring_[frame_index]) {
366 webvr_submit_clients_.erase(frame_index);
367 webvr_submit_client_transferring_.erase(frame_index);
368 webvr_submit_client_rendering_.erase(frame_index);
369 }
370 }
328 371
329 void VrShell::UpdateWebVRTextureBounds(int16_t frame_index, 372 void VrShell::UpdateWebVRTextureBounds(int16_t frame_index,
330 const gvr::Rectf& left_bounds, 373 const gvr::Rectf& left_bounds,
331 const gvr::Rectf& right_bounds) { 374 const gvr::Rectf& right_bounds,
375 const gvr::Sizei& source_size) {
332 PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds, 376 PostToGlThreadWhenReady(base::Bind(&VrShellGl::UpdateWebVRTextureBounds,
333 gl_thread_->GetVrShellGl(), frame_index, 377 gl_thread_->GetVrShellGl(), frame_index,
334 left_bounds, right_bounds)); 378 left_bounds, right_bounds, source_size));
335 } 379 }
336 380
337 bool VrShell::SupportsPresentation() { 381 bool VrShell::SupportsPresentation() {
338 return true; 382 return true;
339 } 383 }
340 384
341 void VrShell::ResetPose() { 385 void VrShell::ResetPose() {
342 gl_thread_->task_runner()->PostTask( 386 gl_thread_->task_runner()->PostTask(
343 FROM_HERE, base::Bind(&VrShellGl::ResetPose, gl_thread_->GetVrShellGl())); 387 FROM_HERE, base::Bind(&VrShellGl::ResetPose, gl_thread_->GetVrShellGl()));
344 } 388 }
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 pose->position.value()[0] = decomposed_transform.translate[0]; 660 pose->position.value()[0] = decomposed_transform.translate[0];
617 pose->position.value()[1] = decomposed_transform.translate[1]; 661 pose->position.value()[1] = decomposed_transform.translate[1];
618 pose->position.value()[2] = decomposed_transform.translate[2]; 662 pose->position.value()[2] = decomposed_transform.translate[2];
619 } 663 }
620 664
621 return pose; 665 return pose;
622 } 666 }
623 667
624 device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo( 668 device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo(
625 gvr::GvrApi* gvr_api, 669 gvr::GvrApi* gvr_api,
626 gvr::Sizei compositor_size, 670 gvr::Sizei recommended_size,
627 uint32_t device_id) { 671 uint32_t device_id) {
628 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); 672 TRACE_EVENT0("input", "GvrDevice::GetVRDevice");
629 673
630 device::mojom::VRDisplayInfoPtr device = device::mojom::VRDisplayInfo::New(); 674 device::mojom::VRDisplayInfoPtr device = device::mojom::VRDisplayInfo::New();
631 675
632 device->index = device_id; 676 device->index = device_id;
633 677
634 device->capabilities = device::mojom::VRDisplayCapabilities::New(); 678 device->capabilities = device::mojom::VRDisplayCapabilities::New();
635 device->capabilities->hasOrientation = true; 679 device->capabilities->hasOrientation = true;
636 device->capabilities->hasPosition = false; 680 device->capabilities->hasPosition = false;
637 device->capabilities->hasExternalDisplay = false; 681 device->capabilities->hasExternalDisplay = false;
638 device->capabilities->canPresent = true; 682 device->capabilities->canPresent = true;
639 683
640 std::string vendor = gvr_api->GetViewerVendor(); 684 std::string vendor = gvr_api->GetViewerVendor();
641 std::string model = gvr_api->GetViewerModel(); 685 std::string model = gvr_api->GetViewerModel();
642 device->displayName = vendor + " " + model; 686 device->displayName = vendor + " " + model;
643 687
644 gvr::BufferViewportList gvr_buffer_viewports = 688 gvr::BufferViewportList gvr_buffer_viewports =
645 gvr_api->CreateEmptyBufferViewportList(); 689 gvr_api->CreateEmptyBufferViewportList();
646 gvr_buffer_viewports.SetToRecommendedBufferViewports(); 690 gvr_buffer_viewports.SetToRecommendedBufferViewports();
647 691
648 device->leftEye = device::mojom::VREyeParameters::New(); 692 device->leftEye = device::mojom::VREyeParameters::New();
649 device->rightEye = device::mojom::VREyeParameters::New(); 693 device->rightEye = device::mojom::VREyeParameters::New();
650 for (auto eye : {GVR_LEFT_EYE, GVR_RIGHT_EYE}) { 694 for (auto eye : {GVR_LEFT_EYE, GVR_RIGHT_EYE}) {
651 device::mojom::VREyeParametersPtr& eye_params = 695 device::mojom::VREyeParametersPtr& eye_params =
652 (eye == GVR_LEFT_EYE) ? device->leftEye : device->rightEye; 696 (eye == GVR_LEFT_EYE) ? device->leftEye : device->rightEye;
653 eye_params->fieldOfView = device::mojom::VRFieldOfView::New(); 697 eye_params->fieldOfView = device::mojom::VRFieldOfView::New();
654 eye_params->offset.resize(3); 698 eye_params->offset.resize(3);
655 eye_params->renderWidth = compositor_size.width / 2; 699 eye_params->renderWidth = recommended_size.width / 2;
656 eye_params->renderHeight = compositor_size.height; 700 eye_params->renderHeight = recommended_size.height;
657 701
658 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); 702 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport();
659 gvr_buffer_viewports.GetBufferViewport(eye, &eye_viewport); 703 gvr_buffer_viewports.GetBufferViewport(eye, &eye_viewport);
660 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); 704 gvr::Rectf eye_fov = eye_viewport.GetSourceFov();
661 eye_params->fieldOfView->upDegrees = eye_fov.top; 705 eye_params->fieldOfView->upDegrees = eye_fov.top;
662 eye_params->fieldOfView->downDegrees = eye_fov.bottom; 706 eye_params->fieldOfView->downDegrees = eye_fov.bottom;
663 eye_params->fieldOfView->leftDegrees = eye_fov.left; 707 eye_params->fieldOfView->leftDegrees = eye_fov.left;
664 eye_params->fieldOfView->rightDegrees = eye_fov.right; 708 eye_params->fieldOfView->rightDegrees = eye_fov.right;
665 709
666 gvr::Mat4f eye_mat = gvr_api->GetEyeFromHeadMatrix(eye); 710 gvr::Mat4f eye_mat = gvr_api->GetEyeFromHeadMatrix(eye);
(...skipping 20 matching lines...) Expand all
687 jboolean reprojected_rendering) { 731 jboolean reprojected_rendering) {
688 return reinterpret_cast<intptr_t>(new VrShell( 732 return reinterpret_cast<intptr_t>(new VrShell(
689 env, obj, reinterpret_cast<ui::WindowAndroid*>(content_window_android), 733 env, obj, reinterpret_cast<ui::WindowAndroid*>(content_window_android),
690 content::WebContents::FromJavaWebContents(ui_web_contents), 734 content::WebContents::FromJavaWebContents(ui_web_contents),
691 reinterpret_cast<ui::WindowAndroid*>(ui_window_android), for_web_vr, 735 reinterpret_cast<ui::WindowAndroid*>(ui_window_android), for_web_vr,
692 VrShellDelegate::GetNativeVrShellDelegate(env, delegate), 736 VrShellDelegate::GetNativeVrShellDelegate(env, delegate),
693 reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering)); 737 reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering));
694 } 738 }
695 739
696 } // namespace vr_shell 740 } // 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_command_buffer_gl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698