OpenXR间接链接
通过加载器间接链接,应用程序动态生成OpenXR命令调度表。如果找不到加载器,或者只有比应用程序更旧的API,则此方法允许应用程序正常失败。为此,应用程序在加载器库上,使用特定平台的动态符号,查找(如dlsym())xrGetInstanceProcAddr命令的地址。一旦发现,此命令可用于查询所有其他OpenXR命令(如xrCreateInstance、xrEnumerateInstanceExtensionProperties和xrEnumerateApiLayerProperties)的地址。然后,应用程序将使用函数指针表来调用OpenXR API。
当应用程序生成调度表时,一个好处是从调用链中的大多数命令中,删除了加载器跳转调用,这可能会提高性能。在这种情况下,大多数命令将使用应用程序调度的调用链,如图1-19所示。
图1-19应用程序调度的调用链
1.2.4 API层总体排序
加载程序基于以上内容,对所有API层的总体排序,如图1-20所示。
图1-20加载API层排序
如图1-20所示,任何隐式API层将首先截获OpenXR命令,然后环境变量启用任何显式API层,最后被应用程序直接启用的任何隐式API层截获。API层是否继续进入加载器终止调用,或直接进入运行时,取决于调用链。
在显式API层列表内部,排序也可能很重要。一些API层可能依赖于加载程序调用它前或后实现的其他行为。
1.2.5 API层调用链与分布式调度
API层不需要截取所有命令,而是只选择截取一个子集。通常,当API层截获给定的OpenXR命令时,它会根据需要调用调用链。加载器和参与调用链的所有API层协作,以确保从一个实体到下一个实体的正确调用顺序。这种用于调用链排序组工作称为分布式调度。
如果API层不希望截取命令,则必须将对xrGetInstanceProcAddr实现(通过getInstanceProcAdder提供)的请求转发到调用链中的下一个xrGetInstanceProcAddr实现中(通过nextGetInstanceProcAdd提供给API层)。
在分布式调度中,每个API层负责正确调用调用链中的下一个实体。API层截获的所有OpenXR命令,都需要一个调度机制。
例如,如果启用的API层仅截获某些函数,则调用链可选功能流程,如图1-21所示。
图1-21调用链API可选功能流程
1.2.6加载器设计
介绍src/loader文件夹中,提供的OpenXR加载器的内部设计。OpenXR加载器由几个类组成。整体类图关系,如图1-22所示。
图1-22加载类图流程