【问题标题】:Accessing the memory of the default framebuffer on Android访问 Android 上默认帧缓冲区的内存
【发布时间】:2015-03-25 09:45:15
【问题描述】:

我在 Android 4.4.2(API 级别 19)上安装了 OpenGL ES 2.0 和 EGL。

我的目标是直接从 CPU/用户空间访问窗口的缓冲区(OpenGL 术语中的默认帧缓冲区)。

我尝试使用 ANativeWindow_fromSurfaceGLSurfaceViewSurface 获取 ANativeWindow。然后尝试使用 ANativeWindow_lock 访问缓冲区失败,状态为 -22。 Logcat给了

03-25 10:50:25.363: E/BufferQueue(171): [SurfaceView](this:0xb8d5d978,id:32,api:1,p:6488,c:171) connect: already connected (cur=1, req=2)

discussion 看来,您似乎无法使用 GLSurfaceView 做到这一点,因为 EGL 已经获得了表面。

你怎么能得到窗口的记忆?你能通过 EGLSurface 以某种方式做到这一点吗?我愿意使用 android::GraphicBuffer,即使它不是 NDK 的一部分。

如果这不可行,您可以使用另一个方向,首先创建一个 android::GraphicBuffer,然后将其绑定到一个 EGLSurface 和显示的窗口吗?

【问题讨论】:

    标签: android android-ndk opengl-es-2.0 glsurfaceview egl


    【解决方案1】:

    Android 设备可能没有帧缓冲区(即/dev/graphics/fb)。它仍然被恢复 UI 广泛使用,但正在逐步淘汰。

    如果它确实有帧缓冲区,除非应用程序框架已关闭,否则它将由 Hardware Composer 打开并保存。由于您正在尝试使用 NDK,我假设该框架仍在运行。

    如果您的 NDK 代码以 root 或系统身份运行,您可以从 SurfaceFlinger 请求顶部窗口。 San Angeles demo 提供了一个示例。

    可以在hereherehere 找到更多信息。如果你想在底层使用图形,你还应该阅读graphics architecture doc

    【讨论】:

    【解决方案2】:

    仅使用 NDK API 无法做到这一点,您需要引入一些不保证稳定的 OS 标头。

    您需要继承 ANativeWindow,类似于在 frameworks/native/include/ui/FramebufferNativeWindow.h 中所做的。 但是,您可能需要使用自己创建的 android::GraphicBuffer 对象构建自己的缓冲区队列,并正确响应所有 dequeue() 和 enqueue() 请求。

    在 enqueue() 上,您需要同步(GPU 异步渲染),然后将排队的缓冲区映射到 CPU 内存。

    请注意,由于需要显式 GPUCPU 同步,这种方法可能性能不佳。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      相关资源
      最近更新 更多