> 技术文档 > window显示驱动开发—Direct3D 版本 11 的管道_direct3d11

window显示驱动开发—Direct3D 版本 11 的管道_direct3d11

本部分仅适用于 Windows 7 及更高版本以及 Windows Server 2008 R2 及更高版本的 Windows 操作系统。

除了 Direct3D 版本 10 支持的共享可编程着色器核心外,Direct3D 版本 11 还支持外壳、域和计算着色器核心。

Direct3D 版本 11 实际上支持两个单独的管道:绘图管道 (图形呈现管道) 和调度管道 (计算着色器管道) 。 从技术上讲,绘制和调度管道是松散连接的,也就是说,不能将同一个子资源绑定在两个管道中同时写入,也不能绑定用于在一个管道中写入和在其他管道中读取。

下图显示了 Direct3D 版本 11 的绘图管道的功能块

下图显示了 Direct3D 版本 11 的调度管道的功能块

 Direct3D 11 管线核心特性

1. 着色器阶段扩展(对比 D3D10)

着色器类型 功能描述 对应硬件单元 顶点着色器 (VS) 处理顶点变换(继承自 D3D10) 可编程着色器核心 外壳着色器 (HS) 细分曲面控制阶段,生成细分控制点与面片参数 专用细分曲面单元(可选) 域着色器 (DS) 细分曲面评估阶段,将参数化坐标转换为实际顶点 可编程着色器核心 几何着色器 (GS) 图元增删/变形(继承自 D3D10) 可编程着色器核心 像素着色器 (PS) 像素级光照与材质计算(继承自 D3D10) 可编程着色器核心 计算着色器 (CS) 通用并行计算(GPGPU),独立于图形管线 计算着色器核心

2. 双管道架构

graph LR subgraph 绘图管道 A[输入装配] --> B[顶点着色器] B --> C[外壳着色器] C --> D[细分曲面固定功能] D --> E[域着色器] E --> F[几何着色器] F --> G[光栅化] G --> H[像素着色器] H --> I[输出合并] end subgraph 调度管道 J[计算着色器] --> K[无序访问视图 UAV] end style A fill:#f9f,stroke:#333 style J fill:#9f9,stroke:#333

松耦合规则:

❌ 禁止同一子资源同时在两个管道中写入。

❌ 禁止同一子资源在一个管道写入时另一管道读取。

✅ 允许只读资源跨管道共享(如纹理绑定为 SRV)。

驱动程序实现要求

1. 着色器核心支持

  • 必需实现:VS/PS/CS(计算着色器为 D3D11 强制要求)。
  • 可选实现:HS/DS/GS(若硬件不支持细分曲面,需在 GetCaps 中声明 D3D11_FEATURE_D3D11_OPTIONS::Tessellation 为 FALSE)。

2. 资源状态管理

// 驱动需跟踪资源绑定状态(示例伪代码)struct DRIVER_RESOURCE { D3D11_RESOURCE_STATES graphicsState; D3D11_RESOURCE_STATES computeState; bool IsConflict() { // 检查跨管道冲突 return (graphicsState & D3D11_RESOURCE_STATE_WRITE) && (computeState & D3D11_RESOURCE_STATE_WRITE_OR_READ); }};

3. 计算管线加速

  • 线程组调度:需实现 pfnDispatch 和 pfnDispatchIndirect,支持线程组三维调度(如 [numthreads(8,8,1)])。
  • 共享内存:为计算着色器配置硬件共享内存(如 NVIDIA SMX 的 L1 Cache)。

硬件能力报告(GetCaps)

驱动程序必须通过 D3D11DDICAPS_D3D11_OPTIONS 报告管线支持情况:

D3D11_FEATURE_DATA_D3D11_OPTIONS caps = {};caps.OutputMergerLogicOp = FALSE; // 示例:硬件不支持逻辑混合caps.Tessellation = TRUE;  // 支持细分曲面caps.ComputeShaders_Plus_RawAndStructuredBuffers_Via_Shader_4_x = TRUE;pDeviceFuncs->pfnGetCaps(pDevice, &caps);

典型冲突场景处理

场景 驱动行为 同一缓冲区同时绑定为绘图管线的UAV和计算管线的UAV 返回 DXGI_ERROR_INVALID_CALL,记录调试错误。 计算着色器写入纹理时绘图管线尝试读取 插入隐式资源屏障(D3D11_RESOURCE_BARRIER_UAV),或拒绝执行并报错。

调试与验证工具

API 验证层

  • 启用 D3D11_CREATE_DEVICE_DEBUG 检测跨管道资源冲突。

GPU 捕获工具

  • 使用 PIX 或 RenderDoc 分析绘图/计算管线的资源绑定状态。

性能分析

  • 通过 Windows Performance Analyzer 检查计算着色器线程组利用率。

示例:细分曲面管线配置

// 驱动处理 HS/DS 的硬件配置void ConfigureTessellationPipeline() { if (HardwareSupportsTessellation()) { WriteRegister(TESS_CONTROL_REG, HS_PATCH_CONTROL_POINTS); WriteRegister(TESS_EVAL_REG, DS_DOMAIN_LOCATION); } else { // 回退到软件模拟(需声明不支持) SetSoftwareFallback(HS_DS_FALLBACK); }}

总结

  1. 双管道隔离:严格分离绘图与计算管线的资源访问,避免数据竞争。
  2. 动态能力检测:通过 GetCaps 声明细分曲面等可选特性支持。
  3. 硬件加速:为计算着色器优化线程组调度与共享内存管理。