10

我在参考如何提高 android 中的 opengl es 显示性能的问题的答案来问这个问题。我试图构建使用带有 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);

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

提前致谢..

4

3 回答 3

8

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

许多博客说需要一份 Android 源代码的副本才能与您的项目一起链接。我相信从运行时获取函数更优雅libui.so,这是 Aleksandar Stojiljkovic 提到的“替代方法”。

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

于 2016-06-14T16:55:34.780 回答
1

不幸的是,它已从此处删除,但您可以在那里得到一些答案:http: //community.arm.com/groups/arm-mali-graphics/blog/2013/10/24/eglimage--updating-a-texture-没有-复制-内存-下-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

于 2015-10-05T15:10:25.780 回答
0

GraphicBuffer 在命名空间 android.

要么添加:

使用命名空间安卓;

或使用 android::GraphicBuffer 参考 GraphicBuffer

于 2014-04-28T14:47:49.417 回答