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

Side by Side Diff: device/vr/android/gvr/gvr_device.cc

Issue 2343023002: Switch WebVR to handle GvrApi management through VrShellDelegate (Closed)
Patch Set: Renamed onNativeLibraryReady to initializeNative Created 4 years, 3 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
« 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "device/vr/android/gvr/gvr_device.h" 5 #include "device/vr/android/gvr/gvr_device.h"
6 6
7 #include <math.h> 7 #include <math.h>
8 #include <algorithm> 8 #include <algorithm>
9 9
10 #include "base/time/time.h" 10 #include "base/time/time.h"
11 #include "base/trace_event/trace_event.h" 11 #include "base/trace_event/trace_event.h"
12 #include "device/vr/android/gvr/gvr_delegate.h" 12 #include "device/vr/android/gvr/gvr_delegate.h"
13 #include "device/vr/vr_device_manager.h"
13 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr.h" 14 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr.h"
14 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr_types.h" 15 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr_types.h"
15 #include "ui/gfx/transform.h" 16 #include "ui/gfx/transform.h"
16 #include "ui/gfx/transform_util.h" 17 #include "ui/gfx/transform_util.h"
17 18
18 namespace device { 19 namespace device {
19 20
20 namespace { 21 namespace {
21 22
22 static const uint64_t kPredictionTimeWithoutVsyncNanos = 50000000; 23 static const uint64_t kPredictionTimeWithoutVsyncNanos = 50000000;
23 24
24 } // namespace 25 } // namespace
25 26
26 GvrDevice::GvrDevice(VRDeviceProvider* provider, GvrDelegate* delegate) 27 GvrDevice::GvrDevice(GvrDeviceProvider* provider, GvrDelegate* delegate)
27 : VRDevice(provider), delegate_(delegate) {} 28 : VRDevice(provider), delegate_(delegate), gvr_provider_(provider) {}
28 29
29 GvrDevice::~GvrDevice() {} 30 GvrDevice::~GvrDevice() {}
30 31
31 VRDisplayPtr GvrDevice::GetVRDevice() { 32 VRDisplayPtr GvrDevice::GetVRDevice() {
32 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); 33 TRACE_EVENT0("input", "GvrDevice::GetVRDevice");
33 34
34 gvr::GvrApi* gvr_api = delegate_->gvr_api(); 35 VRDisplayPtr device = VRDisplay::New();
35 36
36 VRDisplayPtr device = VRDisplay::New(); 37 device->index = id();
37 38
38 device->capabilities = VRDisplayCapabilities::New(); 39 device->capabilities = VRDisplayCapabilities::New();
39 device->capabilities->hasOrientation = true; 40 device->capabilities->hasOrientation = true;
40 device->capabilities->hasPosition = false; 41 device->capabilities->hasPosition = false;
41 device->capabilities->hasExternalDisplay = false; 42 device->capabilities->hasExternalDisplay = false;
42 device->capabilities->canPresent = true; 43 device->capabilities->canPresent = true;
43 44
44 device->leftEye = VREyeParameters::New(); 45 device->leftEye = VREyeParameters::New();
45 device->rightEye = VREyeParameters::New(); 46 device->rightEye = VREyeParameters::New();
46 VREyeParametersPtr& left_eye = device->leftEye; 47 VREyeParametersPtr& left_eye = device->leftEye;
47 VREyeParametersPtr& right_eye = device->rightEye; 48 VREyeParametersPtr& right_eye = device->rightEye;
48 49
49 device->displayName = gvr_api->GetViewerModel(); 50 left_eye->fieldOfView = VRFieldOfView::New();
51 right_eye->fieldOfView = VRFieldOfView::New();
52
53 left_eye->offset = mojo::Array<float>::New(3);
54 right_eye->offset = mojo::Array<float>::New(3);
55
56 // TODO(bajones): GVR has a bug that causes it to return bad render target
57 // sizes when the phone is in portait mode. Send arbitrary,
58 // not-horrifically-wrong values instead.
59 // gvr::Sizei render_target_size = gvr_api->GetRecommendedRenderTargetSize();
60 left_eye->renderWidth = 1024; // render_target_size.width / 2;
61 left_eye->renderHeight = 1024; // render_target_size.height;
62
63 right_eye->renderWidth = left_eye->renderWidth;
64 right_eye->renderHeight = left_eye->renderHeight;
65
66 gvr::GvrApi* gvr_api = GetGvrApi();
67 if (!gvr_api) {
68 // We may not be able to get an instance of GvrApi right away, so
69 // stub in some data till we have one.
70 device->displayName = "Unknown";
71
72 left_eye->fieldOfView->upDegrees = 45;
73 left_eye->fieldOfView->downDegrees = 45;
74 left_eye->fieldOfView->leftDegrees = 45;
75 left_eye->fieldOfView->rightDegrees = 45;
76
77 right_eye->fieldOfView->upDegrees = 45;
78 right_eye->fieldOfView->downDegrees = 45;
79 right_eye->fieldOfView->leftDegrees = 45;
80 right_eye->fieldOfView->rightDegrees = 45;
81
82 left_eye->offset[0] = -0.0;
83 left_eye->offset[1] = -0.0;
84 left_eye->offset[2] = -0.03;
85
86 right_eye->offset[0] = 0.0;
87 right_eye->offset[1] = 0.0;
88 right_eye->offset[2] = 0.03;
89
90 return device;
91 }
92
93 std::string vendor = gvr_api->GetViewerVendor();
94 std::string model = gvr_api->GetViewerModel();
95 device->displayName = vendor + " " + model;
50 96
51 gvr::BufferViewportList gvr_buffer_viewports = 97 gvr::BufferViewportList gvr_buffer_viewports =
52 gvr_api->CreateEmptyBufferViewportList(); 98 gvr_api->CreateEmptyBufferViewportList();
53 gvr_buffer_viewports.SetToRecommendedBufferViewports(); 99 gvr_buffer_viewports.SetToRecommendedBufferViewports();
54 100
55 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport(); 101 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport();
56 gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport); 102 gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport);
57 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); 103 gvr::Rectf eye_fov = eye_viewport.GetSourceFov();
58 left_eye->fieldOfView = VRFieldOfView::New();
59 left_eye->fieldOfView->upDegrees = eye_fov.top; 104 left_eye->fieldOfView->upDegrees = eye_fov.top;
60 left_eye->fieldOfView->downDegrees = eye_fov.bottom; 105 left_eye->fieldOfView->downDegrees = eye_fov.bottom;
61 left_eye->fieldOfView->leftDegrees = eye_fov.left; 106 left_eye->fieldOfView->leftDegrees = eye_fov.left;
62 left_eye->fieldOfView->rightDegrees = eye_fov.right; 107 left_eye->fieldOfView->rightDegrees = eye_fov.right;
63 108
64 eye_viewport = gvr_api->CreateBufferViewport(); 109 eye_viewport = gvr_api->CreateBufferViewport();
65 gvr_buffer_viewports.GetBufferViewport(GVR_RIGHT_EYE, &eye_viewport); 110 gvr_buffer_viewports.GetBufferViewport(GVR_RIGHT_EYE, &eye_viewport);
66 eye_fov = eye_viewport.GetSourceFov(); 111 eye_fov = eye_viewport.GetSourceFov();
67 right_eye->fieldOfView = VRFieldOfView::New();
68 right_eye->fieldOfView->upDegrees = eye_fov.top; 112 right_eye->fieldOfView->upDegrees = eye_fov.top;
69 right_eye->fieldOfView->downDegrees = eye_fov.bottom; 113 right_eye->fieldOfView->downDegrees = eye_fov.bottom;
70 right_eye->fieldOfView->leftDegrees = eye_fov.left; 114 right_eye->fieldOfView->leftDegrees = eye_fov.left;
71 right_eye->fieldOfView->rightDegrees = eye_fov.right; 115 right_eye->fieldOfView->rightDegrees = eye_fov.right;
72 116
73 gvr::Mat4f left_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_LEFT_EYE); 117 gvr::Mat4f left_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_LEFT_EYE);
74 gvr::Mat4f right_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
75
76 left_eye->offset = mojo::Array<float>::New(3);
77 left_eye->offset[0] = -left_eye_mat.m[0][3]; 118 left_eye->offset[0] = -left_eye_mat.m[0][3];
78 left_eye->offset[1] = -left_eye_mat.m[1][3]; 119 left_eye->offset[1] = -left_eye_mat.m[1][3];
79 left_eye->offset[2] = -left_eye_mat.m[2][3]; 120 left_eye->offset[2] = -left_eye_mat.m[2][3];
80 121
81 right_eye->offset = mojo::Array<float>::New(3); 122 gvr::Mat4f right_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
82 right_eye->offset[0] = -right_eye_mat.m[0][3]; 123 right_eye->offset[0] = -right_eye_mat.m[0][3];
83 right_eye->offset[1] = -right_eye_mat.m[1][3]; 124 right_eye->offset[1] = -right_eye_mat.m[1][3];
84 right_eye->offset[2] = -right_eye_mat.m[2][3]; 125 right_eye->offset[2] = -right_eye_mat.m[2][3];
85 126
86 // gvr::Sizei render_target_size = gvr_api->GetRecommendedRenderTargetSize();
87
88 // TODO(bajones): GVR has a bug that causes it to return bad render target
89 // sizes when the phone is in portait mode. Send arbitrary,
90 // not-horrifically-wrong values instead.
91 left_eye->renderWidth = 1024; // render_target_size.width / 2;
92 left_eye->renderHeight = 1024; // render_target_size.height;
93
94 right_eye->renderWidth = left_eye->renderWidth;
95 right_eye->renderHeight = left_eye->renderHeight;
96
97 return device; 127 return device;
98 } 128 }
99 129
100 VRPosePtr GvrDevice::GetPose() { 130 VRPosePtr GvrDevice::GetPose() {
101 TRACE_EVENT0("input", "GvrDevice::GetSensorState"); 131 TRACE_EVENT0("input", "GvrDevice::GetSensorState");
102 132
103 gvr::GvrApi* gvr_api = delegate_->gvr_api();
104
105 VRPosePtr pose = VRPose::New(); 133 VRPosePtr pose = VRPose::New();
106 134
107 pose->timestamp = base::Time::Now().ToJsTime(); 135 pose->timestamp = base::Time::Now().ToJsTime();
108 136
137 pose->orientation = mojo::Array<float>::New(4);
138
139 gvr::GvrApi* gvr_api = GetGvrApi();
140 if (!gvr_api) {
141 // If we don't have a GvrApi instance return a static forward orientation.
142 pose->orientation[0] = 0.0;
143 pose->orientation[1] = 0.0;
144 pose->orientation[2] = 0.0;
145 pose->orientation[3] = 1.0;
146
147 return pose;
148 }
149
109 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); 150 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow();
110 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; 151 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos;
111 152
112 gvr::Mat4f head_mat = gvr_api->GetHeadPoseInStartSpace(target_time); 153 gvr::Mat4f head_mat = gvr_api->GetHeadPoseInStartSpace(target_time);
113 154
114 gfx::Transform inv_transform( 155 gfx::Transform inv_transform(
115 head_mat.m[0][0], head_mat.m[0][1], head_mat.m[0][2], head_mat.m[0][3], 156 head_mat.m[0][0], head_mat.m[0][1], head_mat.m[0][2], head_mat.m[0][3],
116 head_mat.m[1][0], head_mat.m[1][1], head_mat.m[1][2], head_mat.m[1][3], 157 head_mat.m[1][0], head_mat.m[1][1], head_mat.m[1][2], head_mat.m[1][3],
117 head_mat.m[2][0], head_mat.m[2][1], head_mat.m[2][2], head_mat.m[2][3], 158 head_mat.m[2][0], head_mat.m[2][1], head_mat.m[2][2], head_mat.m[2][3],
118 head_mat.m[3][0], head_mat.m[3][1], head_mat.m[3][2], head_mat.m[3][3]); 159 head_mat.m[3][0], head_mat.m[3][1], head_mat.m[3][2], head_mat.m[3][3]);
119 160
120 gfx::Transform transform; 161 gfx::Transform transform;
121 if (inv_transform.GetInverse(&transform)) { 162 if (inv_transform.GetInverse(&transform)) {
122 gfx::DecomposedTransform decomposed_transform; 163 gfx::DecomposedTransform decomposed_transform;
123 gfx::DecomposeTransform(&decomposed_transform, transform); 164 gfx::DecomposeTransform(&decomposed_transform, transform);
124 165
125 pose->orientation = mojo::Array<float>::New(4);
126 pose->orientation[0] = decomposed_transform.quaternion[0]; 166 pose->orientation[0] = decomposed_transform.quaternion[0];
127 pose->orientation[1] = decomposed_transform.quaternion[1]; 167 pose->orientation[1] = decomposed_transform.quaternion[1];
128 pose->orientation[2] = decomposed_transform.quaternion[2]; 168 pose->orientation[2] = decomposed_transform.quaternion[2];
129 pose->orientation[3] = decomposed_transform.quaternion[3]; 169 pose->orientation[3] = decomposed_transform.quaternion[3];
130 170
131 pose->position = mojo::Array<float>::New(3); 171 pose->position = mojo::Array<float>::New(3);
132 pose->position[0] = decomposed_transform.translate[0]; 172 pose->position[0] = decomposed_transform.translate[0];
133 pose->position[1] = decomposed_transform.translate[1]; 173 pose->position[1] = decomposed_transform.translate[1];
134 pose->position[2] = decomposed_transform.translate[2]; 174 pose->position[2] = decomposed_transform.translate[2];
135 } 175 }
136 176
137 return pose; 177 return pose;
138 } 178 }
139 179
140 void GvrDevice::ResetPose() { 180 void GvrDevice::ResetPose() {
141 delegate_->gvr_api()->ResetTracking(); 181 gvr::GvrApi* gvr_api = GetGvrApi();
182 if (gvr_api)
183 gvr_api->ResetTracking();
142 } 184 }
143 185
144 bool GvrDevice::RequestPresent() { 186 bool GvrDevice::RequestPresent() {
145 delegate_->RequestWebVRPresent(); 187 return gvr_provider_->RequestPresent();
146 return true;
147 } 188 }
148 189
149 void GvrDevice::ExitPresent() { 190 void GvrDevice::ExitPresent() {
150 delegate_->ExitWebVRPresent(); 191 gvr_provider_->ExitPresent();
151 } 192 }
152 193
153 void GvrDevice::SubmitFrame(VRPosePtr pose) { 194 void GvrDevice::SubmitFrame(VRPosePtr pose) {
154 delegate_->SubmitWebVRFrame(); 195 if (delegate_)
196 delegate_->SubmitWebVRFrame();
155 } 197 }
156 198
157 void GvrDevice::UpdateLayerBounds(VRLayerBoundsPtr leftBounds, 199 void GvrDevice::UpdateLayerBounds(VRLayerBoundsPtr leftBounds,
158 VRLayerBoundsPtr rightBounds) { 200 VRLayerBoundsPtr rightBounds) {
201 if (!delegate_)
202 return;
203
159 delegate_->UpdateWebVRTextureBounds(0, // Left eye 204 delegate_->UpdateWebVRTextureBounds(0, // Left eye
160 leftBounds->left, leftBounds->top, 205 leftBounds->left, leftBounds->top,
161 leftBounds->width, leftBounds->height); 206 leftBounds->width, leftBounds->height);
162 delegate_->UpdateWebVRTextureBounds(1, // Right eye 207 delegate_->UpdateWebVRTextureBounds(1, // Right eye
163 rightBounds->left, rightBounds->top, 208 rightBounds->left, rightBounds->top,
164 rightBounds->width, rightBounds->height); 209 rightBounds->width, rightBounds->height);
165 } 210 }
166 211
212 void GvrDevice::SetDelegate(GvrDelegate* delegate) {
213 delegate_ = delegate;
214
215 // Notify the clients that this device has changed
216 if (delegate_)
217 VRDeviceManager::GetInstance()->OnDeviceChanged(GetVRDevice());
218 }
219
220 gvr::GvrApi* GvrDevice::GetGvrApi() {
221 if (!delegate_)
222 return nullptr;
223
224 return delegate_->gvr_api();
225 }
226
167 } // namespace device 227 } // namespace device
OLDNEW
« 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