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

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

Issue 2309523003: Plumbing through more WebVR presentation code (Closed)
Patch Set: Addressed Michael's feedack 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 "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr.h" 13 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr.h"
13 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr_types.h" 14 #include "third_party/gvr-android-sdk/src/ndk-beta/include/vr/gvr/capi/include/g vr_types.h"
14 #include "ui/gfx/transform.h" 15 #include "ui/gfx/transform.h"
15 #include "ui/gfx/transform_util.h" 16 #include "ui/gfx/transform_util.h"
16 17
17 namespace device { 18 namespace device {
18 19
19 namespace { 20 namespace {
20 21
21 static const uint64_t kPredictionTimeWithoutVsyncNanos = 50000000; 22 static const uint64_t kPredictionTimeWithoutVsyncNanos = 50000000;
22 23
23 } // namespace 24 } // namespace
24 25
25 GvrDevice::GvrDevice(VRDeviceProvider* provider, gvr::GvrApi* gvr_api) 26 GvrDevice::GvrDevice(VRDeviceProvider* provider, GvrDelegate* delegate)
26 : VRDevice(provider), gvr_api_(gvr_api) {} 27 : VRDevice(provider), delegate_(delegate) {}
27 28
28 GvrDevice::~GvrDevice() {} 29 GvrDevice::~GvrDevice() {}
29 30
30 VRDisplayPtr GvrDevice::GetVRDevice() { 31 VRDisplayPtr GvrDevice::GetVRDevice() {
31 TRACE_EVENT0("input", "GvrDevice::GetVRDevice"); 32 TRACE_EVENT0("input", "GvrDevice::GetVRDevice");
32 33
34 gvr::GvrApi* gvr_api = delegate_->gvr_api();
35
33 VRDisplayPtr device = VRDisplay::New(); 36 VRDisplayPtr device = VRDisplay::New();
34 37
35 device->capabilities = VRDisplayCapabilities::New(); 38 device->capabilities = VRDisplayCapabilities::New();
36 device->capabilities->hasOrientation = true; 39 device->capabilities->hasOrientation = true;
37 device->capabilities->hasPosition = false; 40 device->capabilities->hasPosition = false;
38 device->capabilities->hasExternalDisplay = false; 41 device->capabilities->hasExternalDisplay = false;
39 device->capabilities->canPresent = true; 42 device->capabilities->canPresent = true;
40 43
41 device->leftEye = VREyeParameters::New(); 44 device->leftEye = VREyeParameters::New();
42 device->rightEye = VREyeParameters::New(); 45 device->rightEye = VREyeParameters::New();
43 VREyeParametersPtr& left_eye = device->leftEye; 46 VREyeParametersPtr& left_eye = device->leftEye;
44 VREyeParametersPtr& right_eye = device->rightEye; 47 VREyeParametersPtr& right_eye = device->rightEye;
45 48
46 device->displayName = gvr_api_->GetViewerModel(); 49 device->displayName = gvr_api->GetViewerModel();
47 50
48 gvr::BufferViewportList gvr_buffer_viewports = 51 gvr::BufferViewportList gvr_buffer_viewports =
49 gvr_api_->CreateEmptyBufferViewportList(); 52 gvr_api->CreateEmptyBufferViewportList();
50 gvr_buffer_viewports.SetToRecommendedBufferViewports(); 53 gvr_buffer_viewports.SetToRecommendedBufferViewports();
51 54
52 gvr::BufferViewport eye_viewport = gvr_api_->CreateBufferViewport(); 55 gvr::BufferViewport eye_viewport = gvr_api->CreateBufferViewport();
53 gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport); 56 gvr_buffer_viewports.GetBufferViewport(GVR_LEFT_EYE, &eye_viewport);
54 gvr::Rectf eye_fov = eye_viewport.GetSourceFov(); 57 gvr::Rectf eye_fov = eye_viewport.GetSourceFov();
55 left_eye->fieldOfView = VRFieldOfView::New(); 58 left_eye->fieldOfView = VRFieldOfView::New();
56 left_eye->fieldOfView->upDegrees = eye_fov.top; 59 left_eye->fieldOfView->upDegrees = eye_fov.top;
57 left_eye->fieldOfView->downDegrees = eye_fov.bottom; 60 left_eye->fieldOfView->downDegrees = eye_fov.bottom;
58 left_eye->fieldOfView->leftDegrees = eye_fov.left; 61 left_eye->fieldOfView->leftDegrees = eye_fov.left;
59 left_eye->fieldOfView->rightDegrees = eye_fov.right; 62 left_eye->fieldOfView->rightDegrees = eye_fov.right;
60 63
61 eye_viewport = gvr_api_->CreateBufferViewport(); 64 eye_viewport = gvr_api->CreateBufferViewport();
62 gvr_buffer_viewports.GetBufferViewport(GVR_RIGHT_EYE, &eye_viewport); 65 gvr_buffer_viewports.GetBufferViewport(GVR_RIGHT_EYE, &eye_viewport);
63 eye_fov = eye_viewport.GetSourceFov(); 66 eye_fov = eye_viewport.GetSourceFov();
64 right_eye->fieldOfView = VRFieldOfView::New(); 67 right_eye->fieldOfView = VRFieldOfView::New();
65 right_eye->fieldOfView->upDegrees = eye_fov.top; 68 right_eye->fieldOfView->upDegrees = eye_fov.top;
66 right_eye->fieldOfView->downDegrees = eye_fov.bottom; 69 right_eye->fieldOfView->downDegrees = eye_fov.bottom;
67 right_eye->fieldOfView->leftDegrees = eye_fov.left; 70 right_eye->fieldOfView->leftDegrees = eye_fov.left;
68 right_eye->fieldOfView->rightDegrees = eye_fov.right; 71 right_eye->fieldOfView->rightDegrees = eye_fov.right;
69 72
70 gvr::Mat4f left_eye_mat = gvr_api_->GetEyeFromHeadMatrix(GVR_LEFT_EYE); 73 gvr::Mat4f left_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_LEFT_EYE);
71 gvr::Mat4f right_eye_mat = gvr_api_->GetEyeFromHeadMatrix(GVR_RIGHT_EYE); 74 gvr::Mat4f right_eye_mat = gvr_api->GetEyeFromHeadMatrix(GVR_RIGHT_EYE);
72 75
73 left_eye->offset = mojo::Array<float>::New(3); 76 left_eye->offset = mojo::Array<float>::New(3);
74 left_eye->offset[0] = -left_eye_mat.m[0][3]; 77 left_eye->offset[0] = -left_eye_mat.m[0][3];
75 left_eye->offset[1] = -left_eye_mat.m[1][3]; 78 left_eye->offset[1] = -left_eye_mat.m[1][3];
76 left_eye->offset[2] = -left_eye_mat.m[2][3]; 79 left_eye->offset[2] = -left_eye_mat.m[2][3];
77 80
78 right_eye->offset = mojo::Array<float>::New(3); 81 right_eye->offset = mojo::Array<float>::New(3);
79 right_eye->offset[0] = -right_eye_mat.m[0][3]; 82 right_eye->offset[0] = -right_eye_mat.m[0][3];
80 right_eye->offset[1] = -right_eye_mat.m[1][3]; 83 right_eye->offset[1] = -right_eye_mat.m[1][3];
81 right_eye->offset[2] = -right_eye_mat.m[2][3]; 84 right_eye->offset[2] = -right_eye_mat.m[2][3];
82 85
83 gvr::Sizei render_target_size = gvr_api_->GetRecommendedRenderTargetSize(); 86 // gvr::Sizei render_target_size = gvr_api->GetRecommendedRenderTargetSize();
84 87
85 left_eye->renderWidth = render_target_size.width / 2; 88 // TODO(bajones): GVR has a bug that causes it to return bad render target
86 left_eye->renderHeight = render_target_size.height; 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;
87 93
88 right_eye->renderWidth = render_target_size.width / 2; 94 right_eye->renderWidth = left_eye->renderWidth;
89 right_eye->renderHeight = render_target_size.height; 95 right_eye->renderHeight = left_eye->renderHeight;
90 96
91 return device; 97 return device;
92 } 98 }
93 99
94 VRPosePtr GvrDevice::GetPose() { 100 VRPosePtr GvrDevice::GetPose() {
95 TRACE_EVENT0("input", "GvrDevice::GetSensorState"); 101 TRACE_EVENT0("input", "GvrDevice::GetSensorState");
96 102
103 gvr::GvrApi* gvr_api = delegate_->gvr_api();
104
97 VRPosePtr pose = VRPose::New(); 105 VRPosePtr pose = VRPose::New();
98 106
99 pose->timestamp = base::Time::Now().ToJsTime(); 107 pose->timestamp = base::Time::Now().ToJsTime();
100 108
101 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow(); 109 gvr::ClockTimePoint target_time = gvr::GvrApi::GetTimePointNow();
102 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos; 110 target_time.monotonic_system_time_nanos += kPredictionTimeWithoutVsyncNanos;
103 111
104 gvr::Mat4f head_mat = gvr_api_->GetHeadPoseInStartSpace(target_time); 112 gvr::Mat4f head_mat = gvr_api->GetHeadPoseInStartSpace(target_time);
105 113
106 gfx::Transform inv_transform( 114 gfx::Transform inv_transform(
107 head_mat.m[0][0], head_mat.m[0][1], head_mat.m[0][2], head_mat.m[0][3], 115 head_mat.m[0][0], head_mat.m[0][1], head_mat.m[0][2], head_mat.m[0][3],
108 head_mat.m[1][0], head_mat.m[1][1], head_mat.m[1][2], head_mat.m[1][3], 116 head_mat.m[1][0], head_mat.m[1][1], head_mat.m[1][2], head_mat.m[1][3],
109 head_mat.m[2][0], head_mat.m[2][1], head_mat.m[2][2], head_mat.m[2][3], 117 head_mat.m[2][0], head_mat.m[2][1], head_mat.m[2][2], head_mat.m[2][3],
110 head_mat.m[3][0], head_mat.m[3][1], head_mat.m[3][2], head_mat.m[3][3]); 118 head_mat.m[3][0], head_mat.m[3][1], head_mat.m[3][2], head_mat.m[3][3]);
111 119
112 gfx::Transform transform; 120 gfx::Transform transform;
113 if (inv_transform.GetInverse(&transform)) { 121 if (inv_transform.GetInverse(&transform)) {
114 gfx::DecomposedTransform decomposed_transform; 122 gfx::DecomposedTransform decomposed_transform;
115 gfx::DecomposeTransform(&decomposed_transform, transform); 123 gfx::DecomposeTransform(&decomposed_transform, transform);
116 124
117 pose->orientation = mojo::Array<float>::New(4); 125 pose->orientation = mojo::Array<float>::New(4);
118 pose->orientation[0] = decomposed_transform.quaternion[0]; 126 pose->orientation[0] = decomposed_transform.quaternion[0];
119 pose->orientation[1] = decomposed_transform.quaternion[1]; 127 pose->orientation[1] = decomposed_transform.quaternion[1];
120 pose->orientation[2] = decomposed_transform.quaternion[2]; 128 pose->orientation[2] = decomposed_transform.quaternion[2];
121 pose->orientation[3] = decomposed_transform.quaternion[3]; 129 pose->orientation[3] = decomposed_transform.quaternion[3];
122 130
123 pose->position = mojo::Array<float>::New(3); 131 pose->position = mojo::Array<float>::New(3);
124 pose->position[0] = decomposed_transform.translate[0]; 132 pose->position[0] = decomposed_transform.translate[0];
125 pose->position[1] = decomposed_transform.translate[1]; 133 pose->position[1] = decomposed_transform.translate[1];
126 pose->position[2] = decomposed_transform.translate[2]; 134 pose->position[2] = decomposed_transform.translate[2];
127 } 135 }
128 136
129 return pose; 137 return pose;
130 } 138 }
131 139
132 void GvrDevice::ResetPose() { 140 void GvrDevice::ResetPose() {
133 gvr_api_->ResetTracking(); 141 delegate_->gvr_api()->ResetTracking();
142 }
143
144 void GvrDevice::RequestPresent() {
145 delegate_->RequestWebVRPresent();
146 }
147
148 void GvrDevice::ExitPresent() {
149 delegate_->ExitWebVRPresent();
150 }
151
152 void GvrDevice::SubmitFrame() {
153 delegate_->SubmitWebVRFrame();
154 }
155
156 void GvrDevice::UpdateLayerBounds(VRLayerBoundsPtr leftBounds,
157 VRLayerBoundsPtr rightBounds) {
158 delegate_->UpdateWebVRTextureBounds(0, // Left eye
159 leftBounds->left, leftBounds->top,
160 leftBounds->width, leftBounds->height);
161 delegate_->UpdateWebVRTextureBounds(1, // Right eye
162 rightBounds->left, rightBounds->top,
163 rightBounds->width, rightBounds->height);
134 } 164 }
135 165
136 } // namespace device 166 } // 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