Как поддерживать системы с несколькими графическими процессорами в Media Foundation?

Мне нужно создать 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 аппаратного кодировщика с графическими процессорами? Будут выпущены ПК с двумя графическими процессорами от AMD, например Asus FX505DY, трюк с идентификатором поставщика не будет работать на таких системах.


person Soonts    schedule 18.01.2019    source источник


Ответы (1)


Экземпляры MFT [по крайней мере, на этапе создания экземпляра] не зависят от устройства. Если в вашей системе есть два видеоадаптера с поддержкой NVENC, кодировщик MFT будет одним и тем же с одним и тем же CLSID.

Вы указываете используемый графический процессор с помощью MFT_MESSAGE_SET_D3D_MANAGER сообщение, параметр которого является оболочкой устройства D3D и зависит от графического процессора. Здесь вы выбираете GPU для кодировщика.

Кроме того, к сведению NVIDIA H.264 Encoder MFT не работает корректно ни с чем, кроме основного видеоадаптера (включая, помимо прочего, это), если не везде, то, по крайней мере, во многих системах. Насколько я понимаю, это ошибка Nvidia, которую они должны исправить в своей реализации MFT.

person Roman R.    schedule 18.01.2019
comment
Разве кодировщики не зависят от устройства, когда графические процессоры разные? Когда клиент тестировал мой код в системе с двумя графическими процессорами, с кодировщиком nVidia и устройством Intel D3D, MF вернулся к программному кодированию. Я не знаю, что произойдет с Asus FX505DY, потому что у меня нет этого оборудования, но я ожидаю, что у него будет 2 экземпляра кодировщика AMD, по одному на GPU. Да, я использую менеджер D3D, хотя и по-другому, с MF_SINK_WRITER_D3D_MANAGER. Но это происходит позже, перед созданием менеджера мне нужен контекст устройства. - person Soonts; 18.01.2019
comment
В системе с двумя графическими процессорами AMD вы все равно начинаете с одного и того же CLSID: оба адаптера имеют один и тот же класс MFT, реализующий аппаратный кодировщик. CoCreateInstance создает идентичные экземпляры кодировщика, которые затем инициализируются ссылкой на графический процессор в виде диспетчера D3D, поддерживаемого, в свою очередь, устройством D3D, которое, в свою очередь, зависит от графического процессора. - person Roman R.; 18.01.2019