Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(五)

devtools/2025/3/20 8:15:51/

翻转队列日志 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 确保在启动模式更改或关闭监视器之前,硬件翻转队列中已排队的翻转已完成或取消。


http://www.ppmy.cn/devtools/168575.html

相关文章

分布式事务解决方案:Seata原理详解与实战教程

一、为什么需要Seata? 在微服务架构中,跨服务的事务管理成为核心痛点: 传统事务失效:服务拆分导致无法使用本地事务数据不一致风险:网络抖动、服务宕机等情况导致数据错乱复杂场景处理难:涉及多个数据库、…

C语言中,#define和typedef 定义int* 一个容易混淆的点

前言 首先来看一个代码&#xff1a; #include <stdio.h> #include <string.h>#define int_ptr int *int main() {int c 100;int_ptr a , b; // 等效于int * a,b; 那么b就是int类型&#xff0c;不是int*类型a &c;b &c; //报错return 0; } 原意&#x…

【数据分析】数据筛选(布尔索引:一个判断条件)

布尔索引 布尔索引&#xff1a;在实际应用中&#xff0c;只要是通过比较运算返回的判断结果&#xff08;一个布尔型Series&#xff09;&#xff0c;就可以进行布尔索引。 应用场景&#xff1a; 面对大型数据时&#xff0c;用于获取数据的行索引和列索引往往不确定&#xff0c…

代替Windows系统的最佳系统开发:开源、国产与跨平台的选择指南

近年来&#xff0c;随着技术自主化和隐私安全需求的提升&#xff0c;越来越多的用户开始寻求Windows系统的替代方案。本文结合国内外热门操作系统及开发工具&#xff0c;分析其核心优势与适用场景&#xff0c;助你找到最适合的开发与日常使用平台。 一、开源之王&#xff1a;Li…

C语言经典代码练习题

1.输入一个4位数&#xff1a;输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个&#xff14;位数&#xff1a;");scanf("%d",&a);printf("个位&#xff1a;%d\n"…

【华为OD题库-016】字符串摘要-Java

给定一个字符串的摘要算法&#xff0c;请输出给定字符串的摘要值 1、去除字符串中非字母的符号 2、如果出现连续字符(不区分大小写)&#xff0c;则输出:该字符(小)&#xff0b;连续出现的次数 3、如果是非连续的宁符(不区分大小写)&#xff0c;则输出:该字符(小写)该字母之后字…

如何解决Kafka Rebalance引起的重复消费

在Kafka中&#xff0c;Rebalance&#xff08;再平衡&#xff09;是消费者组&#xff08;Consumer Group&#xff09;动态调整分区分配的过程。当消费者组中的成员发生变化&#xff08;例如消费者加入或退出&#xff09;、订阅的Topic分区数量变化、或者消费者长时间未发送心跳时…

从头开始学C语言第二十八天——字符指针和字符串

C语言通过字符数组处理字符串。通常把char类型的指针变量称为字符指针&#xff0c;字符指针也被用来处理字符串。 初始化字符指针就是把字符串的首地址赋予指针&#xff0c;不是把字符串复制到字符指针。 char a[] "hello world"; char *pa a; *pa指向的不是字…