IOFramebuffer 无法访问 macOS 10.13 中的 VRAM 帧缓冲区

IOFramebuffer can't access VRAM framebuffer in macOS 10.13

我正在为 MacOS 开发扩展图形驱动程序,并使用 IOFrameBuffer class 发布线性帧缓冲设备。在我的驱动程序中,我们使用 getVRAMRange() return 帧缓冲设备整个内存 window 的视频 ram 地址信息。

问题是:驱动程序在MacOS 10.12上可以正常运行,但是一旦将系统升级到MacOS 10.13 High Sierra,我就不能再访问video ram数据了。你对这个问题有什么建议吗?非常感谢!

另外,我也很疑惑为什么驱动可以在安全模式下正常运行?

这个问题是 macOS 10.13 中的 Metal 合成器引入的。我在 beta 周期的早期就向 Apple 报告了它,但到目前为止我没有任何回应,而且肯定没有修复。

显示的内容确实在 WindowServer 的某处绘制,您可以通过使用 CGDisplayCreateImage() 截取屏幕截图(在用户空间中)来访问它。根据您尝试执行的操作,这可能对您有用吗?

之所以在安全模式下不存在该问题,是因为安全模式下硬件加速合成(Quartz Extreme)被禁用,所以没有使用Metal合成器。在不支持 Metal 的旧 Mac 上也不会出现此问题。

这是一个老问题,Apple 弃用了 IOFramebuffer class。我们可以通过 IOSurfaceRef 访问屏幕流缓冲区,并使用 IOSurfaceGetBaseAddress 函数获取屏幕数据地址。