Chromium Code Reviews| Index: chrome/browser/android/vr_shell/vr_shell.cc |
| diff --git a/chrome/browser/android/vr_shell/vr_shell.cc b/chrome/browser/android/vr_shell/vr_shell.cc |
| index 56a91e0115c92c8b85c91580b724406e1d8bd625..9dcfd22c590f761caa75a538e14f56b825ab9652 100644 |
| --- a/chrome/browser/android/vr_shell/vr_shell.cc |
| +++ b/chrome/browser/android/vr_shell/vr_shell.cc |
| @@ -26,6 +26,7 @@ |
| #include "content/public/browser/render_widget_host_view.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/common/referrer.h" |
| +#include "device/vr/android/gvr/gvr_device.h" |
| #include "device/vr/android/gvr/gvr_device_provider.h" |
| #include "jni/VrShellImpl_jni.h" |
| #include "ui/android/view_android.h" |
| @@ -67,6 +68,7 @@ VrShell::VrShell(JNIEnv* env, |
| metrics_helper_(new VrMetricsHelper(main_contents_)), |
| main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| reprojected_rendering_(reprojected_rendering), |
| + gvr_api_(gvr_api), |
| weak_ptr_factory_(this) { |
| DCHECK(g_instance == nullptr); |
| g_instance = this; |
| @@ -215,16 +217,6 @@ void VrShell::OnLoadProgressChanged( |
| html_interface_->SetLoadProgress(progress); |
| } |
| -void VrShell::SetWebVRRenderSurfaceSize(int width, int height) { |
| - // TODO(klausw,crbug.com/655722): Change the GVR render size and set the WebVR |
| - // render surface size. |
| -} |
| - |
| -gvr::Sizei VrShell::GetWebVRCompositorSurfaceSize() { |
| - const gfx::Size& size = content_compositor_->GetWindowBounds(); |
| - return {size.width(), size.height()}; |
| -} |
| - |
| void VrShell::SetWebVRSecureOrigin(bool secure_origin) { |
| // TODO(cjgrant): Align this state with the logic that drives the omnibox. |
| html_interface_->SetWebVRSecureOrigin(secure_origin); |
| @@ -240,14 +232,21 @@ void VrShell::UpdateWebVRTextureBounds(int16_t frame_index, |
| left_bounds, right_bounds)); |
| } |
| -// TODO(mthiesse): Do not expose GVR API outside of GL thread. |
| -// It's not thread-safe. |
| -gvr::GvrApi* VrShell::gvr_api() { |
| - if (gl_thread_->GetVrShellGlUnsafe()) { |
| - return gl_thread_->GetVrShellGlUnsafe()->gvr_api(); |
| - } |
| - CHECK(false); |
| - return nullptr; |
| +bool VrShell::SupportsPresentation() { |
| + return true; |
| +} |
| + |
| +void VrShell::ResetPose() { |
| + gl_thread_->task_runner()->PostTask( |
| + FROM_HERE, base::Bind(&VrShellGl::ResetPose, gl_thread_->GetVrShellGl())); |
| +} |
| + |
| +void VrShell::CreateVRDisplayInfo( |
| + const base::Callback<void(device::mojom::VRDisplayInfoPtr)>& callback, |
| + uint32_t device_id) { |
| + PostToGlThreadWhenReady(base::Bind(&VrShellGl::CreateVRDisplayInfo, |
| + gl_thread_->GetVrShellGl(), |
| + callback, device_id)); |
| } |
| void VrShell::SurfacesChanged(jobject content_surface, jobject ui_surface) { |
| @@ -256,7 +255,7 @@ void VrShell::SurfacesChanged(jobject content_surface, jobject ui_surface) { |
| } |
| void VrShell::GvrDelegateReady() { |
| - delegate_provider_->SetDelegate(this); |
| + delegate_provider_->SetDelegate(this, gvr_api_); |
| } |
| void VrShell::AppButtonPressed() { |
| @@ -268,9 +267,9 @@ void VrShell::AppButtonPressed() { |
| if (html_interface_->GetMode() == UiInterface::Mode::WEB_VR) { |
| if (delegate_provider_->device_provider()) { |
| if (html_interface_->GetMenuMode()) { |
| - delegate_provider_->device_provider()->OnDisplayBlur(); |
| + delegate_provider_->device_provider()->Device()->OnBlur(); |
| } else { |
| - delegate_provider_->device_provider()->OnDisplayFocus(); |
| + delegate_provider_->device_provider()->Device()->OnFocus(); |
| } |
| } |
| } |
| @@ -442,6 +441,72 @@ device::mojom::VRPosePtr VrShell::VRPosePtrFromGvrPose(gvr::Mat4f head_mat) { |
| return pose; |
| } |
| +device::mojom::VRDisplayInfoPtr VrShell::CreateVRDisplayInfo( |
| + gvr::GvrApi* gvr_api, gvr::Sizei compositor_size, uint32_t device_id) { |
| + TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); |
| + |
| + device::mojom::VRDisplayInfoPtr device = device::mojom::VRDisplayInfo::New(); |
| + |
| + device->index = device_id; |
| + |
| + device->capabilities = device::mojom::VRDisplayCapabilities::New(); |
| + device->capabilities->hasOrientation = true; |
| + device->capabilities->hasPosition = false; |
| + device->capabilities->hasExternalDisplay = false; |
| + device->capabilities->canPresent = true; |
| + |
| + device->leftEye = device::mojom::VREyeParameters::New(); |
| + device->rightEye = device::mojom::VREyeParameters::New(); |
| + device::mojom::VREyeParametersPtr& left_eye = device->leftEye; |
| + device::mojom::VREyeParametersPtr& right_eye = device->rightEye; |
| + |
| + left_eye->fieldOfView = device::mojom::VRFieldOfView::New(); |
| + right_eye->fieldOfView = device::mojom::VRFieldOfView::New(); |
| + |
| + left_eye->offset.resize(3); |
| + right_eye->offset.resize(3); |
| + left_eye->renderWidth = compositor_size.width / 2; |
| + left_eye->renderHeight = compositor_size.height; |
| + right_eye->renderWidth = left_eye->renderWidth; |
| + right_eye->renderHeight = left_eye->renderHeight; |
| + |
| + std::string vendor = gvr_api->GetViewerVendor(); |
| + std::string model = gvr_api->GetViewerModel(); |
| + device->displayName = vendor + " " + model; |
| + |
| + gvr::BufferViewportList gvr_buffer_viewports = |
| + gvr_api->CreateEmptyBufferViewportList(); |
| + gvr_buffer_viewports.SetToRecommendedBufferViewports(); |
| + |
| + gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); |
|
cjgrant
2017/01/25 21:45:31
Looking at the near-duplicate blocks for left and
mthiesse
2017/01/30 19:47:26
Good eye ;)
|
| + gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport); |
| + gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); |
| + left_eye->fieldOfView->upDegrees = eye_fov.top; |
| + left_eye->fieldOfView->downDegrees = eye_fov.bottom; |
| + left_eye->fieldOfView->leftDegrees = eye_fov.left; |
| + left_eye->fieldOfView->rightDegrees = eye_fov.right; |
| + |
| + eye_viewport = gvr_api->CreateBufferViewport(); |
| + gvr_buffer_viewports.GetBufferViewport(GVR_RIGHT_EYE, &eye_viewport); |
| + eye_fov = eye_viewport.GetSourceFov(); |
| + right_eye->fieldOfView->upDegrees = eye_fov.top; |
| + right_eye->fieldOfView->downDegrees = eye_fov.bottom; |
| + right_eye->fieldOfView->leftDegrees = eye_fov.left; |
| + right_eye->fieldOfView->rightDegrees = eye_fov.right; |
| + |
| + gvr::Mat4f left_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_LEFT_EYE); |
| + left_eye->offset[0] = -left_eye_mat.m[0][3]; |
| + left_eye->offset[1] = -left_eye_mat.m[1][3]; |
| + left_eye->offset[2] = -left_eye_mat.m[2][3]; |
| + |
| + gvr::Mat4f right_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_RIGHT_EYE); |
| + right_eye->offset[0] = -right_eye_mat.m[0][3]; |
| + right_eye->offset[1] = -right_eye_mat.m[1][3]; |
| + right_eye->offset[2] = -right_eye_mat.m[2][3]; |
| + |
| + return device; |
| +} |
| + |
| // ---------------------------------------------------------------------------- |
| // Native JNI methods |
| // ---------------------------------------------------------------------------- |
| @@ -458,7 +523,7 @@ jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj, |
| reinterpret_cast<ui::WindowAndroid*>(content_window_android), |
| content::WebContents::FromJavaWebContents(ui_web_contents), |
| reinterpret_cast<ui::WindowAndroid*>(ui_window_android), |
| - for_web_vr, VrShellDelegate::GetNativeDelegate(env, delegate), |
| + for_web_vr, VrShellDelegate::GetNativeVrShellDelegate(env, delegate), |
| reinterpret_cast<gvr_context*>(gvr_api), reprojected_rendering)); |
| } |