当前位置: 首页 > news >正文

window显示驱动开发—支持 DXGI DDI(四)

Direct3D 版本 11.2 DXGI 函数

本部分中的参考页介绍由用户模式显示驱动程序实现的 Microsoft DirectX 图形基础结构 (DXGI) 函数,这些功能是为 Microsoft Direct3D 版本 11.2 运行时添加的。 Direct3D 11.2 随 Windows 8.1 一起引入。

当运行时调用 CreateDevice (D3D10) 时,用户模式显示驱动程序 DLL 导出 OpenAdapter10_2 函数,并通过 D3D10_2DDI_ADAPTERFUNCS 结构的成员提供指向适配器特定函数的指针。

驱动程序在调用用户模式显示驱动程序的特定于适配器的 CreateDevice (D3D10) 函数时,通过 DXGI1_3_DDI_BASE_FUNCTIONS 结构的成员提供指向 Direct3D 版本 11.2 DXGI 函数的指针。

PFNDDXGIDDI_PRESENT_MULTIPLANE_OVERLAYCB: PFNDDXGIDDI_PRESENTCB

PFNDDXGIDDI_SUBMITPRESENTBLTTOHWQUEUECB: PFNDDXGIDDI_SUBMITPRESENTTOHWQUEUECB

 备注

Direct3D 11.2 运行时支持的其他 DXGI 函数包含在 用户模式驱动程序实现的多平面覆盖函数部分中。

 1. 版本背景与核心升级

Direct3D 11.2 随 Windows 8.1 引入,其 DXGI DDI 扩展聚焦:

  • 多平面覆盖增强:支持更复杂的混合场景(如HUD+视频+3D场景)
  • 硬件队列优化:新增 SubmitPresentBltToHwQueue 提升Blit效率
  • 显示缩放控制:系统级缩放比例管理(如高DPI显示)

2. 驱动初始化流程

(1) 适配器级注册 (OpenAdapter10_2)
需扩展 D3D10_2DDI_ADAPTERFUNCS 以支持11.2能力查询:

HRESULT OpenAdapter10_2(D3D10DDIARG_OPENADAPTER* pOpenData) {pOpenData->pAdapterFuncs_2->pfnGetSupportedVersions = MyGetDDIVersions;// ...其他标准函数
}

(2) 设备创建时提供DXGI 1.3 DDI
填充 DXGI1_3_DDI_BASE_FUNCTIONS 结构:

static const DXGI1_3_DDI_BASE_FUNCTIONS dxgi1_3_funcs = {.pfnPresent = MyPresentDXGI_11_2,// 继承11.1函数...// 新增11.2专有函数.pfnSubmitPresentBltToHwQueue = MySubmitBltToQueue,.pfnReclaimResources = MyReclaimResources
};

3. 关键新增函数实现

(1) 多平面覆盖增强

// 多平面覆盖配置回调(由DWM调用)
HRESULT APIENTRY MyPresentMultiplaneOverlayCB(DXGI_DDI_ARG_PRESENT_MULTIPLANE_OVERLAY* pOverlayData
) {// 支持每平面独立旋转和混合for (UINT i = 0; i < pOverlayData->NumPlanes; i++) {ConfigureOverlayPlane(pOverlayData->pPlanes[i].PlaneIndex,&pOverlayData->pPlanes[i].Transform,pOverlayData->pPlanes[i].BlendMode);}return S_OK;
}

(2) 硬件队列提交优化

void APIENTRY MySubmitBltToQueue(DXGI_DDI_ARG_SUBMITPRESENTBLTTOHWQUEUE* pBltData
) {// 直接提交到硬件Blit引擎队列QueueBltCommand(pBltData->hSrcResource,pBltData->hDstResource,&pBltData->BltRect,pBltData->ColorSpace);
}

(3) 资源回收通知

HRESULT APIENTRY MyReclaimResources(DXGI_DDI_ARG_RECLAIMRESOURCES* pReclaimData
) {// 标记资源可被GPU内存管理器回收for (UINT i = 0; i < pReclaimData->NumResources; i++) {MarkResourceAsReclaimable(pReclaimData->phResources[i]);}return S_OK;
}

4. 硬件特性报告

通过 DXGI1_3_DDI_BASE_CALLBACKS 扩展:

typedef struct DXGI1_3_DDI_BASE_CALLBACKS {DXGI1_2_DDI_BASE_CALLBACKS;PFNDDXGIDDI_GETSCALINGRECTS pfnGetScalingRects;PFNDDXGIDDI_CHECKSCALINGSUPPORT pfnCheckScalingSupport;
} DXGI1_3_DDI_BASE_CALLBACKS;

5. 显示缩放控制

BOOL APIENTRY MyCheckScalingSupport(DXGI_DDI_ARG_CHECKSCALINGSUPPORT* pSupport
) {// 报告硬件支持的缩放比例范围pSupport->MinScaling = 50;   // 最小50%pSupport->MaxScaling = 400;  // 最大400%return TRUE;
}

6. 调试与验证

Direct3D调试层:启用 D3D11_2DDI_DEBUG 捕获参数错误

GPUView:分析 SubmitPresentBltToHwQueue 执行时序

PIX:捕获多平面覆盖层的混合效果

关键设计原则:

多平面覆盖必须支持至少8个同时活动的平面

硬件队列提交应避免CPU-GPU同步点

缩放控制需与桌面DPI设置联动

http://www.lqws.cn/news/536185.html

相关文章:

  • 21.合并两个有序链表
  • vscode运行c++文件和插件的方法
  • C语言专题:15.宏定义与控制指令(#define、#ifndef、#undef、#defined)
  • MySQL(基础篇)
  • [特殊字符] Windows 查看端口占用及服务来源教程(以 9018 端口为例)
  • Oracle LogMiner分析日志的三种方法示例
  • UDP 和 TCP 可以同时使用相同的端口号
  • el-table表头添加说明
  • Excel基础:数据编辑
  • Excel:filter函数实现动态筛选的方法
  • 网络分层模型与协议体系技术研究报告
  • 微信小程序<rich-text>支持里面图片点击放大
  • 物联网与低代码:Node-RED如何赋能工业智能化与纵横智控的创新实践
  • 【51单片机5毫秒定时器】2022-6-1
  • 机器学习---正则化、过拟合抑制与特征筛选
  • 抖音图文带货权限怎么开通
  • Vue3 中 Axios 深度整合指南:从基础到高级实践引言总结
  • 《解锁FFmpeg - python:开启多媒体处理新时代》
  • 多线程编程 ----线程主动退出pthread_exit与线程被动退出pthread_cancel
  • DAY 33 简单的神经网络
  • 前端面试专栏-主流框架:14. Vue Router与Vuex核心应用
  • Spring Boot使用Redis常用场景
  • Python爬虫多线程并发时的503错误处理最佳实践
  • HTTP-Cookie和Session
  • 算法第48天|单调栈:42. 接雨水、84.柱状图中最大的矩形
  • 鸿蒙边缘智能计算架构实战:从环境部署到分布式推理全流程
  • window显示驱动开发—DirectX 图形内核子系统(一)
  • 树莓派超全系列教程文档--(67)rpicam-apps可用选项介绍之检测选项
  • 算法-最大子数组
  • 【Python】For