Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(四)

一、无覆盖和放弃

在基于磁贴的延迟呈现 (TBDR) 体系结构上呈现内容:

Direct3D 11.1 中的呈现目标现在可以使用一组新的资源 API 来支持放弃行为。 开发人员必须了解此功能,并调用额外的 Discard () 方法,以在 TBDR 体系结构 (更高效地运行,不会对传统图形硬件) 造成任何损失。 这将提高移动平台和使用平铺呈现器的其他受电源限制的设备的性能。

1.1 现代GPU架构演变

复制代码
graph LR
    A[传统IMR架构] -->|功耗瓶颈| B[TBDR架构]
    B --> C[PowerVR Series]
    B --> D[ARM Mali]
    B --> E[Adreno]

1.2 关键工作流程对比

阶段 IMR架构 TBDR架构
几何处理 立即提交 分块缓存
光栅化 全屏扫描 分块执行
像素着色 无序执行 按块优化

二 、放弃(Discard)API详解

2.1 核心接口增强

复制代码
阶段	IMR架构	TBDR架构
几何处理	立即提交	分块缓存
光栅化	全屏扫描	分块执行
像素着色	无序执行	按块优化

2.2 内存优化机制

复制代码
graph TB
    A[应用调用Discard] --> B[驱动标记内存块]
    B --> C{是否TBDR架构?}
    C -->|是| D[释放片上缓存]
    C -->|否| E[无操作]

三、移动平台专项优化

3.1 能效提升数据

场景 功耗降低 帧率提升
UI渲染 22% 15%
2D游戏 18% 12%
网页浏览 25% 9%

3.2 最佳实践指南

复制代码
// 每帧结束前调用
void EndFrame() {
    pContext1->DiscardView(pRTV);
    pContext1->DiscardView(pDSV);
    if (pUAView) pContext1->DiscardView(pUAView);
}

四、开发者适配方案

4.1 兼容性检查流程

复制代码
graph TD
    A[创建设备] --> B[查询D3D11_FEATURE_DATA_ARCHITECTURE_INFO]
    B --> C{IsTileBasedDeferredRenderer?}
    C -->|是| D[启用Discard优化]
    C -->|否| E[保持传统路径]

4.2 多平台代码示例

复制代码
#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)
    #define USE_TBDR_OPTIMIZATION 1
#else
    #define USE_TBDR_OPTIMIZATION 0
#endif

void Present() {
    if(USE_TBDR_OPTIMIZATION) {
        pContext1->DiscardView(pRTV);
    }
    pSwapChain->Present(1, 0);
}

五、性能诊断工具

5.1 PIX for Windows分析

复制代码
# 捕获Discard调用
PIXCapture -discard -file tdr_capture.wpix

5.2 功耗监测指标

计数器 TBDR优化值 传统架构基准
GPU功耗(mW) 1200 1800
显存带宽(GB/s) 8.5 12.2
帧延迟(ms) 16 22

六、更新 TBDR 体系结构上的资源

由于 TBDR 体系结构通过同一命令缓冲区完成多次传递,因此,在上一次绘制调用期间未修改子资源的一部分时,必须特别小心地通知驱动程序。 在 Direct3DUpdateSubResource 函数上拥有NO_OVERWRITE用法可帮助驱动程序管理以前未对纹理区域进行绘制调用的资源。 这只需告知驱动程序应用程序放弃现有数据或防止其覆盖的意图。 这样就可以更高效地在 TBDR 体系结构上呈现,并且不会在传统桌面硬件上运行它时产生任何处罚。

Direct3D 11 UpdateSubresource () 和 CopySubresourceRegions API 的新变体都更新了 GPU 图面的一部分,提供了一个可在其中指定NO_OVERWRITE或 DISCARD 的附加标志字段。

这些 API 驱动 Direct3D 11.1 设备驱动程序接口 (DDI) 和 Direct3D 9 DDI。 任何 DirectX 9 以上硬件的新驱动程序都需要通过添加此处讨论的标志来支持修改后的 BLT、BUFBLT、VOLBLT 和 TEXBLT DDI。

对于具有 Direct3D 11.1 驱动程序的所有 Direct3D 10+ 硬件,还需要支持这些硬件。

相关推荐
大江东去浪淘尽千古风流人物3 天前
【Micro-WL Robot】桌面级轮腿机器人全栈解析:LQR平衡控制、SimpleFOC驱动与五连杆腿部机构源码深度拆解
驱动开发·机器人·esp32·lqr·simplefoc·轮腿机器人·平衡控制
咖啡星人k3 天前
自然语言驱动开发(NLDD):全栈开发的新范式与实践指南
驱动开发
阿昭L3 天前
Windows键盘过滤
windows·驱动开发·windows内核·过滤驱动
hai3152475434 天前
# 矩阵算法·算子对齐工具 v6.1 — 技术规格与使用手册
java·开发语言·驱动开发·神经网络·spring·目标检测·矩阵
qq_411262425 天前
sdk不支持分配psarm如何办,能不能象S3一样支持
驱动开发
湉湉家的小虎子5 天前
【科普贴】浅谈UFS接口——偏硬件解析
驱动开发·嵌入式硬件·fpga开发·硬件工程
枳实-叶6 天前
【Linux驱动开发】第18天:I2C驱动深度解析
linux·运维·驱动开发
小此方6 天前
Re:Linux系统篇(二十五)进程篇·十:深度硬核!Linux 进程等待,从 task_struct 源码到位图状态解构
linux·运维·驱动开发
Gentle5866 天前
SENT&SPC协议中的CRC4校验
驱动开发
智者知已应修善业7 天前
【proteus设计文氏正弦波信号发生器】2023-5-9
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程