VidPN Objects and Interfaces
VidPN管理器使用VidPN对象来维护源和目标及显示模式之间的信息。
VidPN object
VidPN对象包含下面的子对象
-
Topology
-
Source mode set
-
Target mode set
-
Monitor source mode set
-
Monitor frequency range set
-
Monitor descriptor set
-
Path
-
Source
-
Target
-
Source mode
-
Target mode
-
Monitor source mode
下图显示了VidPN对象和子对象
上图显示了显示了一对一,一对多,多对一,多对多的关系。例如,一个source可以属于一个或多个path,但是一个target只能属于一个path.
蓝色对象只能通过句柄和接口访问,灰色对象通过结构体指针访问。这里说的接口是包含函数指针的结构体。例如,DXGK_VIDPNTOPOLOGY_INTERFACE 结构体包含了miniport驱动来检查改变VidPN Topology对象的指针。当miniport驱动调用其中任何一个方法时,都需要提供指向topology对象的句柄。下面表格列出了用来访问VidPN对象或子对象的句柄,接口,和指针类型。
Object | Access method and data type |
---|---|
VidPN (VidPN Interface) | Accessed through handle and interface. D3DKMDT_HVIDPN |
Topology (VidPN Topology Interface) | Accessed through handle and interface. D3DKMDT_HVIDPNTOPOLOGY |
Source mode set (VidPN Source Mode Set Interface) | Accessed through handle and interface. D3DKMDT_HVIDPNSOURCEMODESET |
Target mode set (VidPN Target Mode Set Interface) | Accessed through handle and interface. D3DKMDT_HVIDPNTARGETMODESET |
Monitor source mode set | Accessed through handle and interface. D3DKMDT_HMONITORSOURCEMODESET |
Path | Accessed through structure pointer. |
Source | Accessed through structure pointer. |
Target | Accessed through structure pointer. |
Source mode | Accessed through structure pointer. |
Target mode | Accessed through structure pointer. |
Monitor source mode | Accessed through structure pointer. |
Monitor frequency range set | Accessed through structure pointer. [DXGK_MONITORFREQUENCYRANGESET_INTERFACE ](https://docs.microsoft.com/windows-hardware/drivers/ddi/content/d3dkmddi/ns-d3dkmddi-_dxgk_monitorfrequencyrangeset_interface) |
Monitor descriptor set | Accessed through structure pointer. [DXGK_MONITORDESCRIPTORSET_INTERFACE](https://docs.microsoft.com/windows-hardware/drivers/ddi/content/d3dkmddi/ns-d3dkmddi-_dxgk_monitordescriptorset_interface) |
VidPN Manager
VidPN管理器是DXGK子系统的一个组件,与miniport驱动一起写作完成创建和维护VidPN的工作。下面步骤描述了miniport驱动获得VidPN句柄和接口的过程。
1.初始化时Dxgk子系统调用miniport驱动的DxgkDdiStartDevice方法。参数中提供了DXGKRNL_INTERFACE结构体,其中包含Dxgk子系统中实现的方法。其中一个是DxgkCbQueryVidPnInterface。
2.某些时候VidPN管理器需要miniport驱动的功能,并会在一些方法调用时将指向VidPN对象的句柄传递给miniport驱动。
3.miniport驱动会将获得的句柄传递给DxgkCbQueryVidPnInterface,该函数返回一个DXGK_VIDPN_INTERFACE结构体。
在miniport驱动拥有指向VidPN对象的接口和句柄以后,miniport驱动就能得到指向基本子对象(topology, source mode set, target mode set, monitor source mode set)的句柄和接口。例如miniport driver 能调用pfnGetTopology(VidPN接口中的方法)来得到指向VidPN topology对象的句柄和一个指向DXGK_VIDPNTOPOLOGY_INTERFACE结构体的指针。
下面的方法(VidPN接口中的方法)能够获得指向VidPN基础子对象的句柄和接口。
注意下面两个方法需要在使用完SourceModeSet和TargetModeSet之后调用
同样,在获得基础子对象的句柄和接口之后能够调用接口中的方法得到子对象的描述符。例如已经得到topology的句柄和接口之后,miniport驱动能够通过下列步骤获得topology中的所有path描述符。
调用topology接口中的pfnAcquireFirstPathInfo方法能够获得D3DKMDT_VIDPN_PRESENT_PATH结构体指针,这个指针描述了topology中的第一个path。
重复调用pfnAcuireNextPathInfo可以获取topology中的其他path。
类似的,miniport驱动能够调用pfnAcquireFirstModeInfo和pfnAcquireNextModeInfo得到Mode set描述符。
注意没有方法能够移除DXGK_VIDPNSOURCEMODESET_INTERFACE这个接口。当miniport驱动需要更新一个source mode 时,驱动不应该通过添加和移除一个mode来改变一个mode set,相应的应该创建一个新的mode set来替换旧的mode set。例如DxgkDdiEnumVidPnCofuncModality函数在调用的时候旧一定会更新mode set。下面的步骤描述了更新source mode set:
1. 调用DXGK_VIDPNSOURCEMODESET_INTERFACE中的pfnCreateNewModeInfo方法得到指向 D3DKMDT_VIDPN_SOURCE_MODE结构体的指针。重复调用pfnAddMode来添加source mode set。
2. 调用 DXGK_VIDPN_INTERFACE中的 pfnAssignSourceModeSet 方法给指定的video present source添加一个新mode set。这个新的source mode set会替换当前source的mode set。
更新target mode set和更新source mode set 类似DXGK_VIDPNTARGETMODESET_INTERFACE 接口有一下方法:
VidPN Target Mode Set interface
pfnCreateNewModeInfo 方法创建一个新的target mode set以及使用 pfnAddMode方法添加一个新的mode。
没有一个方法能获得指定path所使用的source和target。miniport驱动能够通过D3DKMDT_VIDPN_PRESENT_PATH 中的VidPnSourceId和VidPnTargetId确定source和target属于哪一个path。