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

Unified Diff: device/vr/android/gvr/gvr_device.cc

Issue 2658643003: Refactor GvrDelegate ownership into GvrDelegateProvider and fix more threading violations. (Closed)
Patch Set: Address comments 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
« no previous file with comments | « device/vr/android/gvr/gvr_device.h ('k') | device/vr/android/gvr/gvr_device_provider.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/vr/android/gvr/gvr_device.cc
diff --git a/device/vr/android/gvr/gvr_device.cc b/device/vr/android/gvr/gvr_device.cc
index a8efa67a88130747971749e249c5c46decba54df..5abea2b03ee59a772dec257db55ae7284eb3707e 100644
--- a/device/vr/android/gvr/gvr_device.cc
+++ b/device/vr/android/gvr/gvr_device.cc
@@ -19,138 +19,25 @@
namespace device {
-GvrDevice::GvrDevice(GvrDeviceProvider* provider, GvrDelegate* delegate)
- : VRDevice(), delegate_(delegate), gvr_provider_(provider) {}
+GvrDevice::GvrDevice(GvrDeviceProvider* provider)
+ : VRDevice(), gvr_provider_(provider) {}
GvrDevice::~GvrDevice() {}
-mojom::VRDisplayInfoPtr GvrDevice::GetVRDevice() {
- TRACE_EVENT0("input", "GvrDevice::GetVRDevice");
-
- mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New();
-
- device->index = id();
-
- device->capabilities = mojom::VRDisplayCapabilities::New();
- device->capabilities->hasOrientation = true;
- device->capabilities->hasPosition = false;
- device->capabilities->hasExternalDisplay = false;
- device->capabilities->canPresent = true;
-
- device->leftEye = mojom::VREyeParameters::New();
- device->rightEye = mojom::VREyeParameters::New();
- mojom::VREyeParametersPtr& left_eye = device->leftEye;
- mojom::VREyeParametersPtr& right_eye = device->rightEye;
-
- left_eye->fieldOfView = mojom::VRFieldOfView::New();
- right_eye->fieldOfView = mojom::VRFieldOfView::New();
-
- left_eye->offset.resize(3);
- right_eye->offset.resize(3);
-
- // Set the render target size to "invalid" to indicate that
- // we can't render into it yet. Other code uses this to check
- // for valid state.
- gvr::Sizei render_target_size = kInvalidRenderTargetSize;
- left_eye->renderWidth = render_target_size.width / 2;
- left_eye->renderHeight = render_target_size.height;
-
- right_eye->renderWidth = left_eye->renderWidth;
- right_eye->renderHeight = left_eye->renderHeight;
-
- gvr::GvrApi* gvr_api = GetGvrApi();
- if (!gvr_api) {
- // We may not be able to get an instance of GvrApi right away, so
- // stub in some data till we have one.
- device->displayName = "Unknown";
-
- left_eye->fieldOfView->upDegrees = 45;
- left_eye->fieldOfView->downDegrees = 45;
- left_eye->fieldOfView->leftDegrees = 45;
- left_eye->fieldOfView->rightDegrees = 45;
-
- right_eye->fieldOfView->upDegrees = 45;
- right_eye->fieldOfView->downDegrees = 45;
- right_eye->fieldOfView->leftDegrees = 45;
- right_eye->fieldOfView->rightDegrees = 45;
-
- left_eye->offset[0] = -0.0;
- left_eye->offset[1] = -0.0;
- left_eye->offset[2] = -0.03;
-
- right_eye->offset[0] = 0.0;
- right_eye->offset[1] = 0.0;
- right_eye->offset[2] = 0.03;
-
- // Tell the delegate not to draw yet, to avoid a race condition
- // (and visible wobble) on entering VR.
- if (delegate_) {
- delegate_->SetWebVRRenderSurfaceSize(kInvalidRenderTargetSize.width,
- kInvalidRenderTargetSize.height);
- }
-
- return device;
+void GvrDevice::GetVRDevice(
+ const base::Callback<void(mojom::VRDisplayInfoPtr)>& callback) {
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (delegate) {
+ delegate->CreateVRDisplayInfo(callback, id());
+ } else {
+ callback.Run(nullptr);
}
-
- // In compositor mode, we have to use the current compositor window's
- // surface size. Would be nice to change it, but that needs more browser
- // internals to be modified. TODO(klausw,crbug.com/655722): remove this once
- // we can pick our own surface size.
- gvr::Sizei compositor_size = delegate_->GetWebVRCompositorSurfaceSize();
- 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();
- 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];
-
- if (delegate_) {
- delegate_->SetWebVRRenderSurfaceSize(2 * left_eye->renderWidth,
- left_eye->renderHeight);
- }
-
- return device;
}
void GvrDevice::ResetPose() {
- gvr::GvrApi* gvr_api = GetGvrApi();
-
- // Should never call RecenterTracking when using with Daydream viewers. On
- // those devices recentering should only be done via the controller.
- if (gvr_api && gvr_api->GetViewerType() == GVR_VIEWER_TYPE_CARDBOARD)
- gvr_api->RecenterTracking();
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (delegate)
+ delegate->ResetPose();
}
void GvrDevice::RequestPresent(const base::Callback<void(bool)>& callback) {
@@ -159,8 +46,9 @@ void GvrDevice::RequestPresent(const base::Callback<void(bool)>& callback) {
void GvrDevice::SetSecureOrigin(bool secure_origin) {
secure_origin_ = secure_origin;
- if (delegate_)
- delegate_->SetWebVRSecureOrigin(secure_origin_);
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (delegate)
+ delegate->SetWebVRSecureOrigin(secure_origin_);
}
void GvrDevice::ExitPresent() {
@@ -169,14 +57,16 @@ void GvrDevice::ExitPresent() {
}
void GvrDevice::SubmitFrame(mojom::VRPosePtr pose) {
- if (delegate_)
- delegate_->SubmitWebVRFrame();
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (delegate)
+ delegate->SubmitWebVRFrame();
}
void GvrDevice::UpdateLayerBounds(int16_t frame_index,
mojom::VRLayerBoundsPtr left_bounds,
mojom::VRLayerBoundsPtr right_bounds) {
- if (!delegate_)
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (!delegate)
return;
gvr::Rectf left_gvr_bounds;
@@ -191,30 +81,32 @@ void GvrDevice::UpdateLayerBounds(int16_t frame_index,
right_gvr_bounds.right = right_bounds->left + right_bounds->width;
right_gvr_bounds.bottom = 1.0f - (right_bounds->top + right_bounds->height);
- delegate_->UpdateWebVRTextureBounds(frame_index, left_gvr_bounds,
- right_gvr_bounds);
+ delegate->UpdateWebVRTextureBounds(frame_index, left_gvr_bounds,
+ right_gvr_bounds);
}
void GvrDevice::GetVRVSyncProvider(mojom::VRVSyncProviderRequest request) {
- if (delegate_)
- delegate_->OnVRVsyncProviderRequest(std::move(request));
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (delegate)
+ delegate->OnVRVsyncProviderRequest(std::move(request));
}
-void GvrDevice::SetDelegate(GvrDelegate* delegate) {
- delegate_ = delegate;
-
+void GvrDevice::OnDelegateChanged() {
+ GvrDelegate* delegate = GetGvrDelegate();
+ if (!delegate || !delegate->SupportsPresentation())
+ OnExitPresent();
// Notify the clients that this device has changed
- if (delegate_) {
- delegate_->SetWebVRSecureOrigin(secure_origin_);
- OnChanged();
- }
-}
+ if (delegate)
+ delegate->SetWebVRSecureOrigin(secure_origin_);
-gvr::GvrApi* GvrDevice::GetGvrApi() {
- if (!delegate_)
- return nullptr;
+ OnChanged();
+}
- return delegate_->gvr_api();
+GvrDelegate* GvrDevice::GetGvrDelegate() {
+ GvrDelegateProvider* delegate_provider = GvrDelegateProvider::GetInstance();
+ if (delegate_provider)
+ return delegate_provider->GetDelegate();
+ return nullptr;
}
} // namespace device
« no previous file with comments | « device/vr/android/gvr/gvr_device.h ('k') | device/vr/android/gvr/gvr_device_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698