【问题标题】:IOFramebuffer can't access VRAM framebuffer in macOS 10.13IOFramebuffer 在 macOS 10.13 中无法访问 VRAM 帧缓冲区
【发布时间】:2017-10-24 07:20:44
【问题描述】:

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

问题是:驱动程序在 MacOS 10.12 上可以正常工作,但是一旦将系统升级到 MacOS 10.13 High Sierra,我就无法再访问视频内存数据了。你对这个问题有什么建议吗?非常感谢!

另外,我也很困惑,为什么驱动程序可以在安全模式下正常工作?

【问题讨论】:

    标签: driver kernel-extension macos-high-sierra


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您的有用回答。我也认为它受到金属的影响。我曾尝试在用户空间使用 CGDislplayCreateImage() 函数,但性能太差,无法满足我们的要求。据我所知,DisplayLink(displaylink.com/downloads/file?id=1033) 的最新驱动程序可以在 MacOS 10.13 上运行良好,所以我认为肯定有办法访问视频内存数据。您还有其他建议吗?
    • 据我所知,CGDislplayCreateImage() 是目前唯一有效的方法。尽管它肯定会增加一个额外的帧缓冲区副本,但它绝对有可能实现实时性能。向 Apple 提交错误(雷达)以鼓励他们修复它。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      • 2017-12-02
      • 1970-01-01
      相关资源
      最近更新 更多