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

window 显示驱动开发-呈现开销改进(二)

对共享表面的纹理格式支持
驱动程序应支持共享资源和可共享的后台缓冲区,以使用 DXGI_FORMAT 枚举中的这些附加纹理格式:

  • DXGI_FORMAT_A8_UNORM
  • DXGI_FORMAT_R8_UNORM
  • DXGI_FORMAT_R8G8_UNORM
  • DXGI_FORMAT_BC1_TYPELESS\*
  • DXGI_FORMAT_BC1_UNORM
  • DXGI_FORMAT_BC1_UNORM_SRGB
  • DXGI_FORMAT_BC2_TYPELESS\*
  • DXGI_FORMAT_BC2_UNORM
  • DXGI_FORMAT_BC2_UNORM_SRGB
  • DXGI_FORMAT_BC3_TYPELESS\*
  • DXGI_FORMAT_BC3_UNORM
  • DXGI_FORMAT_BC3_UNORM_SRGB

此外,如果驱动程序在 Direct3D 功能级别 9 硬件上支持 Microsoft Direct3D 11 及更高版本,则应支持 DXGI_FORMAT_L8_UNORM 占位符格式。 DXGI_FORMAT_L8_UNORM 在功能上等效于 D3DDDIFMT_L8 格式。

驱动程序还应支持 来自 D3DDDIFORMAT 枚举的其他纹理格式:

  • D3DDDIFMT_G8R8
  • D3DDDIFMT_R8

1. 核心支持格式列表

WDDM 驱动程序必须为 共享资源 和 可交换的后台缓冲区 支持以下纹理格式:

(1) DXGI 格式(Direct3D 10/11/12)

格式描述典型用途
DXGI_FORMAT_A8_UNORM8-bit 单通道 Alpha(无类型)UI 蒙版、字体渲染
DXGI_FORMAT_R8_UNORM8-bit 单通道 Red灰度图像、高度图
DXGI_FORMAT_R8G8_UNORM16-bit 双通道(Red+Green)法线贴图、矢量场
DXGI_FORMAT_BC1_*BC1 压缩格式(DXT1)不透明/1-bit Alpha 纹理压缩
DXGI_FORMAT_BC2_*BC2 压缩格式(DXT3)带显式 Alpha 的纹理压缩
DXGI_FORMAT_BC3_*BC3 压缩格式(DXT5)带插值 Alpha 的纹理压缩

:标有 *_TYPELESS 的格式需支持类型转换(如 BC1_TYPELESS → BC1_UNORM)。

注:标有 *_TYPELESS 的格式需支持类型转换(如 BC1_TYPELESS → BC1_UNORM)。

(2) D3DDDI 格式(Direct3D 9 兼容性)

格式等效 DXGI 格式描述
D3DDDIFMT_L8_UNORMDXGI_FORMAT_R8_UNORM8-bit 灰度(Direct3D 9 遗留)
D3DDDIFMT_G8R8DXGI_FORMAT_R8G8_UNORM16-bit Green+Red
D3DDDIFMT_R8DXGI_FORMAT_R8_UNORM8-bit Red

2. 驱动实现要求

(1) 格式声明
在 D3D10DDI_D3D11_OPTIONS 或 DXGI_DDI_BASE_ARGS 中声明支持:

DXGI_DDI_BASE_ARGS BaseArgs = {0};
BaseArgs.DDIVersion = DXGI_DDI_VERSION_1_3;
BaseArgs.SupportedFormats.R8_UNORM = TRUE;  // 示例:启用 R8_UNORM

(2) 共享资源创建
处理 D3D11_DDI_RESOURCE_MISC_SHARED 标志的资源分配:

HRESULT CreateSharedResource(D3D10DDI_HDEVICE hDevice,CONST D3D11DDIARG_CREATERESOURCE* pArgs
) {if (pArgs->MiscFlags & D3D11_DDI_RESOURCE_MISC_SHARED) {ValidateFormat(pArgs->Format);  // 检查是否为支持的共享格式}// 正常创建资源...
}

(3) 跨 API 兼容性
Direct3D 9 → Direct3D 11 共享:

  • 将 D3DDDIFMT_L8_UNORM 映射为 DXGI_FORMAT_R8_UNORM。
  • 确保 D3DDDIFMT_G8R8 与 DXGI_FORMAT_R8G8_UNORM 数据布局一致。

3. 特殊场景处理

(1) Direct3D 9 硬件的 D3D11 支持
若硬件仅支持 Direct3D 9 功能级别,仍需通过占位符格式 DXGI_FORMAT_L8_UNORM 提供灰度支持:

// 在 GetCaps 中响应查询
if (Type == D3DDDICAPS_GET_FORMAT_SUPPORT) {if (pArgs->Format == DXGI_FORMAT_L8_UNORM) {*(BOOL*)pData = TRUE;  // 声明支持}
}

(2) 压缩纹理的共享
BCn 压缩格式需保证跨进程/设备可访问:

  • 内存对齐:BC1/BC2/BC3 的块大小为 4x4 像素。
  • 禁止格式转换(除非显式指定 TYPELESS)。

4. WHCK 认证测试项

测试项验证目标方法
Device.Graphics.WDDM13.Format.Shared共享资源的格式支持正确性。创建共享表面并跨进程读写验证。
Device.Graphics.WDDM13.Format.BCnBC 压缩纹理的共享与渲染一致性。PIX 捕获压缩纹理数据。
Device.Graphics.WDDM13.Format.D3D9CompatD3D9 遗留格式(如 L8_UNORM)的兼容性。D3D9 与 D3D11 互操作测试。

5. 调试与问题排查

常见问题:

  • 共享失败:检查格式是否在 SupportedFormats 中声明。
  • 数据错乱:验证 D3DDDIFMT_G8R8 与 DXGI_FORMAT_R8G8_UNORM 的通道顺序是否一致(G=R, R=G)。

工具推荐:

  • PIX on Windows:捕获共享表面的内存布局。
  • DirectX Caps Viewer:检查驱动声明的格式支持。

6. 性能优化建议

  • 压缩纹理优先:对共享的静态纹理(如 UI 素材)使用 BCn 压缩以减少内存带宽。
  • 灰度优化:R8_UNORM/L8_UNORM 格式适合单通道数据(如遮罩),节省 75% 内存。
  • 内存对齐:共享表面按 4KB 对齐,避免跨进程访问的性能惩罚。

7. 总结

强制要求:WDDM 1.3+ 驱动必须支持上述格式以实现跨 API/进程资源共享。

关键点:

  • 正确处理 D3DDDIFMT_* 与 DXGI_FORMAT_* 的映射关系。
  • 压缩纹理(BCn)需保证共享时的数据一致性。

兼容性:Direct3D 9 硬件需通过 L8_UNORM 提供灰度支持。

相关文章:

  • [IMX] 08.RTC 时钟
  • 大模型RL方向面试题90道
  • 第九届水动力学与能源电力系统国际学术会议(HEEPS 2025)
  • 告别延迟!modbus tcp转profine网关助力改造电厂改造升级
  • LeetCode#第58题:最后一个单词的长度
  • python打卡day37@浙大疏锦行
  • C/C++内存泄漏深度解析与系统化解决方案
  • uniapp 配置本地 https 开发环境(基于 Vue2 的 uniapp)
  • 【前端】使用HTTPS
  • Debian操作系统全面解析:从起源到应用
  • ARINC818_FILE
  • Nginx 安全防护与 HTTPS 部署实战笔记
  • Oracle 的V$LOCK 视图详解
  • nginx安全防护与https部署实战
  • GaussDB资源冻结与解冻:精细化资源管理的实践与策略
  • 《软件工程》第 7 章 - 软件体系结构设计
  • Android开机向导定制(1)开机向导加载流程
  • 《软件工程》第 15 章 - 软件度量与估算:从概念到实践​
  • opencvsharp usb摄像头录像 c# H264编码
  • Python 网络编程入门
  • 建设银行甘肃省行网站/如何网络推广新产品
  • 深圳市住房和建设局网站下载/站长工具百度
  • 网站建设费计入销售费用的子目/百度云盘资源搜索
  • 济南制作网站的公司吗/今天最火的新闻头条
  • 华大基因 建设网站/seo教程排名第一
  • 网站建设原则包括哪些方面/百度竞价排名平台