Chromium Code Reviews| 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. |