@@ -79,6 +79,8 @@ static void load_debug_privilege(void) {
7979
8080class DriverProvider : public vr ::IServerTrackedDeviceProvider {
8181public:
82+ bool early_hmd_initialization = false ;
83+
8284 std::unique_ptr<Hmd> hmd;
8385 std::unique_ptr<Controller> left_controller, right_controller;
8486 std::unique_ptr<Controller> left_hand_tracker, right_hand_tracker;
@@ -94,6 +96,15 @@ class DriverProvider : public vr::IServerTrackedDeviceProvider {
9496 VR_INIT_SERVER_DRIVER_CONTEXT (pContext);
9597 InitDriverLog (vr::VRDriverLog ());
9698
99+ if (this ->early_hmd_initialization ) {
100+ auto hmd = new Hmd ();
101+ // Note: we disable awaiting for Acivate() call. That will only be called after
102+ // IServerTrackedDeviceProvider::Init() (this function) returns.
103+ hmd->register_device (false );
104+ this ->hmd = std::unique_ptr<Hmd>(hmd);
105+ this ->tracked_devices .insert ({ HEAD_ID, this ->hmd .get () });
106+ }
107+
97108 return vr::VRInitError_None;
98109 }
99110 virtual void Cleanup () override {
@@ -210,7 +221,9 @@ void (*SetOpenvrProps)(void* instancePtr, unsigned long long deviceID);
210221void (*RegisterButtons)(void * instancePtr, unsigned long long deviceID);
211222void (*WaitForVSync)();
212223
213- void CppInit () {
224+ void CppInit (bool earlyHmdInitialization) {
225+ g_driver_provider.early_hmd_initialization = earlyHmdInitialization;
226+
214227 HookCrashHandler ();
215228
216229 // Initialize path constants
@@ -235,13 +248,15 @@ bool InitializeStreaming() {
235248 Settings::Instance ().Load ();
236249
237250 if (!g_driver_provider.devices_initialized ) {
238- auto hmd = new Hmd ();
239- if (!hmd->register_device ()) {
240- Error (" Failed to register HMD" );
241- return false ;
251+ if (!g_driver_provider.early_hmd_initialization ) {
252+ auto hmd = new Hmd ();
253+ if (!hmd->register_device (false )) {
254+ Error (" Failed to register HMD" );
255+ return false ;
256+ }
257+ g_driver_provider.hmd = std::unique_ptr<Hmd>(hmd);
258+ g_driver_provider.tracked_devices .insert ({ HEAD_ID, g_driver_provider.hmd .get () });
242259 }
243- g_driver_provider.hmd = std::unique_ptr<Hmd>(hmd);
244- g_driver_provider.tracked_devices .insert ({ HEAD_ID, g_driver_provider.hmd .get () });
245260
246261 // Note: for controllers, hands and trackers don't bail out if registration fails
247262 if (Settings::Instance ().m_enableControllers ) {
@@ -250,15 +265,15 @@ bool InitializeStreaming() {
250265 : vr::VRSkeletalTracking_Partial;
251266
252267 auto left_controller = new Controller (HAND_LEFT_ID, controllerSkeletonLevel);
253- if (left_controller->register_device ()) {
268+ if (left_controller->register_device (true )) {
254269 g_driver_provider.left_controller = std::unique_ptr<Controller>(left_controller);
255270 g_driver_provider.tracked_devices .insert (
256271 { HAND_LEFT_ID, g_driver_provider.left_controller .get () }
257272 );
258273 }
259274
260275 auto right_controller = new Controller (HAND_RIGHT_ID, controllerSkeletonLevel);
261- if (right_controller->register_device ()) {
276+ if (right_controller->register_device (true )) {
262277 g_driver_provider.right_controller = std::unique_ptr<Controller>(right_controller);
263278 g_driver_provider.tracked_devices .insert (
264279 { HAND_RIGHT_ID, g_driver_provider.right_controller .get () }
@@ -268,7 +283,7 @@ bool InitializeStreaming() {
268283 if (Settings::Instance ().m_useSeparateHandTrackers ) {
269284 auto left_hand_tracker
270285 = new Controller (HAND_TRACKER_LEFT_ID, vr::VRSkeletalTracking_Full);
271- if (left_hand_tracker->register_device ()) {
286+ if (left_hand_tracker->register_device (true )) {
272287 g_driver_provider.left_hand_tracker
273288 = std::unique_ptr<Controller>(left_hand_tracker);
274289 g_driver_provider.tracked_devices .insert (
@@ -278,7 +293,7 @@ bool InitializeStreaming() {
278293
279294 auto right_hand_tracker
280295 = new Controller (HAND_TRACKER_RIGHT_ID, vr::VRSkeletalTracking_Full);
281- if (right_hand_tracker->register_device ()) {
296+ if (right_hand_tracker->register_device (true )) {
282297 g_driver_provider.right_hand_tracker
283298 = std::unique_ptr<Controller>(right_hand_tracker);
284299 g_driver_provider.tracked_devices .insert (
@@ -290,55 +305,55 @@ bool InitializeStreaming() {
290305
291306 if (Settings::Instance ().m_enableBodyTrackingFakeVive ) {
292307 auto chestTracker = std::make_unique<FakeViveTracker>(BODY_CHEST_ID);
293- if (chestTracker->register_device ()) {
308+ if (chestTracker->register_device (true )) {
294309 g_driver_provider.tracked_devices .insert ({ BODY_CHEST_ID, chestTracker.get () });
295310 g_driver_provider.generic_trackers .push_back (std::move (chestTracker));
296311 }
297312
298313 auto waistTracker = std::make_unique<FakeViveTracker>(BODY_HIPS_ID);
299- if (waistTracker->register_device ()) {
314+ if (waistTracker->register_device (true )) {
300315 g_driver_provider.tracked_devices .insert ({ BODY_HIPS_ID, waistTracker.get () });
301316 g_driver_provider.generic_trackers .push_back (std::move (waistTracker));
302317 }
303318
304319 auto leftElbowTracker = std::make_unique<FakeViveTracker>(BODY_LEFT_ELBOW_ID);
305- if (leftElbowTracker->register_device ()) {
320+ if (leftElbowTracker->register_device (true )) {
306321 g_driver_provider.tracked_devices .insert ({ BODY_LEFT_ELBOW_ID,
307322 leftElbowTracker.get () });
308323 g_driver_provider.generic_trackers .push_back (std::move (leftElbowTracker));
309324 }
310325
311326 auto rightElbowTracker = std::make_unique<FakeViveTracker>(BODY_RIGHT_ELBOW_ID);
312- if (rightElbowTracker->register_device ()) {
327+ if (rightElbowTracker->register_device (true )) {
313328 g_driver_provider.tracked_devices .insert ({ BODY_RIGHT_ELBOW_ID,
314329 rightElbowTracker.get () });
315330 g_driver_provider.generic_trackers .push_back (std::move (rightElbowTracker));
316331 }
317332
318333 if (Settings::Instance ().m_bodyTrackingHasLegs ) {
319334 auto leftKneeTracker = std::make_unique<FakeViveTracker>(BODY_LEFT_KNEE_ID);
320- if (leftKneeTracker->register_device ()) {
335+ if (leftKneeTracker->register_device (true )) {
321336 g_driver_provider.tracked_devices .insert ({ BODY_LEFT_KNEE_ID,
322337 leftKneeTracker.get () });
323338 g_driver_provider.generic_trackers .push_back (std::move (leftKneeTracker));
324339 }
325340
326341 auto leftFootTracker = std::make_unique<FakeViveTracker>(BODY_LEFT_FOOT_ID);
327- if (leftFootTracker->register_device ()) {
342+ if (leftFootTracker->register_device (true )) {
328343 g_driver_provider.tracked_devices .insert ({ BODY_LEFT_FOOT_ID,
329344 leftFootTracker.get () });
330345 g_driver_provider.generic_trackers .push_back (std::move (leftFootTracker));
331346 }
332347
333348 auto rightKneeTracker = std::make_unique<FakeViveTracker>(BODY_RIGHT_KNEE_ID);
334- if (rightKneeTracker->register_device ()) {
349+ if (rightKneeTracker->register_device (true )) {
335350 g_driver_provider.tracked_devices .insert ({ BODY_RIGHT_KNEE_ID,
336351 rightKneeTracker.get () });
337352 g_driver_provider.generic_trackers .push_back (std::move (rightKneeTracker));
338353 }
339354
340355 auto rightFootTracker = std::make_unique<FakeViveTracker>(BODY_RIGHT_FOOT_ID);
341- if (rightFootTracker->register_device ()) {
356+ if (rightFootTracker->register_device (true )) {
342357 g_driver_provider.tracked_devices .insert ({ BODY_RIGHT_FOOT_ID,
343358 rightFootTracker.get () });
344359 g_driver_provider.generic_trackers .push_back (std::move (rightFootTracker));
0 commit comments