翻转队列日志 DDI
添加了以下与翻转队列日志相关的回调和相关结构:
- DXGKDDI_SETFLIPQUEUELOGBUFFER
- DXGKARG_SETFLIPQUEUELOGBUFFER
- DXGK_FLIPQUEUE_LOG_ENTRY
- DXGKDDI_UPDATEFLIPQUEUELOG
- DXGKARG_UPDATEFLIPQUEUELOG
KMD 提供了一个指向其在 DRIVER_INITIALIZATION_DATA 中的函数的指针。
VSync 中断结构更新
对 DXGKARGCB_NOTIFY_INTERRUPT_DATA 结构进行了以下更改,以实现硬件翻转队列模型的 VSync 中断:
- DXGK_INTERRUPT_CRTC_VSYNC_WITH_MULTIPLANE_OVERLAY3 枚举值已添加为 InterruptType。
- CrtcVSyncWithMultiPlaneOverlay3 结构已添加到联合中。 CrtcVSyncWithMultiPlaneOverlay3 的语义类似于现有的 CrtcVSyncWithMultiPlaneOverlay2 结构,不同之处在于,除了每个平面的最后一个完整 PresentId,CrtcVSyncWithMultiPlaneOverlay3.pMultiPlaneOverlayVSyncInfo 指向翻转队列日志中以前未报告的 PresentId 的范围。
- 为 CrtcVSyncWithMultiPlaneOverlay3 的 pMultiPlaneOverlayVSyncInfo 成员添加了 DXGK_MULTIPLANE_OVERLAY_VSYNC_INFO3 结构。
再次使用基本硬件翻转队列示例图:
假设在提交翻转 N 时,FirstFreeFlipQueueLogEntryIndex 设置为 40,然后完成 N、N+1、N+2 演示。
在单个平面配置分别完成三个 PresentIds N、 N+1 和 N+2 后,v2、v3、v4、KMD 在其翻转队列日志缓冲区中写入了三个新条目,索引为 40、41 和 42。 KMD 报告 CrtcVSyncWithMultiPlaneOverlay3 结构中的 FirstFreeFlipQueueLogEntryIndex 值为 43。 OS 观察到 FirstFreeFlipQueueLogEntryIndex 从 40 更改为 43,从日志条目 40、41 和 42 读取。 KMD 需要设置以下翻转队列日志缓冲区值,如下所示:
- VidPnTargetId:与 CrtcVSyncWithMultiPlaneOverlay2 中的含义相同
- PhysicalAdapterMask:与 CrtcVSyncWithMultiPlaneOverlay2 的含义相同
- MultiPlaneOverlayVSyncInfoCount = 1
- pMultiPlaneOverlayVSyncInfo[0].LayerIndex = 0
- pMultiPlaneOverlayVSyncInfo[0].FirstFreeFlipQueueLogEntryIndex = 43
- LogBufferAddressForPlane0[40].PresentId = N
- LogBufferAddressForPlane0[40].PresentTimestamp = v2
- LogBufferAddressForPlane0[41].PresentId = N+1
- LogBufferAddressForPlane0[41].PresentTimestamp = v3
- LogBufferAddressForPlane0[42].PresentId = N+2
- LogBufferAddressForPlane0[42].PresentTimestamp = v4
显式翻转队列日志更新请求
在某些情况下,OS 需要获取有关最后一批完成的翻转的信息,而不必等待 VSync 中断。 在这种情况下,OS 显式调用 DxgkDdiUpdateFlipQueueLog,以请求 KMD 从其专有显示硬件数据结构读取,并将过去的翻转信息写入翻转队列日志。 日志的语义与前面所述的语义相同;唯一的变化是 FirstFreeFlipQueueLogEntryIndex 返回到 VSync 中断之外的 OS。
DxgkDdiUpdateFlipQueueLog 在设备中断级别 (DIRQL) 调用,它与 DxgkDdiSetVidPnSourceAddressWithMultiPlaneOverlay3 DDI 位于同一同步类中。
在硬件翻转队列中存在排队翻转时显示模式更改和电源转换
Dxgkrnl 确保在启动模式更改或关闭监视器之前,硬件翻转队列中已排队的翻转已完成或取消。