3.API 初始化
3.2 Function Pointers
XrResult xrGetInstanceProcAddr(XrInstance instance,const char* name,PFN_xrVoidFunction* function);
instance: XrInstance類型,可以是NULL,也可以是任何有效的instance;
name:待獲取fp的函數名稱;
function:返回的函數指針fp。
xrGetInstanceProcAddr的參數instance和name不同,返回的值也是不同,參考下表。
instance ?parameter | name ?parameter | return value |
---|---|---|
* |
| undefined |
invalid instance | * | undefined |
| xrEnumerateInstanceExtensionProperties | fp |
| xrEnumerateApiLayerProperties | fp |
| xrCreateInstance | fp |
| * (any? |
|
instance | core OpenXR function | fp1 |
instance | enabled extension function for? | fp1 |
instance | * (any? |
|
- 當參數instance是NULL時,但是name是xrEnumerateInstanceExtensionProperties/ xrEnumerateApiLayerProperties/ xrCreateInstance中任意一個,則返回對應name的函數fp。
- 當instance是有效的對象時,如果name是core OpenXR function或者使能的擴展層extension的function,則會返回對應name的函數fp。
- 如果name是不存在的函數名稱,無論instance是否有效,都會返回NULL。
4. Instance
OpenXR instance是一個允許OpenXR application和runtime進行通信的句柄對象。application通過調用xrCreateInstance()和接收一個XrInstance對應的handle完成通信。
XrInstance對象存儲和追蹤OpenXR相關應用的狀態,不需要在application的全局地址空間中存儲任何這樣的狀態。由于instance對象對于application是不透明的,因此application可以創建多個instance,并安全封裝application的OpenXR state。
OpenXR runtime可能會限制同時創建和使用XrInstance對象的數量,但他們必須支持每個進程至少創建和使用一個XrInstance對象。
4.1 API layers和Extensions
API layers或者擴展層可以提供附件功能。API Layer禁止添加或者修改OpenXR function的定義,而擴展層可以。
API layers函數集的使能要在創建instance時指定,這些API layers能夠攔截(intercept)任何分發給該instance或者它的子類對象的函數。
API layers示例可以包含(但不限制于):
- dump out OpenXR API的調用
- 執行OpenXR校驗。
4.1.1.?xrEnumerateApiLayerProperties()
XrResult xrEnumerateApiLayerProperties(uint32_t propertyCapacityInput,uint32_t* propertyCountOutput,XrApiLayerProperties* properties);
- 該函數決定哪些API layers集是可用的。
- 參數propertyCapacityInput是屬性array的容量值,0表示請求檢索需要的capacity。
- 參數propertyCountOutput是指向要寫入屬性數量的指針,或者是指向所需capacity的指針,以防propertyCapacityInput不足的情況。
- 屬性是指向XrApiLayerProperties結構體數組的指針,如果propertyCapacityInput=0,則可以為NULL。
- 由于Runtime的外部操作,layers的可用列表在任何時間可能變化,因此該方法的使用相同的參數調用兩次,返回結果可能不同。
一旦創建了instance,使能的layers在該instance的有效生命周期內都會繼續enabled和valid,即使其中一些layer對未來的instance不可用。
4.1.2. XrApiLayerProperties結構體
typedef struct XrApiLayerProperties {XrStructureType type;void* next;char layerName[XR_MAX_API_LAYER_NAME_SIZE];XrVersion specVersion;uint32_t layerVersion;char description[XR_MAX_API_LAYER_DESCRIPTION_SIZE];
} XrApiLayerProperties;