OpenXRVkInstance.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <OpenXRVk/OpenXRVkInstance.h>
  9. #include <OpenXRVk/OpenXRVkUtils.h>
  10. #include <Atom/RHI.Reflect/Vulkan/XRVkDescriptors.h>
  11. #include <Atom/RHI.Reflect/VkAllocator.h>
  12. #include <AzCore/Casting/numeric_cast.h>
  13. #include <OpenXRVkCommon.h>
  14. namespace OpenXRVk
  15. {
  16. XR::Ptr<Instance> Instance::Create()
  17. {
  18. return aznew Instance;
  19. }
  20. XR::StringList Instance::GetInstanceExtensionNames(const char* layerName /*= nullptr*/) const
  21. {
  22. XR::StringList extensionNames;
  23. AZ::u32 extPropertyCount = 0;
  24. XrResult result = xrEnumerateInstanceExtensionProperties(layerName, 0, &extPropertyCount, nullptr);
  25. if (IsError(result) || extPropertyCount == 0)
  26. {
  27. return extensionNames;
  28. }
  29. AZStd::vector<XrExtensionProperties> extProperties;
  30. extProperties.resize(extPropertyCount);
  31. for (XrExtensionProperties& extension : extProperties)
  32. {
  33. extension.type = XR_TYPE_EXTENSION_PROPERTIES;
  34. }
  35. result = xrEnumerateInstanceExtensionProperties(layerName, aznumeric_cast<AZ::u32>(extProperties.size()), &extPropertyCount, extProperties.data());
  36. if (IsError(result))
  37. {
  38. return extensionNames;
  39. }
  40. extensionNames.reserve(extensionNames.size() + extProperties.size());
  41. for (uint32_t extPropertyIndex = 0; extPropertyIndex < extPropertyCount; extPropertyIndex++)
  42. {
  43. extensionNames.emplace_back(extProperties[extPropertyIndex].extensionName);
  44. }
  45. return extensionNames;
  46. }
  47. XR::StringList Instance::GetInstanceLayerNames() const
  48. {
  49. XR::StringList layerNames;
  50. AZ::u32 layerPropertyCount = 0;
  51. XrResult result = xrEnumerateApiLayerProperties(0, &layerPropertyCount, nullptr);
  52. if (IsError(result) || layerPropertyCount == 0)
  53. {
  54. return layerNames;
  55. }
  56. AZStd::vector<XrApiLayerProperties> layerProperties(layerPropertyCount);
  57. for (XrApiLayerProperties& layer : layerProperties)
  58. {
  59. layer.type = XR_TYPE_API_LAYER_PROPERTIES;
  60. }
  61. result = xrEnumerateApiLayerProperties(aznumeric_cast<AZ::u32>(layerProperties.size()), &layerPropertyCount, layerProperties.data());
  62. if (IsError(result))
  63. {
  64. return layerNames;
  65. }
  66. layerNames.reserve(layerNames.size() + layerProperties.size());
  67. for (uint32_t layerPropertyIndex = 0; layerPropertyIndex < layerPropertyCount; ++layerPropertyIndex)
  68. {
  69. layerNames.emplace_back(layerProperties[layerPropertyIndex].layerName);
  70. }
  71. return layerNames;
  72. }
  73. AZ::RHI::ResultCode Instance::InitInstanceInternal()
  74. {
  75. if (!Platform::OpenXRInitializeLoader())
  76. {
  77. AZ_Error("OpenXRVk", false, "Could not initialize xr loader.");
  78. return AZ::RHI::ResultCode::Fail;
  79. }
  80. XR::RawStringList optionalLayers;
  81. XR::RawStringList optionalExtensions = { XR_KHR_VULKAN_ENABLE_EXTENSION_NAME };
  82. XR::StringList instanceLayerNames = GetInstanceLayerNames();
  83. XR::RawStringList supportedLayers = FilterList(optionalLayers, instanceLayerNames);
  84. m_requiredLayers.insert(m_requiredLayers.end(), supportedLayers.begin(), supportedLayers.end());
  85. XR::StringList instanceExtensions = GetInstanceExtensionNames();
  86. XR::RawStringList supportedExtensions = FilterList(optionalExtensions, instanceExtensions);
  87. m_requiredExtensions.insert(m_requiredExtensions.end(), supportedExtensions.begin(), supportedExtensions.end());
  88. if (m_validationMode == AZ::RHI::ValidationMode::Enabled)
  89. {
  90. AZ_Printf("OpenXRVk", "Available Extensions: (%i)\n", instanceExtensions.size());
  91. for (const AZStd::string& extension : instanceExtensions)
  92. {
  93. AZ_Printf("OpenXRVk", "Name=%s\n", extension.c_str());
  94. }
  95. AZ_Printf("OpenXRVk", "Extensions to enable: (%i)\n", m_requiredExtensions.size());
  96. for (const char* extension : m_requiredExtensions)
  97. {
  98. AZ_Printf("OpenXRVk", "Name=%s\n", extension);
  99. }
  100. AZ_Printf("OpenXRVk", "Available Layers: (%i)\n", instanceLayerNames.size());
  101. for (const AZStd::string& layerName : instanceLayerNames)
  102. {
  103. AZ_Printf("OpenXRVk", "Name=%s \n", layerName.c_str());
  104. }
  105. }
  106. AZ_Assert(m_xrInstance == XR_NULL_HANDLE, "XR Instance is already initialized");
  107. XrInstanceCreateInfo createInfo{ XR_TYPE_INSTANCE_CREATE_INFO };
  108. createInfo.next = nullptr;
  109. createInfo.enabledExtensionCount = aznumeric_cast<AZ::u32>(m_requiredExtensions.size());
  110. createInfo.enabledExtensionNames = m_requiredExtensions.data();
  111. createInfo.enabledApiLayerCount = aznumeric_cast<AZ::u32>(supportedLayers.size());
  112. createInfo.enabledApiLayerNames = supportedLayers.data();
  113. azstrncpy(createInfo.applicationInfo.applicationName, XR_MAX_APPLICATION_NAME_SIZE, "O3deApp", 4);
  114. createInfo.applicationInfo.apiVersion = XR_CURRENT_API_VERSION;
  115. //Create XR instance
  116. XrResult result = xrCreateInstance(&createInfo, &m_xrInstance);
  117. if(IsError(result))
  118. {
  119. AZ_Warning("OpenXRVk", false, "Failed to create XR instance");
  120. return AZ::RHI::ResultCode::Fail;
  121. }
  122. if (m_validationMode == AZ::RHI::ValidationMode::Enabled)
  123. {
  124. XrInstanceProperties instanceProperties{ XR_TYPE_INSTANCE_PROPERTIES };
  125. result = xrGetInstanceProperties(m_xrInstance, &instanceProperties);
  126. if (IsSuccess(result))
  127. {
  128. AZStd::string verStr = AZStd::string::format("%d.%d.%d",
  129. XR_VERSION_MAJOR(instanceProperties.runtimeVersion),
  130. XR_VERSION_MINOR(instanceProperties.runtimeVersion),
  131. XR_VERSION_PATCH(instanceProperties.runtimeVersion));
  132. AZ_Printf("OpenXRVk", "Instance RuntimeName=%s RuntimeVersion=%s\n", instanceProperties.runtimeName, verStr.c_str());
  133. }
  134. }
  135. AZ_Assert(m_xrInstance != XR_NULL_HANDLE, "XR Instance is Null");
  136. AZ_Assert(m_xrSystemId == XR_NULL_SYSTEM_ID, "XR System id already initialized");
  137. //TODO::Add support for handheld display
  138. m_formFactor = XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY;
  139. XrSystemGetInfo systemInfo{ XR_TYPE_SYSTEM_GET_INFO };
  140. systemInfo.formFactor = m_formFactor;
  141. result = xrGetSystem(m_xrInstance, &systemInfo, &m_xrSystemId);
  142. if (IsError(result))
  143. {
  144. AZ_Warning("OpenXRVk", false, "Failed to get XR System id");
  145. return AZ::RHI::ResultCode::Fail;
  146. }
  147. //TODO::Add support for other view configuration types
  148. m_viewConfigType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
  149. m_viewCount = 0;
  150. result = xrEnumerateViewConfigurationViews(m_xrInstance, m_xrSystemId, m_viewConfigType, 0, &m_viewCount, nullptr);
  151. if (IsError(result))
  152. {
  153. PrintXrError("OpenXRVk", result, "Failed to read the number of views for the configuration type: %u.", aznumeric_cast<uint32_t>(m_viewConfigType));
  154. return AZ::RHI::ResultCode::Fail;
  155. }
  156. AZ_Assert(m_viewCount > 0, "View count should be greater than 0.");
  157. //TODO::Add support for other environment blend types
  158. m_environmentBlendMode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE;
  159. // Query the runtime Vulkan API version requirements
  160. XrGraphicsRequirementsVulkan2KHR graphicsRequirements{ XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN2_KHR };
  161. PFN_xrGetVulkanGraphicsRequirementsKHR pfnGetVulkanGraphicsRequirementsKHR = nullptr;
  162. result = xrGetInstanceProcAddr(m_xrInstance, "xrGetVulkanGraphicsRequirementsKHR",
  163. reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanGraphicsRequirementsKHR));
  164. WARN_IF_UNSUCCESSFUL(result);
  165. XrGraphicsRequirementsVulkanKHR legacyRequirements{ XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR };
  166. result = pfnGetVulkanGraphicsRequirementsKHR(m_xrInstance, m_xrSystemId, &legacyRequirements);
  167. WARN_IF_UNSUCCESSFUL(result);
  168. graphicsRequirements.maxApiVersionSupported = legacyRequirements.maxApiVersionSupported;
  169. graphicsRequirements.minApiVersionSupported = legacyRequirements.minApiVersionSupported;
  170. m_minVulkanAPIVersion = VK_MAKE_API_VERSION(
  171. 0,
  172. XR_VERSION_MAJOR(graphicsRequirements.minApiVersionSupported),
  173. XR_VERSION_MINOR(graphicsRequirements.minApiVersionSupported),
  174. XR_VERSION_PATCH(graphicsRequirements.minApiVersionSupported));
  175. m_maxVulkanAPIVersion = VK_MAKE_API_VERSION(
  176. 0,
  177. XR_VERSION_MAJOR(graphicsRequirements.maxApiVersionSupported),
  178. XR_VERSION_MINOR(graphicsRequirements.maxApiVersionSupported),
  179. XR_VERSION_PATCH(graphicsRequirements.maxApiVersionSupported));
  180. if (m_validationMode == AZ::RHI::ValidationMode::Enabled)
  181. {
  182. AZ_Printf("OpenXRVk", "graphicsRequirements.maxApiVersionSupported %d.%d.%d\n",
  183. XR_VERSION_MAJOR(graphicsRequirements.maxApiVersionSupported),
  184. XR_VERSION_MINOR(graphicsRequirements.maxApiVersionSupported),
  185. XR_VERSION_PATCH(graphicsRequirements.maxApiVersionSupported));
  186. AZ_Printf("OpenXRVk", "graphicsRequirements.minApiVersionSupported %d.%d.%d\n",
  187. XR_VERSION_MAJOR(graphicsRequirements.minApiVersionSupported),
  188. XR_VERSION_MINOR(graphicsRequirements.minApiVersionSupported),
  189. XR_VERSION_PATCH(graphicsRequirements.minApiVersionSupported));
  190. AZ_Printf("OpenXRVk", "Using system %d for form factor %s\n", m_xrSystemId, to_string(m_formFactor));
  191. LogViewConfigurations();
  192. }
  193. PFN_xrGetVulkanInstanceExtensionsKHR pfnGetVulkanInstanceExtensionsKHR = nullptr;
  194. result = xrGetInstanceProcAddr(m_xrInstance, "xrGetVulkanInstanceExtensionsKHR", reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanInstanceExtensionsKHR));
  195. ASSERT_IF_UNSUCCESSFUL(result);
  196. AZ::u32 extensionNamesSize = 0;
  197. result = pfnGetVulkanInstanceExtensionsKHR(m_xrInstance, m_xrSystemId, 0, &extensionNamesSize, nullptr);
  198. ASSERT_IF_UNSUCCESSFUL(result);
  199. AZStd::vector<char> extensionNames(extensionNamesSize);
  200. result = pfnGetVulkanInstanceExtensionsKHR(m_xrInstance, m_xrSystemId, extensionNamesSize, &extensionNamesSize, &extensionNames[0]);
  201. ASSERT_IF_UNSUCCESSFUL(result);
  202. AZStd::vector<const char*> requiredInstanceExtensions = ParseExtensionString(&extensionNames[0]);
  203. m_requireVulkanInstanceExtensions.insert(m_requireVulkanInstanceExtensions.end(), requiredInstanceExtensions.begin(), requiredInstanceExtensions.end());
  204. if (m_validationMode == AZ::RHI::ValidationMode::Enabled)
  205. {
  206. AZ_Printf("OpenXRVk", "Vulkan instance extensions to enable: (%i)\n", requiredInstanceExtensions.size());
  207. for (const AZStd::string& extension : requiredInstanceExtensions)
  208. {
  209. AZ_Printf("OpenXRVk", "Name=%s\n", extension.c_str());
  210. }
  211. }
  212. AZ::Vulkan::InstanceRequirementBus::Handler::BusConnect();
  213. PFN_xrGetVulkanDeviceExtensionsKHR pfnGetVulkanDeviceExtensionsKHR = nullptr;
  214. result = xrGetInstanceProcAddr(
  215. m_xrInstance,
  216. "xrGetVulkanDeviceExtensionsKHR",
  217. reinterpret_cast<PFN_xrVoidFunction*>(&pfnGetVulkanDeviceExtensionsKHR));
  218. ASSERT_IF_UNSUCCESSFUL(result);
  219. AZ::u32 deviceExtensionNamesSize = 0;
  220. result = pfnGetVulkanDeviceExtensionsKHR(m_xrInstance, m_xrSystemId, 0, &deviceExtensionNamesSize, nullptr);
  221. ASSERT_IF_UNSUCCESSFUL(result);
  222. AZStd::vector<char> deviceExtensionNames(deviceExtensionNamesSize);
  223. result = pfnGetVulkanDeviceExtensionsKHR(
  224. m_xrInstance, m_xrSystemId, deviceExtensionNamesSize, &deviceExtensionNamesSize, &deviceExtensionNames[0]);
  225. ASSERT_IF_UNSUCCESSFUL(result);
  226. AZStd::vector<const char*> requiredDeviceExtensions = ParseExtensionString(&deviceExtensionNames[0]);
  227. m_requireVulkanDeviceExtensions.insert(m_requireVulkanDeviceExtensions.end(), requiredDeviceExtensions.begin(), requiredDeviceExtensions.end());
  228. if (m_validationMode == AZ::RHI::ValidationMode::Enabled)
  229. {
  230. AZ_Printf("OpenXRVk", "Vulkan device extensions to enable: (%i)\n", requiredDeviceExtensions.size());
  231. for (const AZStd::string& extension : requiredDeviceExtensions)
  232. {
  233. AZ_Printf("OpenXRVk", "Name=%s\n", extension.c_str());
  234. }
  235. }
  236. AZ::Vulkan::DeviceRequirementBus::Handler::BusConnect();
  237. AZ::Vulkan::InstanceNotificationBus::Handler::BusConnect();
  238. return AZ::RHI::ResultCode::Success;
  239. }
  240. void Instance::LogViewConfigurations()
  241. {
  242. AZ::u32 viewConfigTypeCount = 0;
  243. XrResult result = xrEnumerateViewConfigurations(m_xrInstance, m_xrSystemId, 0, &viewConfigTypeCount, nullptr);
  244. RETURN_IF_UNSUCCESSFUL(result);
  245. AZStd::vector<XrViewConfigurationType> viewConfigTypes(viewConfigTypeCount);
  246. result = xrEnumerateViewConfigurations(m_xrInstance, m_xrSystemId, viewConfigTypeCount, &viewConfigTypeCount, viewConfigTypes.data());
  247. RETURN_IF_UNSUCCESSFUL(result);
  248. AZ_Warning("OpenXRVk", aznumeric_cast<AZ::u32>(viewConfigTypes.size()) == viewConfigTypeCount, "Size Mismatch");
  249. AZ_Printf("OpenXRVk", "Available View Configuration Types: (%d)\n", viewConfigTypeCount);
  250. for (XrViewConfigurationType viewConfigType : viewConfigTypes)
  251. {
  252. AZ_Printf("OpenXRVk", "View Configuration Type: %s %s\n", to_string(viewConfigType),
  253. viewConfigType == m_viewConfigType ? "(Selected)" : "");
  254. XrViewConfigurationProperties viewConfigProperties{ XR_TYPE_VIEW_CONFIGURATION_PROPERTIES };
  255. result = xrGetViewConfigurationProperties(m_xrInstance, m_xrSystemId, viewConfigType, &viewConfigProperties);
  256. RETURN_IF_UNSUCCESSFUL(result);
  257. AZ_Printf("OpenXRVk", "View configuration FovMutable=%s\n", viewConfigProperties.fovMutable == XR_TRUE ? "True" : "False");
  258. AZ::u32 viewCount = 0;
  259. result = xrEnumerateViewConfigurationViews(m_xrInstance, m_xrSystemId, viewConfigType, 0, &viewCount, nullptr);
  260. RETURN_IF_UNSUCCESSFUL(result);
  261. if (viewCount > 0)
  262. {
  263. AZStd::vector<XrViewConfigurationView> views(viewCount);
  264. for (XrViewConfigurationView& view : views)
  265. {
  266. view.type = XR_TYPE_VIEW_CONFIGURATION_VIEW;
  267. }
  268. result = xrEnumerateViewConfigurationViews(m_xrInstance, m_xrSystemId, viewConfigType, viewCount, &viewCount, views.data());
  269. RETURN_IF_UNSUCCESSFUL(result);
  270. for (uint32_t i = 0; i < views.size(); i++)
  271. {
  272. const XrViewConfigurationView& view = views[i];
  273. AZ_Printf(
  274. "OpenXRVk", "View [%d]: Recommended Width=%d Height=%d SampleCount=%d\n", i, view.recommendedImageRectWidth,
  275. view.recommendedImageRectHeight, view.recommendedSwapchainSampleCount);
  276. AZ_Printf(
  277. "OpenXRVk", "View [%d]: Maximum Width=%d Height=%d SampleCount=%d\n", i, view.maxImageRectWidth,
  278. view.maxImageRectHeight, view.maxSwapchainSampleCount);
  279. }
  280. }
  281. else
  282. {
  283. AZ_Printf("OpenXRVk", "Empty view configuration type\n");
  284. }
  285. LogEnvironmentBlendMode(viewConfigType);
  286. }
  287. }
  288. void Instance::LogEnvironmentBlendMode(XrViewConfigurationType type)
  289. {
  290. AZ::u32 count = 0;
  291. XrResult result = xrEnumerateEnvironmentBlendModes(m_xrInstance, m_xrSystemId, type, 0, &count, nullptr);
  292. AZ_Warning("OpenXRVk", count > 0, "BlendModes not supported");
  293. RETURN_IF_UNSUCCESSFUL(result);
  294. AZ_Printf("OpenXRVk", "Available Environment Blend Mode count : (%d)\n", count);
  295. AZStd::vector<XrEnvironmentBlendMode> blendModes(count);
  296. result = xrEnumerateEnvironmentBlendModes(m_xrInstance, m_xrSystemId, type, count, &count, blendModes.data());
  297. RETURN_IF_UNSUCCESSFUL(result);
  298. [[maybe_unused]] bool blendModeFound = false;
  299. for (XrEnvironmentBlendMode mode : blendModes)
  300. {
  301. const bool blendModeMatch = (mode == m_environmentBlendMode);
  302. AZ_Printf("OpenXRVk", "Environment Blend Mode (%s) : %s\n", to_string(mode), blendModeMatch ? "(Selected)" : "");
  303. blendModeFound |= blendModeMatch;
  304. }
  305. }
  306. void Instance::ShutdownInternal()
  307. {
  308. AZ::Vulkan::InstanceNotificationBus::Handler::BusDisconnect();
  309. AZ::Vulkan::DeviceRequirementBus::Handler::BusDisconnect();
  310. AZ::Vulkan::InstanceRequirementBus::Handler::BusDisconnect();
  311. m_supportedXRDevices.clear();
  312. m_xrVkInstance = VK_NULL_HANDLE;
  313. }
  314. void Instance::CollectAdditionalRequiredInstanceExtensions(AZStd::vector<AZStd::string>& extensions)
  315. {
  316. extensions.insert(extensions.end(), m_requireVulkanInstanceExtensions.begin(), m_requireVulkanInstanceExtensions.end());
  317. }
  318. void Instance::CollectMinMaxVulkanAPIVersions(AZStd::vector<uint32_t>& min, AZStd::vector<uint32_t>& max)
  319. {
  320. min.push_back(m_minVulkanAPIVersion);
  321. max.push_back(m_maxVulkanAPIVersion);
  322. }
  323. void Instance::CollectAdditionalRequiredDeviceExtensions(AZStd::vector<AZStd::string>& extensions)
  324. {
  325. extensions.insert(extensions.end(), m_requireVulkanDeviceExtensions.begin(), m_requireVulkanDeviceExtensions.end());
  326. }
  327. void Instance::FilterSupportedDevices(AZStd::vector<VkPhysicalDevice>& supportedDevices)
  328. {
  329. AZStd::erase_if(supportedDevices, [&](const auto& physicalDevice)
  330. {
  331. return AZStd::find(m_supportedXRDevices.begin(), m_supportedXRDevices.end(), physicalDevice) == m_supportedXRDevices.end();
  332. });
  333. }
  334. void Instance::OnInstanceCreated(VkInstance instance)
  335. {
  336. m_xrVkInstance = instance;
  337. m_supportedXRDevices = PhysicalDevice::EnumerateDeviceList(m_xrSystemId, m_xrInstance, m_xrVkInstance);
  338. }
  339. void Instance::OnInstanceDestroyed()
  340. {
  341. m_xrVkInstance = XR_NULL_HANDLE;
  342. m_supportedXRDevices.clear();
  343. }
  344. AZ::RHI::ResultCode Instance::GetXRPhysicalDevice(AZ::RHI::XRPhysicalDeviceDescriptor* physicalDeviceDescriptor, int32_t index)
  345. {
  346. AZ::Vulkan::XRPhysicalDeviceDescriptor* xrPhysicalDeviceDescriptor = static_cast<AZ::Vulkan::XRPhysicalDeviceDescriptor*>(physicalDeviceDescriptor);
  347. if (xrPhysicalDeviceDescriptor && (index < m_supportedXRDevices.size()))
  348. {
  349. xrPhysicalDeviceDescriptor->m_outputData.m_xrVkPhysicalDevice = m_supportedXRDevices[index];
  350. return AZ::RHI::ResultCode::Success;
  351. }
  352. return AZ::RHI::ResultCode::Fail;
  353. }
  354. AZ::u32 Instance::GetNumPhysicalDevices() const
  355. {
  356. return aznumeric_cast<AZ::u32>(m_supportedXRDevices.size());
  357. }
  358. XrInstance Instance::GetXRInstance() const
  359. {
  360. return m_xrInstance;
  361. }
  362. XrSystemId Instance::GetXRSystemId() const
  363. {
  364. return m_xrSystemId;
  365. }
  366. VkInstance Instance::GetNativeInstance() const
  367. {
  368. return m_xrVkInstance;
  369. }
  370. XrEnvironmentBlendMode Instance::GetEnvironmentBlendMode() const
  371. {
  372. return m_environmentBlendMode;
  373. }
  374. XrViewConfigurationType Instance::GetViewConfigType() const
  375. {
  376. return m_viewConfigType;
  377. }
  378. uint32_t Instance::GetViewCount() const
  379. {
  380. return m_viewCount;
  381. }
  382. }