C ++ Коммутационный ноутбук основной графический процессор - PullRequest
0 голосов
/ 05 июля 2019

Проблема: В ноутбуках с несколькими графическими процессорами есть переключатели Nvidia Optimus или AMD PowerXpress, которые используют выделенные графические процессоры для ноутбуков, если нагрузка на IGPU слишком высока, я пытался найти способ манипулировать этим переключателем, но безуспешно .

Половина решения и проблемы: Используя endlesly google, я обнаружил, что вы можете включить / отключить переключатель с помощью этого кода:

extern "C" {
// http://developer.download.nvidia.com/devzone/devcenter/gamegraphics/files/OptimusRenderingPolicies.pdf
__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;

// http://developer.amd.com/community/blog/2015/10/02/amd-enduro-system-for-developers/
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
}

Он переключается на выделенный графический процессор, но если я хочу восстановить путем изменения с 1 на 0, он не работает.

Чего я хочу добиться: Управляя этим переключателем, я хочу управлять каждым графическим процессором, используя D3D11CreateDevice или CreateDevice , чтобы использовать каждый графический процессор без запуска упомянутых переключателей. даже нагрузка на IGPU слишком высока для обработки

Что может помочь вам решить эту проблему: Я обнаружил, что switch работает в Mac OS так же: https://github.com/0xbb/gpu-switch

Как проверить, работает ли переключатель: , поскольку у ноутбуков есть один экран с использованием функции DirectX EnumerateAdapters (); и GetAdapterIdentifier показывает один графический процессор, то есть по умолчанию он должен показывать IGPU и, используя мой упомянутый код, переключаться на выделенный графический процессор, но при восстановлении значений до 0 он не переключается обратно на IGPU.

...