为了在Android NDK上获得快速的OpenGL ES 2.0纹理像素访问,我想使用eglCreateImageKHR()扩展.
根据EGL_NATIVE_BUFFER_ANDROID docs:
This extension enables using an Android window buffer (struct
ANativeWindowBuffer@H_403_11@) as an
EGLImage@H_403_11@ source.
ANativeWindowBuffer是本机框架类(如GraphicBuffer)使用的内部结构.
不幸的是,因为我在NDK上,所以我无法直接访问这些类.
NDK native_window接口允许我将Java Surface对象传递给NDK.然后我可以使用ANativeWindow_fromSurface()来获得不透明的ANativeWindow *句柄.使用此指针,我可以调用ANativeWindow_lock()来填充ANativeWindow_Buffer类型的结构(注意_).
如果我尝试将此& ANativeWindow_Buffer对象与eglCreateImageKHR()一起使用,则它会失败并显示EGL_BAD_NATIVE_WINDOW.
我的问题是:如何将ANativeWindow_Buffer与eglCreateImageKHR()一起使用,或者如何从ANativeWindow_Buffer或ANativeWindow *获取ANativeWindowBuffer.
如果您想比较,以下是定义:
> ANativeWindow_Buffer:http://androidxref.com/4.4.4_r1/xref/prebuilts/ndk/current/platforms/android-18/arch-arm/usr/include/android/native_window.h
> ANativeWindowBuffer:http://androidxref.com/4.4.4_r1/xref/system/core/include/system/window.h
您会注意到它们有一些共同的字段(宽度,高度,步幅,格式).最大的区别是ANativeWindow_Buffer包含指向实际数据的指针,而ANativeWindowBuffer包含一个类型为buffer_handle_t的不透明句柄.
所以,如果你发现如何获得一个ANativeWindow_Buffer,并希望你在前往ANativeWindowBuffer的路上走得很好,那么你可能就没有了.至少那是我的结论.我认为非常相似的名字只是一个挑逗.
我没有找到从NDK代码创建ANativeWindowBuffer的方法.至少只使用支持的API,我相信这是不可能的.我的研究是与KitKat进行的.