Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/openxr/src/loader/manifest_file.hpp
9917 views
1
// Copyright (c) 2017-2025 The Khronos Group Inc.
2
// Copyright (c) 2017 Valve Corporation
3
// Copyright (c) 2017 LunarG, Inc.
4
//
5
// SPDX-License-Identifier: Apache-2.0 OR MIT
6
//
7
// Initial Author: Mark Young <[email protected]>
8
//
9
10
#pragma once
11
12
#include <openxr/openxr.h>
13
14
#include <memory>
15
#include <string>
16
#include <vector>
17
#include <iosfwd>
18
#include <unordered_map>
19
20
namespace Json {
21
class Value;
22
}
23
24
enum ManifestFileType {
25
MANIFEST_TYPE_UNDEFINED = 0,
26
MANIFEST_TYPE_RUNTIME,
27
MANIFEST_TYPE_IMPLICIT_API_LAYER,
28
MANIFEST_TYPE_EXPLICIT_API_LAYER,
29
};
30
31
struct JsonVersion {
32
uint32_t major;
33
uint32_t minor;
34
uint32_t patch;
35
};
36
37
struct ExtensionListing {
38
std::string name;
39
uint32_t extension_version;
40
};
41
42
// ManifestFile class -
43
// Base class responsible for finding and parsing manifest files.
44
class ManifestFile {
45
public:
46
// Non-copyable
47
ManifestFile(const ManifestFile &) = delete;
48
ManifestFile &operator=(const ManifestFile &) = delete;
49
50
ManifestFileType Type() const { return _type; }
51
const std::string &Filename() const { return _filename; }
52
const std::string &LibraryPath() const { return _library_path; }
53
void GetInstanceExtensionProperties(std::vector<XrExtensionProperties> &props);
54
const std::string &GetFunctionName(const std::string &func_name) const;
55
56
protected:
57
ManifestFile(ManifestFileType type, const std::string &filename, const std::string &library_path);
58
void ParseCommon(Json::Value const &root_node);
59
static bool IsValidJson(const Json::Value &root, JsonVersion &version);
60
61
private:
62
std::string _filename;
63
ManifestFileType _type;
64
std::string _library_path;
65
std::vector<ExtensionListing> _instance_extensions;
66
std::unordered_map<std::string, std::string> _functions_renamed;
67
};
68
69
// RuntimeManifestFile class -
70
// Responsible for finding and parsing Runtime-specific manifest files.
71
class RuntimeManifestFile : public ManifestFile {
72
public:
73
// Factory method
74
static XrResult FindManifestFiles(const std::string &openxr_command,
75
std::vector<std::unique_ptr<RuntimeManifestFile>> &manifest_files);
76
77
private:
78
RuntimeManifestFile(const std::string &filename, const std::string &library_path);
79
static void CreateIfValid(const std::string &filename, std::vector<std::unique_ptr<RuntimeManifestFile>> &manifest_files);
80
static void CreateIfValid(const Json::Value &root_node, const std::string &filename,
81
std::vector<std::unique_ptr<RuntimeManifestFile>> &manifest_files);
82
};
83
84
using LibraryLocator = bool (*)(const std::string &json_filename, const std::string &library_path, std::string &out_combined_path);
85
86
// ApiLayerManifestFile class -
87
// Responsible for finding and parsing API Layer-specific manifest files.
88
class ApiLayerManifestFile : public ManifestFile {
89
public:
90
// Factory method
91
static XrResult FindManifestFiles(const std::string &openxr_command, ManifestFileType type,
92
std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files);
93
94
const std::string &LayerName() const { return _layer_name; }
95
void PopulateApiLayerProperties(XrApiLayerProperties &props) const;
96
97
private:
98
ApiLayerManifestFile(ManifestFileType type, const std::string &filename, const std::string &layer_name,
99
const std::string &description, const JsonVersion &api_version, const uint32_t &implementation_version,
100
const std::string &library_path);
101
102
static void CreateIfValid(ManifestFileType type, const std::string &filename, std::istream &json_stream,
103
LibraryLocator locate_library, std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files);
104
static void CreateIfValid(ManifestFileType type, const std::string &filename,
105
std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files);
106
/// @return false if we could not find the library.
107
static bool LocateLibraryRelativeToJson(const std::string &json_filename, const std::string &library_path,
108
std::string &out_combined_path);
109
110
#if defined(XR_KHR_LOADER_INIT_SUPPORT) && defined(XR_USE_PLATFORM_ANDROID)
111
static bool LocateLibraryInAssets(const std::string &json_filename, const std::string &library_path,
112
std::string &out_combined_path);
113
static void AddManifestFilesAndroid(const std::string &openxr_command, ManifestFileType type,
114
std::vector<std::unique_ptr<ApiLayerManifestFile>> &manifest_files);
115
#endif // defined(XR_USE_PLATFORM_ANDROID) && defined(XR_KHR_LOADER_INIT_SUPPORT)
116
117
JsonVersion _api_version;
118
std::string _layer_name;
119
std::string _description;
120
uint32_t _implementation_version;
121
};
122
123