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

Side by Side Diff: device/vr/openvr/openvr_device.cc

Issue 2834843002: Add event listening function to openvr device (Closed)
Patch Set: Initialize main_thread_task_runner_ Created 3 years, 7 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
OLDNEW
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2017 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 #define _USE_MATH_DEFINES // for M_PI 5 #define _USE_MATH_DEFINES // for M_PI
6 #include "device/vr/openvr/openvr_device.h" 6 #include "device/vr/openvr/openvr_device.h"
7 #include <math.h> 7 #include <math.h>
8 #include "third_party/openvr/src/headers/openvr.h" 8 #include "third_party/openvr/src/headers/openvr.h"
9 9
10 namespace { 10 namespace {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 transform[9] = mat.m[1][2]; 65 transform[9] = mat.m[1][2];
66 transform[10] = mat.m[2][2]; 66 transform[10] = mat.m[2][2];
67 transform[11] = 0.0f; 67 transform[11] = 0.0f;
68 transform[12] = mat.m[0][3]; 68 transform[12] = mat.m[0][3];
69 transform[13] = mat.m[1][3]; 69 transform[13] = mat.m[1][3];
70 transform[14] = mat.m[2][3]; 70 transform[14] = mat.m[2][3];
71 transform[15] = 1.0f; 71 transform[15] = 1.0f;
72 return transform; 72 return transform;
73 } 73 }
74 74
75 void RunPollingEventsCallback(const base::Callback<void()>& callback) {
mthiesse 2017/05/02 14:46:09 Remove this. (See comment below)
76 callback.Run();
77 }
78
75 } // namespace 79 } // namespace
76 80
77 namespace device { 81 namespace device {
78 82
79 OpenVRDevice::OpenVRDevice(vr::IVRSystem* vr) : vr_system_(vr) {} 83 OpenVRDevice::OpenVRDevice(vr::IVRSystem* vr)
84 : vr_system_(vr), weak_ptr_factory_(this), is_polling_events_(false) {}
80 OpenVRDevice::~OpenVRDevice() {} 85 OpenVRDevice::~OpenVRDevice() {}
81 86
82 void OpenVRDevice::CreateVRDisplayInfo( 87 void OpenVRDevice::CreateVRDisplayInfo(
83 const base::Callback<void(mojom::VRDisplayInfoPtr)>& on_created) { 88 const base::Callback<void(mojom::VRDisplayInfoPtr)>& on_created) {
84 if (!vr_system_) { 89 if (!vr_system_) {
85 on_created.Run(nullptr); 90 on_created.Run(nullptr);
86 return; 91 return;
87 } 92 }
88 93
89 mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New(); 94 mojom::VRDisplayInfoPtr device = mojom::VRDisplayInfo::New();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 140
136 vr::IVRChaperone* chaperone = vr::VRChaperone(); 141 vr::IVRChaperone* chaperone = vr::VRChaperone();
137 if (chaperone) { 142 if (chaperone) {
138 chaperone->GetPlayAreaSize(&device->stageParameters->sizeX, 143 chaperone->GetPlayAreaSize(&device->stageParameters->sizeX,
139 &device->stageParameters->sizeZ); 144 &device->stageParameters->sizeZ);
140 } else { 145 } else {
141 device->stageParameters->sizeX = 0.0f; 146 device->stageParameters->sizeX = 0.0f;
142 device->stageParameters->sizeZ = 0.0f; 147 device->stageParameters->sizeZ = 0.0f;
143 } 148 }
144 149
145 render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system_); 150 // If it is first initialization, OpenVRRenderLoop instance need to be
151 // created and callback need to be registed.
152 if (!render_loop_) {
153 render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system_);
154
155 render_loop_->RegistPollingEventCallback(base::Bind(
156 &OpenVRDevice::OnPollingEvents, weak_ptr_factory_.GetWeakPtr()));
157 }
146 158
147 on_created.Run(std::move(device)); 159 on_created.Run(std::move(device));
148 } 160 }
149 161
150 void OpenVRDevice::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client, 162 void OpenVRDevice::RequestPresent(mojom::VRSubmitFrameClientPtr submit_client,
151 const base::Callback<void(bool)>& callback) { 163 const base::Callback<void(bool)>& callback) {
152 callback.Run(false); 164 callback.Run(false);
153 // We don't support presentation currently. 165 // We don't support presentation currently.
154 } 166 }
155 167
(...skipping 17 matching lines...) Expand all
173 int16_t source_height) { 185 int16_t source_height) {
174 // We don't support presentation currently, so don't do anything. 186 // We don't support presentation currently, so don't do anything.
175 } 187 }
176 188
177 void OpenVRDevice::GetVRVSyncProvider(mojom::VRVSyncProviderRequest request) { 189 void OpenVRDevice::GetVRVSyncProvider(mojom::VRVSyncProviderRequest request) {
178 render_loop_->Bind(std::move(request)); 190 render_loop_->Bind(std::move(request));
179 } 191 }
180 192
181 OpenVRDevice::OpenVRRenderLoop::OpenVRRenderLoop(vr::IVRSystem* vr_system) 193 OpenVRDevice::OpenVRRenderLoop::OpenVRRenderLoop(vr::IVRSystem* vr_system)
182 : vr_system_(vr_system), 194 : vr_system_(vr_system),
195 main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
183 binding_(this), 196 binding_(this),
184 base::SimpleThread("OpenVRRenderLoop") {} 197 base::SimpleThread("OpenVRRenderLoop") {
198 DCHECK(main_thread_task_runner_);
199 }
185 200
186 void OpenVRDevice::OpenVRRenderLoop::Bind( 201 void OpenVRDevice::OpenVRRenderLoop::Bind(
187 mojom::VRVSyncProviderRequest request) { 202 mojom::VRVSyncProviderRequest request) {
188 binding_.Close(); 203 binding_.Close();
189 binding_.Bind(std::move(request)); 204 binding_.Bind(std::move(request));
190 } 205 }
191 206
192 void OpenVRDevice::OpenVRRenderLoop::Run() { 207 void OpenVRDevice::OpenVRRenderLoop::Run() {
193 // TODO (BillOrr): We will wait for VSyncs on this thread using WaitGetPoses 208 // TODO (BillOrr): We will wait for VSyncs on this thread using WaitGetPoses
194 // when we support presentation. 209 // when we support presentation.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 pose->position.value()[1] = m[1][3]; 241 pose->position.value()[1] = m[1][3];
227 pose->position.value()[2] = m[2][3]; 242 pose->position.value()[2] = m[2][3];
228 243
229 pose->linearVelocity = HmdVector3ToWebVR(hmdPose.vVelocity); 244 pose->linearVelocity = HmdVector3ToWebVR(hmdPose.vVelocity);
230 pose->angularVelocity = HmdVector3ToWebVR(hmdPose.vAngularVelocity); 245 pose->angularVelocity = HmdVector3ToWebVR(hmdPose.vAngularVelocity);
231 } 246 }
232 247
233 return std::move(pose); 248 return std::move(pose);
234 } 249 }
235 250
251 // Only deal with event which will cause displayInfo changed now.
252 void OpenVRDevice::OnPollingEvents() {
253 if (!vr_system_ || is_polling_events_)
254 return;
255
256 vr::VREvent_t event;
257 bool is_changed = false;
258 while (vr_system_->PollNextEvent(&event, sizeof(event))) {
259 if (event.trackedDeviceIndex != vr::k_unTrackedDeviceIndex_Hmd &&
260 event.trackedDeviceIndex != vr::k_unTrackedDeviceIndexInvalid) {
261 continue;
262 }
263
264 switch (event.eventType) {
265 case vr::VREvent_TrackedDeviceUpdated:
266 case vr::VREvent_IpdChanged:
267 case vr::VREvent_ChaperoneDataHasChanged:
268 case vr::VREvent_ChaperoneSettingsHaveChanged:
269 case vr::VREvent_ChaperoneUniverseHasChanged:
270 is_changed = true;
271 break;
272
273 default:
274 break;
275 }
276 }
277
278 if (is_changed) {
279 OnChanged();
280 }
281 }
282
283 // Regist a callback function to deal with system event.
284 void OpenVRDevice::OpenVRRenderLoop::RegistPollingEventCallback(
285 const base::Callback<void()>& onPollingEvents) {
286 if (onPollingEvents.is_null())
287 return;
288
289 on_polling_events_ = onPollingEvents;
290 }
291
292 void OpenVRDevice::OpenVRRenderLoop::UnregistPollingEventCallback() {
293 on_polling_events_.Reset();
294 }
295
236 void OpenVRDevice::OpenVRRenderLoop::GetVSync( 296 void OpenVRDevice::OpenVRRenderLoop::GetVSync(
237 const mojom::VRVSyncProvider::GetVSyncCallback& callback) { 297 const mojom::VRVSyncProvider::GetVSyncCallback& callback) {
238 static int16_t next_frame = 0; 298 static int16_t next_frame = 0;
239 int16_t frame = next_frame++; 299 int16_t frame = next_frame++;
240 300
301 // VSync could be used as a signal to poll event.
302 if (!on_polling_events_.is_null()) {
303 main_thread_task_runner_->PostTask(
304 FROM_HERE, base::Bind(&RunPollingEventsCallback, on_polling_events_));
mthiesse 2017/05/02 14:46:09 Sorry, I gave you bad advice earlier. This should
305 }
306
241 // TODO(BillOrr): Give real values when VSync loop is hooked up. This is the 307 // TODO(BillOrr): Give real values when VSync loop is hooked up. This is the
242 // presentation time for the frame. Just returning a default value for now 308 // presentation time for the frame. Just returning a default value for now
243 // since we don't have VSync hooked up. 309 // since we don't have VSync hooked up.
244 base::TimeDelta time = base::TimeDelta::FromSecondsD(2.0); 310 base::TimeDelta time = base::TimeDelta::FromSecondsD(2.0);
245 311
246 device::mojom::VRPosePtr pose = getPose(); 312 device::mojom::VRPosePtr pose = getPose();
247 Sleep(11); // TODO (billorr): Use real vsync timing instead of a sleep (this 313 Sleep(11); // TODO (billorr): Use real vsync timing instead of a sleep (this
248 // sleep just throttles vsyncs so we don't fill message queues). 314 // sleep just throttles vsyncs so we don't fill message queues).
249 callback.Run(std::move(pose), time, frame, 315 callback.Run(std::move(pose), time, frame,
250 device::mojom::VRVSyncProvider::Status::SUCCESS); 316 device::mojom::VRVSyncProvider::Status::SUCCESS);
251 } 317 }
252 318
253 } // namespace device 319 } // namespace device
OLDNEW
« device/vr/openvr/openvr_device.h ('K') | « device/vr/openvr/openvr_device.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698