window 显示驱动开发-转换 Direct3D 固定函数状态(二)
未使用的User-Mode显示驱动程序函数
启用固定函数顶点着色器转换器时,Direct3D 运行时不会调用以下 用户模式显示驱动程序函数 :
-
MultiplyTransform
-
SetTransform
-
SetMaterial
-
SetLight
-
CreateLight
-
DestroyLight
1. 核心规则
当 固定功能顶点着色器转换器(Fixed-Function Vertex Shader Converter) 启用时,Direct3D 运行时将 跳过 对以下传统固定功能管线管理函数的调用,因为这些状态已通过转换器自动嵌入生成的着色器中:
未调用的函数 | 原功能描述 |
---|---|
MultiplyTransform | 合并两个变换矩阵(如世界×视图矩阵)。 |
SetTransform | 设置单独变换矩阵(如投影矩阵)。 |
SetMaterial | 定义当前材质属性(环境光、漫反射等)。 |
SetLight | 配置光源参数(位置、颜色、衰减等)。 |
CreateLight | 创建光源对象。 |
DestroyLight | 销毁光源对象。 |
2. 触发条件
以下场景会激活此行为:
显式启用转换器:
通过 IDirect3D9::CreateDevice 的 BehaviorFlags 指定。 D3DCREATE_ENABLE_FIXED_FUNCTION_CONVERTER。
隐式触发:
- 硬件支持顶点着色器 2.0+ 且应用使用固定功能管线(如 SetFVF)。
- 混合顶点处理模式(部分操作硬件加速)。
3. 驱动实现影响
(1) 函数实现仍必需
尽管这些函数可能不被调用,UMD 仍需完整实现它们以通过 WHQL 认证,因为:
- 转换器可能被动态禁用(如切换到不支持着色器的硬件路径)。
- 旧版应用可能直接调用这些函数。
(2) 优化建议
// 示例:SetTransform 的空实现(仍需存在)
HRESULT APIENTRY SetTransform(D3DDDITRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix
) {// 可记录日志,但无需实际处理DebugPrint("警告:SetTransform 在转换器启用时被调用");return S_OK; // 必须返回成功
}
4. 运行时替代行为
固定功能操作 | 转换器处理方式 |
---|---|
矩阵变换 (SetTransform ) | 将矩阵作为常量寄存器传入生成的顶点着色器(如 c0-c3 存储世界矩阵)。 |
光照/材质 (SetLight ) | 将光照方程转换为着色器代码,材质属性硬编码到像素着色器。 |
5. 调试与验证
检查转换器状态:
if (pDevice->IsFixedFunctionConverterEnabled()) {DebugPrint("转换器激活,忽略固定功能调用");
}
工具验证:
- PIX on Windows:捕获渲染帧,观察是否生成替代着色器。
- DirectX Debug Runtime:启用调试层检查无效调用。
6. WHCK 认证要求
测试项 | 验证目标 |
---|---|
Device.Graphics.D3D9.FixedFunctionConverter | 转换器启用时是否跳过指定函数调用。 |
Device.Graphics.D3D9.LegacyFunctionStub | 未调用函数仍需存在且返回成功。 |
7. 总结
关键点:
- 转换器启用时,固定功能状态由运行时自动管理,驱动无需处理。
- 相关函数仍需保留为存根(Stub)以满足接口要求。
性能影响:
- 减少驱动状态管理开销,但可能增加着色器生成时间。