Existe uma maneira de selecionar programaticamente a GPU de renderização em um ambiente com várias GPUs? (Janelas

Questã

Tenho um aplicativo OpenGL que será executado em máquinas com diversas configurações de GPU (e possivelmente versões diferentes do Windows, do XP ao 7). Existe uma maneira geral de selecionar a GPU específica que atuará como renderizador OpenGL independentemente da combinação da GPU (por exemplo, NVIDIA + NVIDIA, NVIDIA + AMD, NVIDIA + Intel, etc.)? Tem que ser uma solução que possa ser aplicada a partir do código do aplicativo, ou seja, diretamente em C ++ ou um script que seria chamado a partir do aplicativo, sem intervenção do usuário fina

baixo estão os detalhes de vários testes que fiz para tentar encontrar uma solução, começando com casos muito específicos, mas talvez exista uma solução que possa funcionar em todos ou na maioria dos caso

xiste algum método confiável para forçar qual GPU processa o OpenG

Qualquer dica será muito apreciada. Desde já, obrigado

entei soluções possíveisWindows XP 64 com dois NVIDIA Quadro

Teste com combinações de duas placas Quadro

Quadro FX 1700 + Quadro FX 570Quadro FX 1700 + Quadro FX 540Quadro FX 1700 + Quadro NVS 285

usando o mesmo driver (versão 275.36) no Windows XP de 64 bits, obtive sucesso relativo em vários métodos, como:

Deixar o motorista decidir.
Esta solução é boa apenas desde que os dois cartões usem o mesmo driver e decida usar o cartão desejado. Portanto, é muito específico e talvez imprevisíve

Alterar as configurações do driver no código com NVAPI antes de deixar o motorista decidi
Com esta solução, em teoria é possível fazer com que o driver decida como eu quero, mas é difícil, precisa que ambas as placas usem os mesmos drivers e nem sempre funcionam (com FX 1700 + NVS 285, não funciona) .

Alterando a tela principal.
Isso faz com que o aplicativo seja aberto na tela principal selecionada por padrão. Esta solução funcionou por si só apenas com a combinação FX 1700 + FX 570. Com o FX 1700 + FX 540, o renderizador depende das configurações do driver, independentemente da tela principal, e com o FX 1700 + NVS 285, o renderizador é sempre o FX 1700.

Criando o contexto do OpenGL quando a janela está em uma tela específic
A janela pode ser criada na tela desejada, independentemente da principal, mas possui os mesmos problemas que a solução acim

Criar o contexto OpenGL tendo ativado apenas a tela na placa gráfica desejada e, em seguida, habilitando os outros /
Esta é a única maneira que encontrei para usar o NVS 285 como renderizador, mas é feio e não sei se é automatizável ou se funcionaria em todos os caso

Tentando selecionar a GPU de renderização usando o WGL_NV_gpu_affinity extensão.
Com a combinação do FX 1700 e do FX 570, a extensão relata as duas GPUs como compatíveis e eu posso limitar a renderização apenas a uma delas. Com o par FX 1700 + FX 540, a extensão reporta apenas uma GPU compatível, que é a que o driver decide usar para renderização OpenGL. Com a combinação FX 1700 + NVS 285, apenas o FX 1700 é relatado, sempre (suponho que o NVS 285 não suporte esta extensão, porque, se for o único cartão em uso, ainda não será relatado pela extensão).

indows 7 64 com Intel e AMD

Este sistema roda no Windows 7 de 64 bits e as placas gráficas são uma Intel HD Graphics 2000 (integrada na CPU (Sandy Bridge)) e uma AMD Radeon HD 6450. Em todos os casos, a renderização funciona nas duas telas, mas a GPU de renderização varia de acordo com algumas variáveis:

Se a tela principal estiver conectada à AMD e a janela for aberta nessa tela, a AMD será o renderizadoSe a tela principal estiver conectada à AMD e a janela for aberta na outra tela, o renderizador será "GDI Generic", que é muito lent Se a tela principal estiver conectada à Intel, a Intel é o renderizador, independentemente de onde a janela for abert

Com este sistema, também tenteiuma solução proposta nos fóruns do OpenGL. TL; DR: é um método hacky para escolher o driver usado pelo OpenGL, para que ele possa escolher entre GPUs que usam drivers diferentes, mas não entre placas que usam o mesmo driver. Eu obtive os seguintes resultados:

Se a tela principal estiver conectada à AMD, eu posso escolher qualquer GPU como renderizado Se a tela principal estiver conectada à Intel, eu posso escolher a Intel como renderizador (inútil, pois isso é automático), mas recebo um erro se tentar escolher a AMD; Eu acho que isso pode ser um bug no drive

questionAnswers(1)

yourAnswerToTheQuestion