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