首页 > 代码库 > 第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一)

感觉有必要把

KMDDOD_INITIALIZATION_DATA

中的这些函数指针的意思解释一下, 以便进一步的深入代码.


DxgkDdiAddDevice
前面已经说过, 这个函数的主要内容是,将BASIC_DISPLAY_DRIVER实例指针存在context中, 以便后期使用, 支持多实例.

DxgkDdiStartDevice
取得设备信息, 往注册表中加入内容, 从POST设备中获取FRAME BUFFER以及相关信息(DxgkCbAcquirePostDisplayOwnership, DXGK_DISPLAY_INFORMATION).


DxgkDdiStopDevice

做相应的收尾工作(cleanup, framebuffer ummap)


DxgkDdiResetDevice

没做任何事情


DxgkDdiRemoveDevice

BASIC_DISPLAY_DRIVER类实例的delete


DxgkDdiDispatchIoRequest

没有实现相应代码


DxgkDdiInterruptRoutine

没有实现相应代码


DxgkDdiDpcRoutine

调用DxgkCbNotifyDpc

informs the graphics processing unit (GPU) scheduler about a graphics hardware update at deferred-procedure-call (DPC) time

inform the GPU scheduler about an update to a fence through a direct memory access (DMA) stream to the graphics hardware.


DxgkDdiQueryChildRelations

枚举VIDEO ADAPTER上的所有子设备, 前面章节说到过, 所谓的子设备,包括各种不同的OUTPUT接口, 比如HDMI, VGA, DVI, 但是,通过这些接口连接在MONITOR,不属于子设备之流


DxgkDdiQueryChildStatus

这个比较有意思, 因为WDDM 1.3中加入了对WIRELESS DISPLAY(Miracast )的支持

这个函数主要是对接口(子设备)的状态检测, 如是否有MONITOR连接, MONITOR的显示旋转角度


DxgkDdiQueryDeviceDescriptor

如果child device为TypeVideoOutput类型, 则通过该函数获取EDID

如果是TypeOther, 则返回通用的描述符,包括hwid, instance id, compatible id, and device text


DxgkDdiSetPowerState

这里包括设置ADAPTER与CHILD DEVICE的电源状态

区分到底是哪一个, 是用参数中的DeviceUid

如果是DISPLAY_ADAPTER_HW_ID, 则为ADAPTER, 否则是CHILD DEVICE的 ID


DxgkDdiUnload

没有实质性的事情代码


DxgkDdiQueryAdapterInfo

代码里根据

DXGKARG_QUERYADAPTERINFO 的TYPE, 知道UMD需要取得DXGK_DRIVERCAPS类型的数据结构
于是,MINIPORT驱动将DXGK_DRIVERCAPS相应成员填充
DxgkDdiIsSupportedVidPn
用来检测具体的一种VidPN是否被ADAPTER所支持, 具体的检测算法,就是由MINIPORT中的函数来实现的
VidPN的内容前面章节已经说过, 请参阅

DxgkDdiRecommendFunctionalVidPn
建立一种符合VIDEO ADAPTER硬件的VidPN(例子中没有使用)

DxgkDdiEnumVidPnCofuncModality
涉及到SOURCE MODE, TARGET MODE, PATH, PINNED MODE等VidPN的内容,代码非常长, 有待进一步研究, 如下:
http://msdn.microsoft.com/zh-cn/library/ff565475(v=vs.85).aspx

DxgkDdiSetVidPnSourceVisibility
是用来控制SOURCE可见与不可见的, 
programs the video output codec that is associated with a specified video present source to either start scanning or stop scanning the source‘s primary surface.
具体的就是控制video output codec是否要SCAN source‘s surface.

DxgkDdiCommitVidPn
所谓的COMMIT,就是将VidPn提交给系统, 由此生效

DxgkDdiUpdateActiveVidPnPresentPath
updates one of the video present paths that is currently active on the display adapter.
control the settings of video present paths, such as path rotation, a presented content‘s geometry transformations, gamma ramps that are used to adjust the presented content‘s brightness, and so on.

DxgkDdiRecommendMonitorModes
The DxgkDdiRecommendMonitorModes function inspects the monitor source mode set that is associated with a particular video present target and possibly adds modes to the set.

DxgkDdiQueryVidPnHWCapability
http://msdn.microsoft.com/zh-cn/library/ff569221(v=vs.85).aspx
返回ADAPTER所支持的内容, 比如ROTATION, SCALING

DxgkDdiPresentDisplayOnly
Presents the screen image to the display device of a kernel mode display-only driver (KMDOD).
实际的数据显示函数

DxgkDdiStopDeviceAndReleasePostDisplayOwnership
Reset device同时释放 POST设备

通过以上的说明, 相信大家对Bdd.cpp的内容也已经有所了解了.
还是要强调的, 微软的驱动程序, 从架构方面, 驱动工程师没有太大做文章的地方, 微软的工程师们,都已经将深思熟虑的架构呈现给大家了.
所以, 正如KMDOD例子中的, 都是实现架构中的函数, 因为, 微软已经将VidPN的所有情况都考虑进去, 所以,就提供了相应的函数接口.
驱动工程师, 需要做的, 我的感觉,还是如何了解这个架构,架构中提供的函数, 如何利用好这些函数接口, 达到驱动性能最佳的应用.
对KMDOD, AVSTREAM/BDA都如此.