c++ - Media Foundation 中如何支持多 GPU 系统?
问题描述
我需要在正确的 GPU 上创建 D3D 设备和上下文,这是实现编码器的 GPU。
的文档MFT_ENUM_ADAPTER_LUID
说它需要 Windows 10,实际上 NVENC MFT 即使在 Win10 上也不会公开该属性。
的文档MFT_ENUM_HARDWARE_URL_Attribute
说该值是设备驱动程序的符号链接,实际上 NVENC MFT 不返回任何 GUID 链接,该值与 in 相同MFT_FRIENDLY_NAME_Attribute
,特别是L"NVIDIA H.264 Encoder MFT"
MFT_ENUM_HARDWARE_VENDOR_ID_Attribute
似乎工作正常,返回,所以我可以将其解析为一个数字并与结构字段L"VEN_10DE"
匹配。但是,该属性的文档说支持是可选的。VendorId
DXGI_ADAPTER_DESC
我不喜欢可选的,我想要可靠的。如何将硬件编码器 MFT 与 GPU 匹配?AMD 即将推出带有两个 GPU 的 PC,例如 Asus FX505DY,供应商 ID 技巧在此类系统上不起作用。
解决方案
MFT 实例 [至少在实例化阶段] 不是特定于设备的。如果您的系统中有两个启用 NVENC 的视频适配器,则编码器 MFT 是相同的,具有相同的 CLSID。
您通过MFT_MESSAGE_SET_D3D_MANAGER
消息指定要使用的 GPU,该参数包装 D3D 设备并且是特定于 GPU 的。这是您为编码器选择 GPU 的地方。
此外,仅供参考 NVIDIA H.264 编码器 MFT 特别无法与除主视频适配器(包括但不限于此)以外的任何东西正常工作,如果不是在任何地方,至少在大量系统中。据我了解,这是 Nvidia 的错误,他们将在其 MFT 实施中修复。
推荐阅读
- c# - 在可重用的用户控件中使用传递参数的数据绑定属性
- java - 使用java插入二叉树不起作用
- reactjs - React 头盔:Facebook 开放图谱
- django - 在 Django REST Framework 中序列化和存储 JSON 数组
- php - mysql如何获得某一天的最大值?
- r - 在帮助文件中,“...”参数背后是否有任何普遍意义或逻辑?
- prolog - 如何在prolog中将输入从L转换为[H | T]?
- android - 无法从活动中访问片段的方法 - UninitializedPropertyAccessException
- java - 如何将 SQL 日期时间戳转换为人类可读的时间?
- c++ - OpenGL 4.5 着色器未加载