【问题标题】:How to support multi-GPU systems in Media Foundation?如何在 Media Foundation 中支持多 GPU 系统?
【发布时间】:2019-06-12 18:01:25
【问题描述】:

我需要在正确的 GPU(即实现编码器的 GPU)上创建 D3D 设备和上下文。

MFT_ENUM_ADAPTER_LUID 的文档说它需要 Windows 10,实际上 NVENC MFT 即使在 Win10 上也不会公开该属性。

MFT_ENUM_HARDWARE_URL_Attribute 的文档说该值是设备驱动程序的符号链接,实际上 NVENC MFT 不返回任何 GUID 链接,该值与 MFT_FRIENDLY_NAME_Attribute 中的值相同,特别是 L"NVIDIA H.264 Encoder MFT"

MFT_ENUM_HARDWARE_VENDOR_ID_Attribute 似乎工作正常,返回L"VEN_10DE",所以我可以将其解析为一个数字并匹配DXGI_ADAPTER_DESC 结构的VendorId 字段。但是该属性的文档说支持是可选的。

我不喜欢可选的,我想要可靠的。如何将硬件编码器 MFT 与 GPU 匹配? AMD 即将推出配备两个 GPU 的 PC,例如 Asus FX505DY,供应商 ID 技巧在此类系统上不起作用。

【问题讨论】:

    标签: c++ windows direct3d ms-media-foundation


    【解决方案1】:

    MFT 实例 [至少在实例化阶段] 不是特定于设备的。如果您的系统中有两个启用 NVENC 的视频适配器,则编码器 MFT 是相同的,具有相同的 CLSID。

    您通过 MFT_MESSAGE_SET_D3D_MANAGER 消息指定要使用的 GPU,该参数包装 D3D 设备并且是特定于 GPU 的。这是您为编码器选择 GPU 的地方。

    此外,仅供参考,NVIDIA H.264 编码器 MFT 尤其无法与除主视频适配器(包括但不限于 this)以外的任何东西正常工作,如果不是无处不在,至少在大量系统中。据我了解,这是 Nvidia 的错误,他们将在其 MFT 实现中修复。

    【讨论】:

    • 当 GPU 不同时,编码器不是设备特定的吗?当客户在具有 2 个 GPU 的系统上测试我的代码时,使用 nVidia 的编码器和英特尔的 D3D 设备 MF 退回到软件编码。我不知道华硕 FX505DY 会发生什么,因为我没有那个硬件,但我希望它有 2 个 AMD 编码器实例,每个 GPU 一个。是的,我正在使用 D3D 管理器,尽管方式不同,与 MF_SINK_WRITER_D3D_MANAGER 一起使用。但它稍后会发生,在创建管理器之前我需要设备上下文。
    • 在具有 2 个 AMD GPU 的系统中,无论如何您都从相同的 CLSID 开始:两个适配器具有相同的 MFT 类实现硬件编码器。 CoCreateInstance 创建相同的编码器实例,然后以 D3D 管理器的形式使用 GPU 引用进行初始化,该 D3D 管理器依次由 D3D 设备支持,而 D3D 设备又是特定于 GPU 的。
    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2017-09-04
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多