支持视频捕获和其他子设备

显示微型端口驱动程序和视频捕获设备或其他子设备的驱动程序可以相互定义专用接口,子驱动程序可以使用该接口通过父微型端口驱动程序与其设备通信。 子视频捕获驱动程序必须与父显示微型端口驱动程序紧密耦合。 事实上,视频捕获可能作为显示微型端口驱动程序的一部分实现。 视频捕获驱动程序可以将专用接口与显示微型端口驱动程序配合使用来访问 I2C 总线,并用于其他目的。

为了初始化专用接口,视频捕获驱动程序将 IRP_MN_QUERY_INTERFACE 请求发送到显示端口驱动程序, (显示微型端口驱动程序 的Dxgkrnl.sys) 的一部分。 显示端口驱动程序收到此类请求后,它会调用微型端口驱动程序的 DxgkDdiQueryInterface 函数,并将指针传递给包含用于初始化专用接口的信息 的QUERY_INTERFACE 结构。

注意 如果视频捕获作为显示微型端口驱动程序的一部分实现,则视频捕获可能会直接调用 DxgkDdiQueryInterface

子设备的每个驱动程序 (包括视频捕获设备) 必须返回指示设备关联的硬件的适配器 GUID。 适配器 GUID 提供给 DXGK_START_INFO 结构的 AdapterGuid 成员中的显示微型端口驱动程序,该结构由初始化适配器时发送的 DxgkDdiStartDevice 函数的 DxgkStartInfo 参数指向。 用户模式捕获组件随后可以将此适配器 GUID 映射到显示适配器。

在 Microsoft Windows 2000 显示驱动程序模型中,视频捕获应用程序将系统内存捕获缓冲区发送到内核模式。 然后,内核模式通过使用 内存描述符列表 (MDL) 结构来描述系统内存缓冲区,并将 MDL 发送到视频捕获驱动程序。 除了支持捕获到系统内存外,Windows Vista 显示驱动程序模型还支持捕获到视频内存。 Direct3D 运行时调用 DirectX 视频加速 2.0 类型的函数,以指示 GPU 对捕获数据执行后处理。 用户模式显示驱动程序不会发送 MDL 来描述视频内存缓冲区,而是发送D3DKMT_HANDLE类型的值,这些值是用于捕获缓冲区分配的句柄。 因此,视频捕获驱动程序和显示微型端口驱动程序组合可以使用 DxgkCbGetHandleData 等现有回调函数来引用描述捕获缓冲区的私有数据。 驱动程序组合还可以使用 DxgkCbGetCaptureAddress 回调函数返回捕获缓冲区的物理地址。

视频捕获应用程序调用 Direct3D 运行时以创建捕获缓冲区;运行时随后会调用用户模式显示驱动程序。 运行时调用用户模式显示驱动程序的 CreateResource 函数,并在 D3DDDIARG_CREATERESOURCE 结构的 Flags 成员中设置 CaptureBuffer 位字段标志,以创建捕获缓冲区。 当内存管理器调用显示微型端口驱动程序的 DxgkDdiCreateAllocation 函数为捕获缓冲区创建分配时,显示微型端口驱动程序还必须为视频内存管理器指定捕获位字段标志。 创建捕获缓冲区后,它们会立即固定在内存中,在释放它们之前不会取消固定。 由于捕获堆栈必须将捕获缓冲区的内核模式分配句柄发送到捕获驱动程序,因此运行时调用用户模式显示驱动程序的 GetCaptureAllocationHandle 函数,以将每个资源句柄映射到该资源的内核模式分配句柄。

捕获驱动程序可以报告它是否支持直接捕获到系统内存。 如果捕获驱动程序支持直接捕获到系统内存,则 MDL 将发送到捕获驱动程序以实现此目的。 如果捕获驱动程序不支持直接捕获到系统内存,则运行时会创建视频内存捕获缓冲区,并且捕获驱动程序必须填充它们。 调用用户模式显示驱动程序的 CaptureToSysMem 函数,将捕获缓冲区的内容复制到系统内存图面。 运行时可以使用 CaptureToSysMem 而不是 Blt 函数来利用特殊硬件进行位块传输, (bitblt) 不需要用户模式显示驱动程序调用 pfnRenderCb 函数。

由于 AVStream 控制视频捕获,DirectX 图形内核子系统不知道何时发生视频捕获。 但是,图形内核子系统知道用作捕获缓冲区的分配。 当捕获缓冲区即将被销毁时,图形内核子系统会调用显示微型端口驱动程序的 DxgkDdiStopCapture 函数,以指示捕获操作必须立即停止使用分配作为捕获缓冲区。 如果捕获操作已通过捕获堆栈停止,驱动程序可以安全地忽略调用。