インターネット上の多くの企業は、pico などの独自の拡張を行っています。
Khronos が提供する公式の拡張インターフェイスの説明: OpenXR™ Documentation and Extensions: Procedures and Conventions
拡張機能を実装するには、次の手順が必要です。
目次
2. SDK で拡張インターフェイスを呼び出すにはどうすればよいですか?
1: 実行時にインターフェースを追加する
1.1 定義拡張と拡張インターフェースの宣言
openxr.h ファイル内の関数の宣言
#define XR_EXT_audio 1 #define XR_EXT_audio_SPEC_VERSION 1 #define XR_EXT_AUDIO_EXTENSION_NAME "XR_EXT_audio"#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL
xrDistanceAttendance(bool Enable, float max, float min, int radius);
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
1.2 関数ポインタの定義
関数ポインタは、openxr 仕様の 1 つである PFN_ で始まる必要があります。
#define XR_EXT_audio 1
#define XR_EXT_audio_SPEC_VERSION 1
#define XR_EXT_AUDIO_EXTENSION_NAME "XR_EXT_audio"
typedef XrResult (XRAPI_PTR *PFN_xrDistanceAttendance)(bool Enable, uint32_t max, uint32_t min, uint32_t radius);#ifndef XR_NO_PROTOTYPES
#ifdef XR_EXTENSION_PROTOTYPES
XRAPI_ATTR XrResult XRAPI_CALL
xrDistanceAttendance(bool Enable, float max, float min, int radius);
#endif /* XR_EXTENSION_PROTOTYPES */
#endif /* !XR_NO_PROTOTYPES */
1.3 関数ポインタの割り当て
oxr_api_funcs.h では、oxr_xrGetInstanceProcAddr の oxr_xrGetInstanceProcAddr 関数は、インスタンスがインスタンス化された後に handle_non_null を呼び出します。このとき、関数に値を代入します。これにより、1.1 では関数の前に oxr_ が追加されます。
static XrResult
handle_non_null(struct oxr_instance *inst, struct oxr_logger *log, const char *name, PFN_xrVoidFunction *out_function)
{...
ENTRY(xrDistanceAttention);
...
}
ENTRY関数数如下:
#define ENTRY(funcName) \
do { \
if (strcmp(name, #funcName) == 0) { \
PFN_##funcName ret = &oxr_##funcName; \
*out_function = (PFN_xrVoidFunction)(ret); \
XR_SUCCESS を返します; \
} \
} while (false)
1.4 oxr_関数の具体的な実装
XRAPI_ATTR XrResult XRAPI_CALL
oxr_xrDistanceAttendance(bool Enable, uint32_t max, uint32_t min, uint32_t radius) { __android_log_print(ANDROID_LOG_DEBUG, "シャンシャン","シャンシャン追加 oxr_xrDistanceAttendance "); }
2. SDK で拡張インターフェイスを呼び出すにはどうすればよいですか?
2.1 登録の拡張
xr.xml の新しい拡張子
<!-- XR_EXT_audio のコマンド -->
<command successcodes="XR_SUCCESS" errorcodes="XR_ERROR_FUNCTION_UNSUPPORTED,XR_ERROR_VALIDATION_FAILURE">
<proto><type>XrResult</type> <name>xrDistanceAttendance</name></proto> ---拡張関数の戻り値 + 関数名
<param><type>XrBool32</type> <name> Enable</name></param> --拡張関数入力パラメータ 1
<param><type>uint32_t</type> <name>max</name></param> --拡張関数入力パラメータ 2
<param>< type>uint32_t</type> <name>min</name></param> -- 拡張関数入力パラメータ 3
<param><type>uint32_t</type> <name>radius</name></param> -・拡張機能入力パラメータ4
</command>---supported="openxr" は拡張機能を開始することを意味し、supported="disabled" は拡張機能を無効にすることを意味します。番号に注意してください。他の番号と同じにすることはできません。
<extension name="XR_EXT_audio" number="498" type="instance" Supported="openxr"> ------拡張子名は実行時に openxr.h で定義されます #define XR_EXT_audio 1
<require>
<enum value="1" name="XR_EXT_audio_SPEC_VERSION"/>--- 実行時に openxr.h で定義、#define XR_EXT_audio_SPEC_VERSION 1 <enum value=""XR_EXT_audio"" name=" XR_EXT_AUDIO_EXTENSION_NAME"/> ---
openxr.h実行時に定義されます。#define XR_EXT_AUDIO_EXTENSION_NAME "XR_EXT_audio"<command name="xrDistanceAttendance"/> --- 拡張関数名。複数ある場合は、ここに複数行のコマンドがあります。
</require>
</extension>
2.2 拡張インターフェイスを呼び出す
void InitializeSystem() オーバーライド {
...
PFN_xrDistanceAttend pfnXrDistanceAttendance = nullptr; -----PFN_xrDistanceAttendance の定義は、コンパイルされた openxr.h ファイルに表示され、実行時の openxr.h と一致
します。
xrGetInstanceProcAddr(m_instance, "xrDistanceAttendr", reinterpret_cast<PFN_xrVoidFunction*>(&pfnXrDistanceAttention)); --- xrGetInstanceProcAddr を介して pfnXrDistanceAttendr( true
, 1, 1, 1)を呼び出すように拡張します ; --- 実行時にインターフェイスを呼び出します
__android_log_print(AND ROID_LOG_DEBUG) 、 "シャンシャン "、" SDK 終了 pfnXrDistanceAttention ");...
}
3. インターフェースのデバッグ
ランタイム アプリケーション、システム ブローカー アプリケーション、および helloxr アプリケーションをそれぞれインストールし、システム ブローカー アプリケーションを起動し、monado ランタイムを選択して、helloxr アプリケーションを起動します。アプリケーションの初期化時にインターフェイスを呼び出しているため、helloxr アプリケーションの起動後、拡張インターフェイスが自動的に呼び出され、ログ出力は次のようになります。
07-29 08:57:34.975 9289 9310 D シャンシャン: SDK begin pfnXrDistanceAttend ---- SDK にログイン、通話開始
07-29 08:57:34.975 9289 9310 D シャンシャン: シャンシャン add oxr_xrDistanceAttend ------- これはランタイムのログです
07-29 08:57:34.975 9289 9310 D シャンシャン: SDK 終了 pfnXrDistanceAttention ----SDK にログインすると、通話が終了します