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

Unified Diff: device/vr/vr_device_manager.cc

Issue 2494733002: Reland of mojo VR interface simpified. (Closed)
Patch Set: Fix Werror Created 4 years, 1 month 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
« no previous file with comments | « device/vr/vr_device_manager.h ('k') | device/vr/vr_device_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: device/vr/vr_device_manager.cc
diff --git a/device/vr/vr_device_manager.cc b/device/vr/vr_device_manager.cc
index b8c99ea3566c19e288ae011494bb6a1e7add6f04..530feb82cb083761a9a53921e48409aa2976c5f7 100644
--- a/device/vr/vr_device_manager.cc
+++ b/device/vr/vr_device_manager.cc
@@ -23,8 +23,6 @@ VRDeviceManager* g_vr_device_manager = nullptr;
VRDeviceManager::VRDeviceManager()
: vr_initialized_(false),
- presenting_service_(nullptr),
- presenting_device_(nullptr),
keep_alive_(false),
has_scheduled_poll_(false) {
// Register VRDeviceProviders for the current platform
@@ -35,8 +33,6 @@ VRDeviceManager::VRDeviceManager()
VRDeviceManager::VRDeviceManager(std::unique_ptr<VRDeviceProvider> provider)
: vr_initialized_(false),
- presenting_service_(nullptr),
- presenting_device_(nullptr),
keep_alive_(true),
has_scheduled_poll_(false) {
thread_checker_.DetachFromThread();
@@ -56,26 +52,6 @@ VRDeviceManager* VRDeviceManager::GetInstance() {
return g_vr_device_manager;
}
-// Returns the requested device with the requested id if the specified service
-// is allowed to access it.
-VRDevice* VRDeviceManager::GetAllowedDevice(VRServiceImpl* service,
- unsigned int index) {
- VRDeviceManager* device_manager = GetInstance();
-
- // If another service is presenting to the requested device don't allow other
- // services to access it. That could potentially allow them to spy on
- // where the user is looking on another page, spam another application with
- // pose resets, etc.
- if (device_manager->presenting_service_ &&
- device_manager->presenting_service_ != service) {
- if (device_manager->presenting_device_ &&
- device_manager->presenting_device_->id() == index)
- return nullptr;
- }
-
- return device_manager->GetDevice(index);
-}
-
void VRDeviceManager::SetInstance(VRDeviceManager* instance) {
// Unit tests can create multiple instances but only one should exist at any
// given time so g_vr_device_manager should only go from nullptr to
@@ -90,21 +66,20 @@ bool VRDeviceManager::HasInstance() {
}
void VRDeviceManager::AddService(VRServiceImpl* service) {
- services_.push_back(service);
+ // Loop through any currently active devices and send Connected messages to
+ // the service. Future devices that come online will send a Connected message
+ // when they are created.
+ GetVRDevices(service);
- // Ensure that the device providers are initialized
- InitializeProviders();
+ services_.push_back(service);
}
void VRDeviceManager::RemoveService(VRServiceImpl* service) {
services_.erase(std::remove(services_.begin(), services_.end(), service),
services_.end());
- if (service == presenting_service_) {
- presenting_device_->ExitPresent();
-
- presenting_service_ = nullptr;
- presenting_device_ = nullptr;
+ for (auto device : devices_) {
+ device.second->RemoveService(service);
}
if (services_.empty() && !keep_alive_) {
@@ -113,7 +88,7 @@ void VRDeviceManager::RemoveService(VRServiceImpl* service) {
}
}
-mojo::Array<VRDisplayPtr> VRDeviceManager::GetVRDevices() {
+bool VRDeviceManager::GetVRDevices(VRServiceImpl* service) {
DCHECK(thread_checker_.CalledOnValidThread());
InitializeProviders();
@@ -122,7 +97,9 @@ mojo::Array<VRDisplayPtr> VRDeviceManager::GetVRDevices() {
for (const auto& provider : providers_)
provider->GetDevices(&devices);
- mojo::Array<VRDisplayPtr> out_devices;
+ if (devices.empty())
+ return false;
+
for (auto* device : devices) {
if (device->id() == VR_DEVICE_LAST_ID)
continue;
@@ -130,17 +107,16 @@ mojo::Array<VRDisplayPtr> VRDeviceManager::GetVRDevices() {
if (devices_.find(device->id()) == devices_.end())
devices_[device->id()] = device;
- VRDisplayPtr vr_device_info = device->GetVRDevice();
- if (vr_device_info.is_null())
- continue;
+ device->AddService(service);
+ }
- // GetVRDevice should always set the index of the VRDisplay to its own id.
- DCHECK(vr_device_info->index == device->id());
+ return true;
+}
- out_devices.push_back(std::move(vr_device_info));
- }
+unsigned int VRDeviceManager::GetNumberOfConnectedDevices() {
+ DCHECK(thread_checker_.CalledOnValidThread());
- return out_devices;
+ return static_cast<unsigned int>(devices_.size());
}
VRDevice* VRDeviceManager::GetDevice(unsigned int index) {
@@ -157,143 +133,12 @@ VRDevice* VRDeviceManager::GetDevice(unsigned int index) {
return iter->second;
}
-// These dispatchers must use Clone() instead of std::move to ensure that
-// if there are multiple registered services they all get a copy of the data.
-void VRDeviceManager::OnDeviceChanged(VRDisplayPtr device) {
- for (const auto& service : services_)
- service->client()->OnDisplayChanged(device.Clone());
-}
-
-bool VRDeviceManager::RequestPresent(VRServiceImpl* service,
- unsigned int index,
- bool secure_origin) {
- // Is anything presenting currently?
- if (presenting_service_) {
- // Should never have a presenting service without a presenting device.
- DCHECK(presenting_device_);
-
- // Fail if the currently presenting service is not the one making the
- // request.
- if (presenting_service_ != service)
- return false;
-
- // If we are switching presentation from the currently presenting service to
- // a new device stop presening to the previous one.
- if (presenting_device_->id() != index) {
- // Tell the device to stop presenting.
- presenting_device_->ExitPresent();
-
- // Only the presenting service needs to be notified that presentation is
- // ending on the previous device.
- presenting_service_->client()->OnExitPresent(presenting_device_->id());
- presenting_device_ = nullptr;
- }
-
- presenting_service_ = nullptr;
- }
-
- VRDevice* requested_device = GetDevice(index);
- // Can't present to a device that doesn't exist.
- if (!requested_device)
- return false;
-
- // Attempt to begin presenting to this device. This could fail for any number
- // of device-specific reasons.
- if (!requested_device->RequestPresent(secure_origin))
- return false;
-
- // Successfully began presenting!
- presenting_service_ = service;
- presenting_device_ = requested_device;
-
- return true;
-}
-
-void VRDeviceManager::ExitPresent(VRServiceImpl* service, unsigned int index) {
- // Don't allow services other than the currently presenting one to exit
- // presentation.
- if (presenting_service_ != service)
- return;
-
- // Should never have a presenting service without a presenting device.
- DCHECK(presenting_device_);
-
- // Fail if the specified device is not currently presenting.
- if (presenting_device_->id() != index)
- return;
-
- // Tell the client we're done. This must happen before the device's
- // ExitPresent to avoid invalid mojo state.
- if (presenting_service_->client()) {
- presenting_service_->client()->OnExitPresent(index);
- }
-
- // Tell the device to stop presenting.
- presenting_device_->ExitPresent();
-
- // Clear the presenting service and device.
- presenting_service_ = nullptr;
- presenting_device_ = nullptr;
-}
-
-void VRDeviceManager::SubmitFrame(VRServiceImpl* service,
- unsigned int index,
- VRPosePtr pose) {
- // Don't allow services other than the currently presenting one to submit any
- // frames.
- if (presenting_service_ != service)
- return;
-
- // Should never have a presenting service without a presenting device.
- DCHECK(presenting_device_);
-
- // Don't submit frames to devices other than the currently presenting one.
- if (presenting_device_->id() != index)
- return;
-
- presenting_device_->SubmitFrame(std::move(pose));
-}
-
-void VRDeviceManager::OnDeviceConnectionStatusChanged(VRDevice* device,
- bool is_connected) {
- if (is_connected) {
- VRDisplayPtr vr_device_info = device->GetVRDevice();
- if (vr_device_info.is_null())
- return;
-
- vr_device_info->index = device->id();
-
- for (const auto& service : services_)
- service->client()->OnDisplayConnected(vr_device_info.Clone());
- } else {
- for (const auto& service : services_)
- service->client()->OnDisplayDisconnected(device->id());
- }
-}
-
-void VRDeviceManager::OnPresentEnded(VRDevice* device) {
- // Ensure the presenting device is the one that we've been requested to stop.
- if (!presenting_device_ || presenting_device_ != device)
- return;
-
- // Should never have a presenting device without a presenting service.
- DCHECK(presenting_service_);
-
- // Notify the presenting service that it's been forced to end presentation.
- presenting_service_->client()->OnExitPresent(device->id());
-
- // Clear the presenting service and device.
- presenting_service_ = nullptr;
- presenting_device_ = nullptr;
-}
-
void VRDeviceManager::InitializeProviders() {
if (vr_initialized_) {
return;
}
for (const auto& provider : providers_) {
- provider->SetClient(this);
provider->Initialize();
}
« no previous file with comments | « device/vr/vr_device_manager.h ('k') | device/vr/vr_device_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698