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

Unified 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, 8 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
« device/vr/openvr/openvr_device.h ('K') | « device/vr/openvr/openvr_device.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/vr/openvr/openvr_device.cc
diff --git a/device/vr/openvr/openvr_device.cc b/device/vr/openvr/openvr_device.cc
index dca1db47fb8b77214f9397a5eb9f1f8c41dcbc5d..b733ac3f7f45431c81bbf55f3281e4e471fdbcdc 100644
--- a/device/vr/openvr/openvr_device.cc
+++ b/device/vr/openvr/openvr_device.cc
@@ -72,11 +72,16 @@ std::vector<float> HmdMatrix34ToWebVRTransformMatrix(
return transform;
}
+void RunPollingEventsCallback(const base::Callback<void()>& callback) {
mthiesse 2017/05/02 14:46:09 Remove this. (See comment below)
+ callback.Run();
+}
+
} // namespace
namespace device {
-OpenVRDevice::OpenVRDevice(vr::IVRSystem* vr) : vr_system_(vr) {}
+OpenVRDevice::OpenVRDevice(vr::IVRSystem* vr)
+ : vr_system_(vr), weak_ptr_factory_(this), is_polling_events_(false) {}
OpenVRDevice::~OpenVRDevice() {}
void OpenVRDevice::CreateVRDisplayInfo(
@@ -142,7 +147,14 @@ void OpenVRDevice::CreateVRDisplayInfo(
device->stageParameters->sizeZ = 0.0f;
}
- render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system_);
+ // If it is first initialization, OpenVRRenderLoop instance need to be
+ // created and callback need to be registed.
+ if (!render_loop_) {
+ render_loop_ = std::make_unique<OpenVRRenderLoop>(vr_system_);
+
+ render_loop_->RegistPollingEventCallback(base::Bind(
+ &OpenVRDevice::OnPollingEvents, weak_ptr_factory_.GetWeakPtr()));
+ }
on_created.Run(std::move(device));
}
@@ -180,8 +192,11 @@ void OpenVRDevice::GetVRVSyncProvider(mojom::VRVSyncProviderRequest request) {
OpenVRDevice::OpenVRRenderLoop::OpenVRRenderLoop(vr::IVRSystem* vr_system)
: vr_system_(vr_system),
+ main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
binding_(this),
- base::SimpleThread("OpenVRRenderLoop") {}
+ base::SimpleThread("OpenVRRenderLoop") {
+ DCHECK(main_thread_task_runner_);
+}
void OpenVRDevice::OpenVRRenderLoop::Bind(
mojom::VRVSyncProviderRequest request) {
@@ -233,11 +248,62 @@ device::mojom::VRPosePtr OpenVRDevice::OpenVRRenderLoop::getPose() {
return std::move(pose);
}
+// Only deal with event which will cause displayInfo changed now.
+void OpenVRDevice::OnPollingEvents() {
+ if (!vr_system_ || is_polling_events_)
+ return;
+
+ vr::VREvent_t event;
+ bool is_changed = false;
+ while (vr_system_->PollNextEvent(&event, sizeof(event))) {
+ if (event.trackedDeviceIndex != vr::k_unTrackedDeviceIndex_Hmd &&
+ event.trackedDeviceIndex != vr::k_unTrackedDeviceIndexInvalid) {
+ continue;
+ }
+
+ switch (event.eventType) {
+ case vr::VREvent_TrackedDeviceUpdated:
+ case vr::VREvent_IpdChanged:
+ case vr::VREvent_ChaperoneDataHasChanged:
+ case vr::VREvent_ChaperoneSettingsHaveChanged:
+ case vr::VREvent_ChaperoneUniverseHasChanged:
+ is_changed = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ if (is_changed) {
+ OnChanged();
+ }
+}
+
+// Regist a callback function to deal with system event.
+void OpenVRDevice::OpenVRRenderLoop::RegistPollingEventCallback(
+ const base::Callback<void()>& onPollingEvents) {
+ if (onPollingEvents.is_null())
+ return;
+
+ on_polling_events_ = onPollingEvents;
+}
+
+void OpenVRDevice::OpenVRRenderLoop::UnregistPollingEventCallback() {
+ on_polling_events_.Reset();
+}
+
void OpenVRDevice::OpenVRRenderLoop::GetVSync(
const mojom::VRVSyncProvider::GetVSyncCallback& callback) {
static int16_t next_frame = 0;
int16_t frame = next_frame++;
+ // VSync could be used as a signal to poll event.
+ if (!on_polling_events_.is_null()) {
+ main_thread_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&RunPollingEventsCallback, on_polling_events_));
mthiesse 2017/05/02 14:46:09 Sorry, I gave you bad advice earlier. This should
+ }
+
// TODO(BillOrr): Give real values when VSync loop is hooked up. This is the
// presentation time for the frame. Just returning a default value for now
// since we don't have VSync hooked up.
« 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