Как определить подключение и отключение внешнего GPU (eGPU) в macOS? - PullRequest
1 голос
/ 30 апреля 2019

Я хотел бы написать приложение для MacOS, которое обнаруживает, когда вы отключаете внешний графический процессор через Disconnect "GPU Name" Меню Extra, а затем предпринимает некоторые действия.

  • Какой API я используюобнаружить присутствие графического процессора?

  • Можно ли получать уведомления, когда графический процессор отключен и впоследствии подключен?

1 Ответ

6 голосов
/ 30 апреля 2019

Из Apple Металл Документы :

Регистрация для внешних уведомлений графического процессора

Вызов MTLCopyAllDevicesWithObserver функция для получения списка всех металлических устройств, доступных для системы, и регистрации наблюдателя, который вызывается при каждом изменении этого списка (или может измениться из-за запроса безопасного отключения).

id <NSObject> deviceObserver  = nil;
NSArray<id<MTLDevice>> *deviceList = nil;
deviceList = MTLCopyAllDevicesWithObserver(&deviceObserver,
                                           ^(id<MTLDevice> device, MTLDeviceNotificationName name) {
                                               [self handleExternalGPUEventsForDevice:device notification:name];
                                           });
_deviceObserver = deviceObserver;
_deviceList = deviceList;

Для отмены регистрации наблюдателявызовите функцию MTLRemoveDeviceObserver.

Ответ на внешние уведомления графического процессора

Металл уведомляет ваше приложение об этих внешних событиях графического процессора:

  • MTLDeviceWasAddedNotification.Metal отправляет это уведомление, когда в систему добавлен внешний графический процессор.Оцените обновленный список устройств и рассмотрите возможность использования нового дополнения.

  • MTLDeviceRemovalRequestedNotification.Metal отправляет это уведомление, когда пользователь инициирует запрос безопасного отключения внешнего графического процессора.У вашего приложения есть примерно одна секунда, чтобы перенести работу с устройства и удалить все ссылки на него.Если ваше приложение не может это сделать, macOS уведомляет пользователя о том, что ваше приложение блокирует запрос безопасного отключения.

  • MTLDeviceWasRemovedNotification.Metal отправляет это уведомление, когда внешний графический процессор удален из системы, а в вашем приложении все еще есть ссылки на это устройство.Если пользователь безопасно отключил внешний графический процессор, Metal отправляет это уведомление после того, как отправляет уведомление MTLDeviceRemovalRequestedNotification.Если пользователь неожиданно отключил внешнюю видеокарту, Metal отправляет это уведомление без предварительного уведомления MTLDeviceRemovalRequestedNotification.После удаления внешнего графического процессора любые буферы команд, поставленные в очередь для устройства, завершаются с ошибкой, и любые новые вызовы API, ссылающиеся на устройство, завершаются с ошибкой.

Настройка методачтобы ответить на уведомления и передать этот метод параметру обработчика функции MTLCopyAllDevicesWithObserver.

- (void)handleExternalGPUEventsForDevice:(id<MTLDevice>)device notification:(MTLDeviceNotificationName)notification
{
    if (notification == MTLDeviceWasAddedNotification) {  }
    else if (notification == MTLDeviceRemovalRequestedNotification) {  }
    else if (notification == MTLDeviceWasRemovedNotification) {  }
}
...