#pragma once #include #include #include "dxvk_include.h" namespace vr { class IVRCompositor; } namespace dxvk { class DxvkInstance; /** * \brief OpenVR instance * * Loads Initializes OpenVR to provide * access to Vulkan extension queries. */ class VrInstance { public: VrInstance(); ~VrInstance(); /** * \brief Query instance extensions * \returns Instance extensions */ vk::NameSet getInstanceExtensions(); /** * \brief Query device extensions * * Retrieves the extensions required for a specific * physical device. The adapter index should remain * the same across multiple Vulkan instances. * \param [in] adapterId Adapter index */ vk::NameSet getDeviceExtensions( uint32_t adapterId); /** * \brief Initializes instance extension set * * Should be called before creating * the first Vulkan instance. */ void initInstanceExtensions(); /** * \brief Initializes device extension sets * * Should be called after setting * up the Vulkan physical devices. * \param [in] instance DXVK instance */ void initDeviceExtensions( const DxvkInstance* instance); private: std::mutex m_mutex; bool m_initializedInsExt = false; bool m_initializedDevExt = false; vk::NameSet m_insExtensions; std::vector m_devExtensions; vk::NameSet queryInstanceExtensions( vr::IVRCompositor* compositor) const; vk::NameSet queryDeviceExtensions( vr::IVRCompositor* compositor, VkPhysicalDevice adapter) const; static vk::NameSet parseExtensionList(const std::string& str); static vr::IVRCompositor* getCompositor(); }; extern VrInstance g_vrInstance; }