runtime_interface.hpp 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright (c) 2017-2023, The Khronos Group Inc.
  2. // Copyright (c) 2017-2019 Valve Corporation
  3. // Copyright (c) 2017-2019 LunarG, Inc.
  4. //
  5. // SPDX-License-Identifier: Apache-2.0 OR MIT
  6. //
  7. // Initial Author: Mark Young <[email protected]>
  8. //
  9. #pragma once
  10. #include "loader_platform.hpp"
  11. #include <openxr/openxr.h>
  12. #include <string>
  13. #include <vector>
  14. #include <unordered_map>
  15. #include <mutex>
  16. #include <memory>
  17. #ifdef XR_USE_PLATFORM_ANDROID
  18. #define XR_KHR_LOADER_INIT_SUPPORT
  19. #endif
  20. namespace Json {
  21. class Value;
  22. }
  23. #ifdef XR_KHR_LOADER_INIT_SUPPORT
  24. //! Initialize loader, where required.
  25. XrResult InitializeLoader(const XrLoaderInitInfoBaseHeaderKHR* loaderInitInfo);
  26. XrResult GetPlatformRuntimeVirtualManifest(Json::Value& out_manifest);
  27. std::string GetAndroidNativeLibraryDir();
  28. void* Android_Get_Asset_Manager();
  29. #endif
  30. class RuntimeManifestFile;
  31. struct XrGeneratedDispatchTable;
  32. class RuntimeInterface {
  33. public:
  34. virtual ~RuntimeInterface();
  35. // Helper functions for loading and unloading the runtime (but only when necessary)
  36. static XrResult LoadRuntime(const std::string& openxr_command);
  37. static void UnloadRuntime(const std::string& openxr_command);
  38. static RuntimeInterface& GetRuntime() { return *(GetInstance().get()); }
  39. static XrResult GetInstanceProcAddr(XrInstance instance, const char* name, PFN_xrVoidFunction* function);
  40. // Get the direct dispatch table to this runtime, without API layers or loader terminators.
  41. static const XrGeneratedDispatchTable* GetDispatchTable(XrInstance instance);
  42. static const XrGeneratedDispatchTable* GetDebugUtilsMessengerDispatchTable(XrDebugUtilsMessengerEXT messenger);
  43. void GetInstanceExtensionProperties(std::vector<XrExtensionProperties>& extension_properties);
  44. bool SupportsExtension(const std::string& extension_name);
  45. XrResult CreateInstance(const XrInstanceCreateInfo* info, XrInstance* instance);
  46. XrResult DestroyInstance(XrInstance instance);
  47. bool TrackDebugMessenger(XrInstance instance, XrDebugUtilsMessengerEXT messenger);
  48. void ForgetDebugMessenger(XrDebugUtilsMessengerEXT messenger);
  49. // No default construction
  50. RuntimeInterface() = delete;
  51. // Non-copyable
  52. RuntimeInterface(const RuntimeInterface&) = delete;
  53. RuntimeInterface& operator=(const RuntimeInterface&) = delete;
  54. private:
  55. RuntimeInterface(LoaderPlatformLibraryHandle runtime_library, PFN_xrGetInstanceProcAddr get_instance_proc_addr);
  56. void SetSupportedExtensions(std::vector<std::string>& supported_extensions);
  57. static XrResult TryLoadingSingleRuntime(const std::string& openxr_command, std::unique_ptr<RuntimeManifestFile>& manifest_file);
  58. static std::unique_ptr<RuntimeInterface>& GetInstance() {
  59. static std::unique_ptr<RuntimeInterface> instance;
  60. return instance;
  61. }
  62. LoaderPlatformLibraryHandle _runtime_library;
  63. PFN_xrGetInstanceProcAddr _get_instance_proc_addr;
  64. std::unordered_map<XrInstance, std::unique_ptr<XrGeneratedDispatchTable>> _dispatch_table_map;
  65. std::mutex _dispatch_table_mutex;
  66. std::unordered_map<XrDebugUtilsMessengerEXT, XrInstance> _messenger_to_instance_map;
  67. std::mutex _messenger_to_instance_mutex;
  68. std::vector<std::string> _supported_extensions;
  69. };