У меня есть приложение OpenGL, которое будет работать на машинах с различными конфигурациями нескольких GPU (и, возможно, с разными версиями Windows, от XP до 7). Есть ли общий способ выбрать конкретный графический процессор, который будет действовать как средство визуализации OpenGL независимо от комбинации графических процессоров (например, NVIDIA + NVIDIA, NVIDIA + AMD, NVIDIA + Intel и т. Д.)? Это должно быть решение, которое можно применить из кода приложения, то есть непосредственно в C ++, или сценарий, который будет вызываться из приложения без вмешательства конечного пользователя.
Ниже приведены подробности нескольких тестов, которые я провел для попробуйте найти решение, начиная с очень конкретных случаев, но, возможно, есть решение, которое может работать во всех или в большинстве случаев.
Есть ли какой-либо надежный способ заставить какой GPU выполнять рендеринг OpenGL?
Любой намек поможет буду очень признателен. Заранее благодарим!
Тестирование с комбинациями двух карт Quadro
с использованием того же драйвера (версия 275.36) в 64-битной Windows XP,У меня был относительный успех с различными методами, такими как:
Предоставление водителю решения.
Это решение хорошо, только если обе карты используют один и тот же драйвер, и он решает использовать желаемую карту. Так что это слишком специфично и, возможно, непредсказуемо.
Изменение настроек драйвера в коде с NVAPI , прежде чем позволить драйверу решить.
С помощью этого решения теоретически возможно заставить драйвер решать, как я хочу, но это сложно, необходимо, чтобы обе карты использовали одни и те же драйверы и не всегда работали (с FX 1700 + NVS 285 это не работает).
Изменение главного экрана.
Это приводит к тому, что приложение по умолчанию открывается на выбранном основном экране. Это решение работало само по себе только с комбинацией FX 1700 + FX 570. В FX 1700 + FX 540 средство визуализации зависит от настроек драйвера независимо от главного экрана, а в FX 1700 + NVS 285 средством визуализации всегда является FX 1700.
Создание контекста OpenGL, когда окно находится на определенном экране. .
Окно может быть создано на желаемом экране, независимо от того, какой экран является основным, но оно имеет те же проблемы, что и решение выше.
Создание контекста OpenGL с включением только экрана на желаемой видеокарте и последующим включением другого /s.
Я нашел единственный способ использовать NVS 285 в качестве средства визуализации, но он уродлив, и я не знаю, можно ли его автоматизировать или будет ли он работать во всех случаях.
Попытка выбрать графический процессор для визуализации с помощью расширение WGL_NV_gpu_affinity .
С комбинацией FX 1700 и FX 570 расширение сообщает обо всех графических процессорах как совместимых, и я могу ограничить рендеринг только одним из них. В паре FX 1700 + FX 540 расширение сообщает только об одном совместимом графическом процессоре, который драйвер решает использовать для рендеринга OpenGL. С комбинацией FX 1700 + NVS 285 всегда сообщается только FX 1700 (я полагаю, что NVS 285 не поддерживает это расширение, потому что, если это единственная используемая карта, это все еще не сообщается расширением).
Эта система работает с 64-разрядной ОС Windows 7, а в качестве видеокарт используются одна видеокарта Intel HD Graphics 2000 (встроенная в ЦП (Sandy Bridge)) и одна AMD Radeon HD 6450. Всего случаях рендеринг работает на обоих экранах, но графический процессор рендеринга зависит от некоторых переменных:
С этой системой я также попробовал решение, предложенное в Форумы OpenGL . TL; DR: это хакерский метод выбора драйвера, используемого OpenGL, поэтому он может выбирать между графическими процессорами, которые используют разные драйверы, но не между картами, которые используют один и тот же драйвер. Я получил следующие результаты: