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

Unified Diff: chrome/browser/android/vr_shell/vr_shell.cc

Issue 2658643003: Refactor GvrDelegate ownership into GvrDelegateProvider and fix more threading violations. (Closed)
Patch Set: cleanup Created 3 years, 11 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 side-by-side diff with in-line comments
Download patch
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));
}

Powered by Google App Engine
This is Rietveld 408576698