OpenXR SDK に新しい拡張インターフェイスが追加されました

インターネット上の多くの企業は、pico などの独自の拡張を行っています。

ゲームパッド | PICO 開発者プラットフォーム

Khronos が提供する公式の拡張インターフェイスの説明: OpenXR™ Documentation and Extensions: Procedures and Conventions

拡張機能を実装するには、次の手順が必要です。

目次

1: 実行時にインターフェースを追加する

1.1 定義拡張と拡張インターフェースの宣言

1.2 関数ポインタの定義

1.3 関数ポインタの割り当て

1.4 oxr_関数の具体的な実装

2. SDK で拡張インターフェイスを呼び出すにはどうすればよいですか?

2.1 登録の拡張

2.2 拡張インターフェイスを呼び出す

3. インターフェースのデバッグ


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 にログインすると、通話が終了します

おすすめ

転載: blog.csdn.net/weixin_41028555/article/details/132297334