public override bool Initialize()
        {
            if (IsDeviceSupported() != DeviceSupportedResult.Supported
#if UNITY_EDITOR_WIN
                || SystemInfo.graphicsDeviceType != GraphicsDeviceType.Direct3D11
#endif
                )
            {
                return(false);
            }

#if UNITY_INPUT_SYSTEM
            InputLayoutLoader.RegisterInputLayouts();
#endif // UNITY_INPUT_SYSTEM

            OculusSettings settings = GetSettings();
            if (settings != null)
            {
                NativeMethods.UserDefinedSettings userDefinedSettings;
                userDefinedSettings.sharedDepthBuffer      = (ushort)(settings.SharedDepthBuffer ? 1 : 0);
                userDefinedSettings.dashSupport            = (ushort)(settings.DashSupport ? 1 : 0);
                userDefinedSettings.stereoRenderingMode    = (ushort)settings.GetStereoRenderingMode();
                userDefinedSettings.colorSpace             = (ushort)((QualitySettings.activeColorSpace == ColorSpace.Linear) ? 1 : 0);
                userDefinedSettings.lowOverheadMode        = (ushort)(settings.LowOverheadMode ? 1 : 0);
                userDefinedSettings.protectedContext       = (ushort)(settings.ProtectedContext ? 1 : 0);
                userDefinedSettings.focusAware             = (ushort)(settings.FocusAware ? 1 : 0);
                userDefinedSettings.optimizeBufferDiscards = (ushort)(settings.OptimizeBufferDiscards ? 1 : 0);
                userDefinedSettings.phaseSync        = (ushort)(settings.PhaseSync ? 1 : 0);
                userDefinedSettings.subsampledLayout = (ushort)(settings.SubsampledLayout ? 1 : 0);
                NativeMethods.SetUserDefinedSettings(userDefinedSettings);
            }

            CreateSubsystem <XRDisplaySubsystemDescriptor, XRDisplaySubsystem>(s_DisplaySubsystemDescriptors, "oculus display");
            CreateSubsystem <XRInputSubsystemDescriptor, XRInputSubsystem>(s_InputSubsystemDescriptors, "oculus input");

            if (displaySubsystem == null && inputSubsystem == null)
            {
#if (UNITY_ANDROID && !UNITY_EDITOR)
                Debug.LogWarning("Unable to start Oculus XR Plugin.");
#else
                Debug.LogWarning("Unable to start Oculus XR Plugin.\n" +
                                 "Possible causes include a headset not being attached, or the Oculus runtime is not installed or up to date.\n" +
                                 "If you've recently installed or updated the Oculus runtime, you may need to reboot or close Unity and the Unity Hub and try again.");
#endif
            }
            else if (displaySubsystem == null)
            {
                Debug.LogError("Unable to start Oculus XR Plugin. Failed to load display subsystem.");
            }
            else if (inputSubsystem == null)
            {
                Debug.LogError("Unable to start Oculus XR Plugin. Failed to load input subsystem.");
            }
            else
            {
                RegisterUpdateCallback.Initialize();
            }

            return(displaySubsystem != null && inputSubsystem != null);
        }
        public override bool Deinitialize()
        {
            RegisterUpdateCallback.Deinitialize();

            DestroySubsystem <XRDisplaySubsystem>();
            DestroySubsystem <XRInputSubsystem>();

            return(true);
        }