如何在Media Foundation中支持多GPU系统?

时间:2019-01-18 12:58:58

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

我需要在正确的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",所以我可以将其解析为数字并与VendorId结构的DXGI_ADAPTER_DESC字段进行匹配。但是,该属性的文档说该支持是可选的。

我不喜欢可选,我想要可靠。如何将硬件编码器MFT与GPU匹配? AMD即将推出两款同时具有两个GPU的PC,例如华硕FX505DY,在这种系统上,厂商ID技巧将无法使用。

1 个答案:

答案 0 :(得分:1)

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

您可以通过MFT_MESSAGE_SET_D3D_MANAGER消息来指定要使用的GPU,该消息包装D3D设备并且特定于GPU。在此处为编码器选择GPU。

此外,FYI NVIDIA H.264编码器MFT尤其无法与主视频适配器(包括但不限于this)一起使用,即使不是在所有地方,至少在许多系统中也无法正常工作。据我了解,这是Nvidia的错误,他们将在MFT实现中对其进行修复。