window 显示驱动开发-创建视频处理设备
Microsoft Direct3D 运行时调用用户模式显示驱动程序的 CreateVideoProcessDevice 函数来创建用于处理视频流的设备。 当 Direct3D 运行时与设备一起完成时,它会调用用户模式显示驱动程序的 DestroyVideoProcessDevice 函数。
核心架构
视频处理设备的创建与销毁是DirectX视频处理流水线的关键环节,主要包括以下两个关键函数调用:
- CreateVideoProcessDevice - 创建视频处理设备
- DestroyVideoProcessDevice - 销毁视频处理设备
设备创建流程
函数原型
HRESULT CreateVideoProcessDevice(D3DDDIARG_CREATEVIDEOPROCESSDEVICE* pCreateData,const DXVADDI_VIDEOPROCESSORDEVICEDESC* pDesc
);
关键数据结构
创建参数结构:
typedef struct _D3DDDIARG_CREATEVIDEOPROCESSDEVICE {HANDLE hVideoProcess; // 输出:视频处理器句柄VOID* pPrivateDriverData; // 私有驱动数据UINT PrivateDriverDataSize; // 私有数据大小
} D3DDDIARG_CREATEVIDEOPROCESSDEVICE;
设备描述结构:
typedef struct _DXVADDI_VIDEOPROCESSORDEVICEDESC {GUID VPGuid; // 视频处理器GUIDDXVADDI_VIDEODESC VideoDesc;// 视频流描述D3DDDIFORMAT RenderTargetFormat; // 目标格式UINT MaxNumSubStreams; // 最大子流数量
} DXVADDI_VIDEOPROCESSORDEVICEDESC;
驱动程序实现要点
参数验证:
if (!pDesc || pDesc->MaxNumSubStreams > MAX_HW_SUBSTREAMS) {return E_INVALIDARG;
}
硬件资源分配:
HRESULT hr = AllocateHWVideoProcessor(pDesc->VPGuid,pDesc->VideoDesc.SampleWidth,pDesc->VideoDesc.SampleHeight);
上下文创建:
VideoProcessorContext* pContext = new VideoProcessorContext;
pContext->hwContext = GetHWContextHandle();
pCreateData->hVideoProcess = (HANDLE)pContext;
设备销毁流程
函数原型
VOID DestroyVideoProcessDevice(HANDLE hVideoProcess);VOID DestroyVideoProcessDevice(HANDLE hVideoProcess);
资源清理步骤
停止处理流水线:
FlushVideoProcessingQueue(hVideoProcess);
释放硬件资源:
ReleaseHWVideoProcessor(pContext->hwContext);
销毁上下文:
delete (VideoProcessorContext*)hVideoProcess;
高级管理策略
设备池化管理
static std::map<GUID, std::vector<HANDLE>> g_videoProcessorPool;HRESULT CreateVideoProcessDevice(...) {// 尝试从池中获取设备if (!g_videoProcessorPool[pDesc->VPGuid].empty()) {pCreateData->hVideoProcess = g_videoProcessorPool[pDesc->VPGuid].back();g_videoProcessorPool[pDesc->VPGuid].pop_back();return S_OK;}// ...创建新设备
}
多GPU适配
HRESULT CreateVideoProcessDevice(...) {// 根据内容类型选择适配器if (pDesc->VideoDesc.SampleExtendedFormat.VideoPrimaries == DXVA2_VideoPrimaries_BT2020) {BindToHDRCapableAdapter();}// ...正常创建流程
}
错误处理与恢复
设备丢失处理
HRESULT hr = CreateVideoProcessDevice(...);
if (hr == DXVA2_E_VIDEO_DEVICE_LOST) {// 重新初始化硬件ReinitializeHardware();// 重试创建hr = CreateVideoProcessDevice(...);
}
资源不足处理
if (hr == E_OUTOFMEMORY) {// 释放缓存资源ReleaseTemporaryResources();// 重试创建hr = CreateVideoProcessDevice(...);
}
性能优化
异步创建
// 使用工作线程预创建设备
std::thread preCreationThread([]{D3DDDIARG_CREATEVIDEOPROCESSDEVICE createData = {...};CreateVideoProcessDevice(&createData, ...);
});
热备设备
// 维护备用设备列表
std::vector<HANDLE> standbyDevices;void MaintainStandbyDevices() {while (standbyDevices.size() < STANDBY_COUNT) {HANDLE hDevice = CreateDeviceInBackground();standbyDevices.push_back(hDevice);}
}
实际应用示例
完整创建流程
// 1. 准备设备描述
DXVADDI_VIDEOPROCESSORDEVICEDESC desc = {DXVA2_VideoProcProgressiveDevice,{1920, 1080, D3DDDIFMT_NV12, ...},D3DDDIFMT_A8R8G8B8,2 // 支持2个子流
};// 2. 创建设备
D3DDDIARG_CREATEVIDEOPROCESSDEVICE createData = {0};
HRESULT hr = pDevice->CreateVideoProcessDevice(&createData, &desc);// 3. 使用设备...
// ...// 4. 销毁设备
pDevice->DestroyVideoProcessDevice(createData.hVideoProcess);
此设备管理机制提供:
- 高效硬件资源利用
- 低延迟设备创建
- 完善的错误恢复
- 多场景适配能力
驱动程序实现时应确保:
- 严格的资源生命周期管理
- 线程安全的设备访问
- 即时的硬件状态更新
- 准确的错误代码返回