第十七篇:实例分析(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都如此.

第十七篇:实例分析(4)--初探WDDM驱动学习笔记(十一),布布扣,bubuko.com

时间: 2024-12-26 10:46:24

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

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

续: 还是记录一下, BltFuncs.cpp中的函数作用: CONVERT_32BPP_TO_16BPP 是将32bit的pixel转换成16bit的形式. 输入是DWORD 32位中, BYTE 0,1,2分别是RGB分量, 而BYTE3则是不用的 为了不减少color的范围, 所以,都是取RGB8,8,8的高RGB5, 6, 5位, 然后将这16位构成一个pixel. CONVERT_16BPP_TO_32BPP是将16bit的pixel转换成32bit的形式 输入是WORD 16BIT中

第十七篇:曲径通幽处,禅房花木深--初探WDDM驱动学习笔记(一)

正好需要对WINDOWS的WDDM有所了解, 于是就翻了下MSDN. 微软对设备驱动的框架设计非常周全. 无论WDDM, AVSTREAM, 还是USB STACK, STORAGE, 以及其它技术类型的设备驱动, 都是以port/miniport, class/miniclass的形式展开, 微软将经过严密设计,开发,测试的port/class驱动提供给IHV,而IHV只需要把工作重心放到mini驱动的开发上去, 大大降低了项目风险, 人力成本,以及时间成本. AVSTREAM是PCTV的框架

第十七篇:博采众长--初探WDDM驱动学习笔记(七)

基于WDDM驱动的DirectX视频加速重定向框架设计与实现 现在的研究生的论文, 真正质量高的, 少之又少, 开题开得特别大, 动不动就要搞个大课题, 从绪论开始到真正自己所做的内容之间, 是东拼西凑地抄概念, 抄公式, 达到字数篇幅的要求, 而自己正真做了什么, 有哪些实际感受, 做出的内容, 相比前面的东拼西凑就几点内容, 之后就草草结束, 步入感谢的段落. 原因不光只有学生自己, 所谓的读研, 如果没有一个环境, 学生有再大的愿望, 再强的毅力, 到头来也只是空无奈. 有些导师要写书,

《Linux内核分析》第六周学习笔记

<Linux内核分析>第六周学习笔记 进程的描述和创建 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时 撰写博客时间:2小时] [学习内容:进程创建的过程.使用gdb跟踪分析内核处理函数sys_clone] 一.进程的描述 1.1 进程描述符task_struct数据结构(一) 1. 进程控制块PCB——task_struct 为了管理进程,内核

初探swift语言的学习笔记十一(performSelector)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了.更有甚者连IMP, objc_msgSend也不能用了.虽然想不通为什么,但应该有他的道理.就不纠结了. 大家可能在OC中使用得更多的就是延时处理,及后台处

《Linux内核分析》第七周学习笔记

<Linux内核分析>第七周学习笔记 可执行程序的装载 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [学习视频时间:1小时35分钟 实验时间:1小时 撰写博客时间:2小时] [学习内容:共享库和动态链接.exec系统调用的执行过程.可执行程序的装载] 一.预处理.编译.链接和目标文件的格式 1.1 可执行程序如何得来?

python 学习笔记十一 SQLALchemy ORM(进阶篇)

SqlAlchemy ORM SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如: MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port&g

019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记

深度优先搜索DFS 深搜框架: bool dfs(int loc) { 标记状态loc已访问; if (loc为目标状态) return true; for (每个可能的操作) { 对loc应用操作产生新状态nstat; if (nstat合法且未被访问) { if (dfs(nstat)) return true; } } 撤销loc已访问标记; // 这步要具体问题具体分析了 return false; } 广度优先搜索BFS 实现方法 1. 首先将根节点放入队列中. 2. 从队列中取出第一

linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录

下面来看一个综合实例,假设我们要在内核源代码 drivers 目录下为 ARM 体系结构新增如下用于 test driver 的树型目录:| --test  | -- cpu  | -- cpu.c  | -- test.c  | -- test_client.c  | -- test_ioctl.c  | -- test_proc.c  | -- test_queue.c在内核中增加目录和子目录,我们需为相应的新增目录创建 Makefile 和 Kconfig 文件,而新增目录的父目录中的 K