如何在android ndk中使用GraphicBuffer

时间:2014-04-24 06:43:56

标签: android opengl-es android-ndk egl

我在How to improve opengl es display performance in android提到我的问题答案时问这个问题。我试图使用ndk-r9d构建使用GraphicBuffer的代码。但是说这个范围没有声明GraphicBuffer。对于eglCreateImageKHR和glEGLImageTargetTexture2DOES也有相同的评论。

我添加了EGL / eglext.h和GLES2 / gl2ext.h。我试图包含ui / GraphicBuffer.h,但它没有接受它。是否有另一个头文件要添加?

下面给出的代码我添加了以避免使用glTexSubImage2D()。

  GraphicBuffer * pGraphicBuffer = new GraphicBuffer(frame_width, frame_height, PIXEL_FORMAT_RGB_565, GraphicBuffer::USAGE_SW_WRITE_OFTEN | GraphicBuffer::USAGE_HW_TEXTURE);

        // Lock the buffer to get a pointer
        unsigned char * pBitmap = NULL;
        pGraphicBuffer->lock(GraphicBuffer::USAGE_SW_WRITE_OFTEN,(void **)&pBitmap);

        // Write 2D image to pBitmap
        memcpy(pBitmap, frame_buffer, frame_width * frame_height * 3);

        // Unlock to allow OpenGL ES to use it
        pGraphicBuffer->unlock();

        EGLClientBuffer ClientBufferAddress = pGraphicBuffer->getNativeBuffer();
        EGLint SurfaceType = EGL_NATIVE_BUFFER_ANDROID;

        // Make an EGL Image at the same address of the native client buffer
        EGLDisplay eglDisplayHandle = eglGetDisplay(EGL_DEFAULT_DISPLAY);

        // Create an EGL Image with these attributes
        EGLint eglImageAttributes[] = {EGL_WIDTH, frame_width, EGL_HEIGHT, frame_height, EGL_MATCH_FORMAT_KHR,  EGL_FORMAT_RGB_565_KHR, EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE};

        EGLImageKHR eglImageHandle = eglCreateImageKHR(eglDisplayHandle, EGL_NO_CONTEXT, SurfaceType, ClientBufferAddress, eglImageAttributes);

        // Create a texture and bind it to GL_TEXTURE_2D
/*        EGLint TextureHandle;
        glGenTextures(1, &TextureHandle);
        glBindTexture(GL_TEXTURE_2D, TextureHandle);
*/
        // Attach the EGL Image to the same texture
        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImageHandle);

我该怎么做才能让它运行......

提前致谢..

3 个答案:

答案 0 :(得分:7)

我这些天也在研究这个问题。

许多博客都说需要一份Android源代码来与您的项目链接。我相信在运行时从libui.so获取函数会更优雅,这是另一种方法" Aleksandar Stojiljkovic提到。

我写了一个简单的库来做到这一点。 Here就是这样。

答案 1 :(得分:1)

不幸的是,它从这里删除了,但你可以在那里得到一些答案: http://community.arm.com/groups/arm-mali-graphics/blog/2013/10/24/eglimage--updating-a-texture-without-copying-memory-under-android

简而言之,您需要构建Android平台代码并创建库,以封装对GraphicBuffer和所需API的访问,并针对Android代码库进行构建。正如其他人所说,你需要维护图书馆...

这是另一种方法: https://code.google.com/p/chromium/codesearch#chromium/src/third_party/deqp/src/framework/platform/android/tcuAndroidInternals.cpp&l=167

答案 2 :(得分:0)

GraphicBuffer位于命名空间android。

添加:

使用命名空间android;

或使用android :: GraphicBuffer

引用GraphicBuffer