1 | /**************************************************************************/ |
2 | /* util.h */ |
3 | /**************************************************************************/ |
4 | /* This file is part of: */ |
5 | /* GODOT ENGINE */ |
6 | /* https://godotengine.org */ |
7 | /**************************************************************************/ |
8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
10 | /* */ |
11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
12 | /* a copy of this software and associated documentation files (the */ |
13 | /* "Software"), to deal in the Software without restriction, including */ |
14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
17 | /* the following conditions: */ |
18 | /* */ |
19 | /* The above copyright notice and this permission notice shall be */ |
20 | /* included in all copies or substantial portions of the Software. */ |
21 | /* */ |
22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
29 | /**************************************************************************/ |
30 | |
31 | #ifndef UTIL_H |
32 | #define UTIL_H |
33 | |
34 | #define UNPACK(...) __VA_ARGS__ |
35 | |
36 | #define INIT_XR_FUNC_V(openxr_api, name) \ |
37 | do { \ |
38 | XrResult get_instance_proc_addr_result; \ |
39 | get_instance_proc_addr_result = openxr_api->get_instance_proc_addr(#name, (PFN_xrVoidFunction *)&name##_ptr); \ |
40 | ERR_FAIL_COND_V(XR_FAILED(get_instance_proc_addr_result), false); \ |
41 | } while (0) |
42 | |
43 | #define EXT_INIT_XR_FUNC_V(name) INIT_XR_FUNC_V(OpenXRAPI::get_singleton(), name) |
44 | #define OPENXR_API_INIT_XR_FUNC_V(name) INIT_XR_FUNC_V(this, name) |
45 | |
46 | #define INIT_XR_FUNC(openxr_api, name) \ |
47 | do { \ |
48 | XrResult get_instance_proc_addr_result; \ |
49 | get_instance_proc_addr_result = openxr_api->get_instance_proc_addr(#name, (PFN_xrVoidFunction *)&name##_ptr); \ |
50 | ERR_FAIL_COND(XR_FAILED(get_instance_proc_addr_result)); \ |
51 | } while (0) |
52 | |
53 | #define EXT_INIT_XR_FUNC(name) INIT_XR_FUNC(OpenXRAPI::get_singleton(), name) |
54 | #define OPENXR_API_INIT_XR_FUNC(name) INIT_XR_FUNC(this, name) |
55 | |
56 | #define TRY_INIT_XR_FUNC(openxr_api, name) \ |
57 | openxr_api->try_get_instance_proc_addr(#name, (PFN_xrVoidFunction *)&name##_ptr) |
58 | |
59 | #define EXT_TRY_INIT_XR_FUNC(name) TRY_INIT_XR_FUNC(OpenXRAPI::get_singleton(), name) |
60 | #define OPENXR_TRY_API_INIT_XR_FUNC(name) TRY_INIT_XR_FUNC(this, name) |
61 | #define GDEXTENSION_INIT_XR_FUNC(name) \ |
62 | do { \ |
63 | name##_ptr = reinterpret_cast<PFN_##name>(get_openxr_api()->get_instance_proc_addr(#name)); \ |
64 | ERR_FAIL_COND(name##_ptr == nullptr); \ |
65 | } while (0) |
66 | |
67 | #define GDEXTENSION_INIT_XR_FUNC_V(name) \ |
68 | do { \ |
69 | name##_ptr = reinterpret_cast<PFN_##name>(get_openxr_api()->get_instance_proc_addr(#name)); \ |
70 | ERR_FAIL_COND_V(name##_ptr == nullptr, false); \ |
71 | } while (0) |
72 | |
73 | #define EXT_PROTO_XRRESULT_FUNC1(func_name, arg1_type, arg1) \ |
74 | PFN_##func_name func_name##_ptr = nullptr; \ |
75 | XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type p_##arg1) const { \ |
76 | if (!func_name##_ptr) { \ |
77 | return XR_ERROR_HANDLE_INVALID; \ |
78 | } \ |
79 | return (*func_name##_ptr)(p_##arg1); \ |
80 | } |
81 | |
82 | #define EXT_PROTO_XRRESULT_FUNC2(func_name, arg1_type, arg1, arg2_type, arg2) \ |
83 | PFN_##func_name func_name##_ptr = nullptr; \ |
84 | XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type p_##arg1, UNPACK arg2_type p_##arg2) const { \ |
85 | if (!func_name##_ptr) { \ |
86 | return XR_ERROR_HANDLE_INVALID; \ |
87 | } \ |
88 | return (*func_name##_ptr)(p_##arg1, p_##arg2); \ |
89 | } |
90 | |
91 | #define EXT_PROTO_XRRESULT_FUNC3(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3) \ |
92 | PFN_##func_name func_name##_ptr = nullptr; \ |
93 | XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type p_##arg1, UNPACK arg2_type p_##arg2, UNPACK arg3_type p_##arg3) const { \ |
94 | if (!func_name##_ptr) { \ |
95 | return XR_ERROR_HANDLE_INVALID; \ |
96 | } \ |
97 | return (*func_name##_ptr)(p_##arg1, p_##arg2, p_##arg3); \ |
98 | } |
99 | |
100 | #define EXT_PROTO_XRRESULT_FUNC4(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3, arg4_type, arg4) \ |
101 | PFN_##func_name func_name##_ptr = nullptr; \ |
102 | XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type p_##arg1, UNPACK arg2_type p_##arg2, UNPACK arg3_type p_##arg3, UNPACK arg4_type p_##arg4) const { \ |
103 | if (!func_name##_ptr) { \ |
104 | return XR_ERROR_HANDLE_INVALID; \ |
105 | } \ |
106 | return (*func_name##_ptr)(p_##arg1, p_##arg2, p_##arg3, p_##arg4); \ |
107 | } |
108 | |
109 | #define EXT_PROTO_XRRESULT_FUNC5(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3, arg4_type, arg4, arg5_type, arg5) \ |
110 | PFN_##func_name func_name##_ptr = nullptr; \ |
111 | XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type p_##arg1, UNPACK arg2_type p_##arg2, UNPACK arg3_type p_##arg3, UNPACK arg4_type p_##arg4, UNPACK arg5_type p_##arg5) const { \ |
112 | if (!func_name##_ptr) { \ |
113 | return XR_ERROR_HANDLE_INVALID; \ |
114 | } \ |
115 | return (*func_name##_ptr)(p_##arg1, p_##arg2, p_##arg3, p_##arg4, p_##arg5); \ |
116 | } |
117 | |
118 | #define EXT_PROTO_XRRESULT_FUNC6(func_name, arg1_type, arg1, arg2_type, arg2, arg3_type, arg3, arg4_type, arg4, arg5_type, arg5, arg6_type, arg6) \ |
119 | PFN_##func_name func_name##_ptr = nullptr; \ |
120 | XRAPI_ATTR XrResult XRAPI_CALL func_name(UNPACK arg1_type p_##arg1, UNPACK arg2_type p_##arg2, UNPACK arg3_type p_##arg3, UNPACK arg4_type p_##arg4, UNPACK arg5_type p_##arg5, UNPACK arg6_type p_##arg6) const { \ |
121 | if (!func_name##_ptr) { \ |
122 | return XR_ERROR_HANDLE_INVALID; \ |
123 | } \ |
124 | return (*func_name##_ptr)(p_##arg1, p_##arg2, p_##arg3, p_##arg4, p_##arg5, p_##arg6); \ |
125 | } |
126 | |
127 | #endif // UTIL_H |
128 | |