IOFramebuffer не может получить доступ к кадровому буферу VRAM в macOS 10.13

Я работаю над расширенным графическим драйвером для MacOS и использую класс IOFrameBuffer для публикации устройства линейного буфера кадров. В моем драйвере мы используем getVRAMRange() для возврата информации об адресе видеопамяти для всего окна памяти устройства кадрового буфера.

Вопрос в следующем: драйвер может хорошо работать на MacOS 10.12, но после обновления системы до MacOS 10.13 High Sierra я больше не могу получить доступ к данным видеопамяти. Есть ли у вас какие-либо советы по этому вопросу? Спасибо большое!

кроме того, я также смущен, почему драйвер может хорошо работать с безопасным режимом?


person Crystal.Liu    schedule 24.10.2017    source источник


Ответы (2)


Эта проблема появилась в композиторе Metal в macOS 10.13. Я сообщил об этом Apple в начале бета-тестирования, но до сих пор не получил никакого ответа, и, конечно же, это не было исправлено.

Содержимое дисплея отображается где-то в WindowServer, вы можете получить к нему доступ, сделав снимок экрана (в пользовательском пространстве) с помощью CGDisplayCreateImage(). В зависимости от того, что вы пытаетесь сделать, это может сработать для вас?

Причина, по которой проблема не существует в безопасном режиме, заключается в том, что в безопасном режиме отключено композитинг с аппаратным ускорением (Quartz Extreme), поэтому композитор Metal не используется. Проблема также не возникает на старых компьютерах Mac, которые не поддерживают Metal.

person pmdj    schedule 01.11.2017
comment
Большое спасибо за ваш полезный ответ. Я также думаю, что на это повлиял металл. Я попытался использовать функцию CGDislplayCreateImage() в пользовательском пространстве, но производительность слишком низкая, чтобы соответствовать нашим требованиям. Насколько я знаю, новейший драйвер DisplayLink(displaylink.com/downloads/file?id= 1033) может хорошо работать на MacOS 10.13, поэтому я думаю, что определенно есть способ получить доступ к данным видеопамяти. У вас есть другие предложения? - person Crystal.Liu; 03.11.2017
comment
Насколько мне известно, CGDislplayCreateImage() - единственный способ, который работает на данный момент. С его помощью определенно можно добиться производительности в реальном времени, хотя он, безусловно, добавляет дополнительную копию буфера кадра. Сообщите об ошибке (радаре) в Apple, чтобы побудить их исправить ее. - person pmdj; 03.11.2017

Это старая проблема, Apple объявила устаревшим класс IOFramebuffer. мы можем получить доступ к экранному паровому буферу через IOSurfaceRef и использовать функцию IOSurfaceGetBaseAddress для получения адреса данных экрана.

person Crystal.Liu    schedule 01.04.2020