How to use GraphicBuffer in android ndk

匿名 (未验证) 提交于 2019-12-03 01:12:01

问题:

I am asking this with reference to an answer for my question at How to improve opengl es display performance in android . I was trying to build the code which uses GraphicBuffer with ndk-r9d. but It is saying GraphicBuffer is not declared in this scope. The same comments for eglCreateImageKHR and glEGLImageTargetTexture2DOES.

I have added EGL/eglext.h and GLES2/gl2ext.h . I tried to include ui/GraphicBuffer.h but it is not taking it. Is there another header file to be added ?

The code given below I have added to avoid use of 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); 

What can I do to get it run......

Thanks in advance..

回答1:

I am working on this problem these days, too.

Many blogs said a copy of Android source code is needed to link along with your project. I believe it's more elegant to get function from libui.so in runtime, which is the "alternative approach" mentioned by Aleksandar Stojiljkovic.

I have written a simple library to do that. Here is it.



回答2:

Unfortunately, it got removed from here but you could get some answers there: http://community.arm.com/groups/arm-mali-graphics/blog/2013/10/24/eglimage--updating-a-texture-without-copying-memory-under-android

In short, you'll need to build Android platform code and create library that would wrap access to GraphicBuffer and required API and build against android code base. As other stated, you'll need to maintain the library...

This is an alternative approach: https://code.google.com/p/chromium/codesearch#chromium/src/third_party/deqp/src/framework/platform/android/tcuAndroidInternals.cpp&l=167



回答3:

GraphicBuffer is in the namespace android.

Either add:

using namespace android;

or refer to GraphicBuffer with android::GraphicBuffer



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!