window 显示驱动开发-如何查询视频处理功能(二)
D3DDDICAPS_GETVIDEOPROCESSORCAPS请求类型
UMD 支持的每个视频处理器模式都可以具有独特的功能。 传递D3DDDICAPS_GETVIDEOPROCESSORCAPS请求类型时,UMD 将返回这些功能。 Direct3D 运行时为视频处理模式指定一个DXVADDI_VIDEOPROCESSORINPUT结构,以便在 D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中检索其功能。 UMD 返回D3DDDIARG_GETCAPS的 pData 成员指向的DXVADDI_VIDEOPROCESSORCAPS结构中的视频处理模式的功能。
能力查询机制架构
查询流程
输入结构:DXVADDI_VIDEOPROCESSORINPUT
- 包含目标视频处理器GUID和视频流描述
输出结构:DXVADDI_VIDEOPROCESSORCAPS
- 返回处理器的详细能力信息
关键数据结构
输入结构 (DXVADDI_VIDEOPROCESSORINPUT)
typedef struct _DXVADDI_VIDEOPROCESSORINPUT {GUID VPGuid; // 查询的处理器GUIDDXVADDI_VIDEODESC VideoDesc; // 视频流描述D3DDDIFORMAT RenderTargetFormat; // 渲染目标格式
} DXVADDI_VIDEOPROCESSORINPUT;
输出能力结构 (DXVADDI_VIDEOPROCESSORCAPS)
typedef struct _DXVADDI_VIDEOPROCESSORCAPS {UINT DeviceCaps; // 设备能力标志UINT InputPool; // 输入表面内存池类型UINT NumForwardRefSamples; // 前向参考帧数UINT NumBackwardRefSamples; // 后向参考帧数UINT Reserved; // 保留字段UINT DeinterlaceTechnology; // 去隔行技术类型UINT ProcAmpControlCaps; // ProcAmp控制能力UINT VideoProcessorOperations; // 支持的视频处理操作UINT NoiseFilterTechnology; // 降噪技术UINT DetailFilterTechnology; // 细节增强技术
} DXVADDI_VIDEOPROCESSORCAPS;
能力标志详解
设备能力标志 (DeviceCaps)
标志值 | 含义 |
---|---|
DXVA2_VPDev_Emulated | 软件模拟处理器 |
DXVA2_VPDev_HardwareDevice | 硬件加速处理器 |
DXVA2_VPDev_SoftwareDevice | 纯软件处理器 |
DXVA2_VPDev_Mask | 设备类型掩码 |
去隔行技术 (DeinterlaceTechnology)
技术类型 | 描述 |
---|---|
DXVA2_DeinterlaceTech_Unknown | 未知技术 |
DXVA2_DeinterlaceTech_BOBLineReplicate | Bob行复制 |
DXVA2_DeinterlaceTech_BOBVerticalStretch | Bob垂直拉伸 |
DXVA2_DeinterlaceTech_MedianFiltering | 中值滤波 |
DXVA2_DeinterlaceTech_EdgeFiltering | 边缘滤波 |
DXVA2_DeinterlaceTech_FieldAdaptive | 场自适应 |
DXVA2_DeinterlaceTech_PixelAdaptive | 像素自适应 |
DXVA2_DeinterlaceTech_MotionVectorSteered | 运动矢量导向 |
ProcAmp控制能力 (ProcAmpControlCaps)
控制标志 | 功能 |
---|---|
DXVA2_ProcAmp_None | 无控制 |
DXVA2_ProcAmp_Brightness | 亮度调整 |
DXVA2_ProcAmp_Contrast | 对比度调整 |
DXVA2_ProcAmp_Hue | 色相调整 |
DXVA2_ProcAmp_Saturation | 饱和度调整 |
驱动程序实现规范
典型处理逻辑
case D3DDDICAPS_GETVIDEOPROCESSORCAPS: {// 参数验证if (pArgs->DataSize < sizeof(DXVADDI_VIDEOPROCESSORCAPS)) {pArgs->DataSize = sizeof(DXVADDI_VIDEOPROCESSORCAPS);return E_INVALIDARG;}// 解析输入参数DXVADDI_VIDEOPROCESSORINPUT* pInput = (DXVADDI_VIDEOPROCESSORINPUT*)pArgs->pInfo;// 填充能力结构DXVADDI_VIDEOPROCESSORCAPS* pCaps = (DXVADDI_VIDEOPROCESSORCAPS*)pArgs->pData;ZeroMemory(pCaps, sizeof(DXVADDI_VIDEOPROCESSORCAPS));// 根据GUID设置能力if (pInput->VPGuid == DXVA2_VideoProcProgressiveDevice) {pCaps->DeviceCaps = DXVA2_VPDev_HardwareDevice;pCaps->DeinterlaceTechnology = DXVA2_DeinterlaceTech_Unknown;pCaps->ProcAmpControlCaps = DXVA2_ProcAmp_Brightness | DXVA2_ProcAmp_Contrast;// ...其他能力设置}// 其他处理器类型的处理...pArgs->DataSize = sizeof(DXVADDI_VIDEOPROCESSORCAPS);return S_OK;
}
高级能力报告策略
动态能力适配
根据输入视频描述动态调整报告的能力:
// HDR视频特殊处理
if (pInput->VideoDesc.SampleExtendedFormat.VideoPrimaries == DXVA2_VideoPrimaries_BT2020) {pCaps->VideoProcessorOperations |= DXVA2_VideoProcess_YUV2RGBExtended;
}
性能分级报告
// 根据系统负载调整报告的能力
if (GetSystemLoadLevel() > THRESHOLD_HIGH) {pCaps->ProcAmpControlCaps &= ~DXVA2_ProcAmp_Hue; // 高负载时禁用色相调整
}
错误处理规范
无效GUID处理
if (!IsSupportedVPGuid(pInput->VPGuid)) {return DXVA2_E_UNSUPPORTED_DEVICE;
}
格式不支持
if (!CheckFormatSupport(pInput->RenderTargetFormat)) {return DXVA2_E_UNSUPPORTED_FORMAT;
}
实际应用示例
运行时查询代码
// 准备查询参数
DXVADDI_VIDEOPROCESSORINPUT input = {DXVA2_VideoProcProgressiveDevice, // 目标处理器{ /* 视频描述 */ }, // DXVADDI_VIDEODESCD3DDDIFMT_NV12 // 渲染目标格式
};DXVADDI_VIDEOPROCESSORCAPS caps;
D3DDDIARG_GETCAPS args = {D3DDDICAPS_GETVIDEOPROCESSORCAPS,&input,&caps,sizeof(DXVADDI_VIDEOPROCESSORCAPS)
};// 执行查询
HRESULT hr = pDevice->GetCaps(&args);
if (SUCCEEDED(hr)) {// 分析返回的能力if (caps.DeviceCaps & DXVA2_VPDev_HardwareDevice) {// 使用硬件加速路径}
}
此能力查询机制使应用程序能够:
- 精确了解每个视频处理器的特性
- 根据实际需求选择最佳处理模式
- 实现功能降级和兼容性处理
- 优化视频处理流水线配置
驱动程序实现时应确保返回的能力信息准确反映硬件真实能力,并根据系统状态动态调整报告的能力集。