private bool PluginVersionMatchesRuntime()
        {
            VarjoVersion p = Varjo.GetPluginVersion();
            VarjoVersion r = Varjo.GetVarjoRuntimeVersion();

            return(p.major == r.major && p.minor == r.minor && p.patch == r.patch);
        }
        internal void StartMeshSubsystem()
        {
            if (!PluginVersionMatchesRuntime())
            {
                VarjoVersion p = Varjo.GetPluginVersion();
                VarjoVersion r = Varjo.GetVarjoRuntimeVersion();
                Debug.LogFormat(LogType.Error, LogOption.None, this,
                                "Failed to start experimental Varjo XR Meshing Subsystem. Experimental features in this version of the plugin can only be used with Varjo Base version {0}.{1}.{2}.\n" +
                                "Varjo Base {3}.{4}.{5} is currently installed. Install Varjo Base {0}.{1}.{2} to use experimental XR Meshing Subsystem.",
                                p.major, p.minor, p.patch, r.major, r.minor, r.patch);
                return;
            }

            m_MeshSubsystemRefCount += 1;
            if (m_MeshSubsystemRefCount == 1)
            {
                StartSubsystem <XRMeshSubsystem>();
            }
        }
        public override bool Initialize()
        {
            // Send the settings over to the native plugin
            VarjoSettings settings = GetSettings();

            if (settings != null)
            {
                UserDefinedSettings uds;
                uds.stereoRenderingMode  = (ushort)settings.StereoRenderingMode;
                uds.separateCullPass     = (ushort)(settings.SeparateCullPass ? 1 : 0);
                uds.foveatedRendering    = (ushort)(settings.FoveatedRendering ? 1 : 0);
                uds.contextScalingFactor = settings.ContextScalingFactor;
                uds.focusScalingFactor   = settings.FocusScalingFactor;
                uds.opaque          = (ushort)(settings.Opaque ? 1 : 0);
                uds.faceLocked      = (ushort)(settings.FaceLocked ? 1 : 0);
                uds.flipY           = (ushort)(settings.FlipY ? 1 : 0);
                uds.occlusionMesh   = (ushort)(settings.OcclusionMesh ? 1 : 0);
                uds.sessionPriority = settings.SessionPriority;
                uds.submitDepth     = (ushort)(settings.SubmitDepth ? 1 : 0);
                uds.depthSorting    = (ushort)(settings.DepthSorting ? 1 : 0);
                uds.depthTestRange  = (ushort)(settings.DepthTestRange ? 1 : 0);
                uds.depthTestNearZ  = settings.DepthTestNearZ;
                uds.depthTestFarZ   = settings.DepthTestFarZ;

#if !HDRP || HDRP_8_OR_NEWER
                uds.checkSinglePassValue = 1;
#else
                uds.checkSinglePassValue = 0;
#endif

                switch (settings.StereoRenderingMode)
                {
                default:
                case VarjoStereoRenderingMode.MultiPass:
                    uds.useTextureArrays = 0;
                    break;

                case VarjoStereoRenderingMode.TwoPass:
                    uds.useTextureArrays = 1;
                    break;
                }
                SetUserDefinedSettings(uds);
            }

            CreateSubsystem <XRDisplaySubsystemDescriptor, XRDisplaySubsystem>(s_DisplaySubsystemDescriptors, "VarjoDisplay");
            CreateSubsystem <XRInputSubsystemDescriptor, XRInputSubsystem>(s_InputSubsystemDescriptors, "VarjoInput");
#if VARJO_EXPERIMENTAL_FEATURES
            if (!PluginVersionMatchesRuntime())
            {
                VarjoVersion p = Varjo.GetPluginVersion();
                VarjoVersion r = Varjo.GetVarjoRuntimeVersion();
                Debug.LogFormat(LogType.Warning, LogOption.None, this,
                                "Experimental Varjo XR Meshing Subsystem can't be initialized. Experimental features in this version of the plugin can only be used with Varjo Base version {0}.{1}.{2}.\n" +
                                "Varjo Base {3}.{4}.{5} is currently installed. Install Varjo Base {0}.{1}.{2} to use experimental XR Meshing Subsystem.",
                                p.major, p.minor, p.patch, r.major, r.minor, r.patch);
            }
            else
            {
                CreateSubsystem <XRMeshSubsystemDescriptor, XRMeshSubsystem>(s_MeshSubsystemDescriptors, "VarjoMeshing");
            }
#endif
            return(true);
        }