Cómo utilizar GraphicBuffer en android ndk
Estoy preguntando esto con referencia a una respuesta para mi pregunta en cómo mejorar el rendimiento de visualización opengl en android . Yo estaba tratando de construir el código que utiliza GraphicBuffer con ndk-r9d. Pero está diciendo GraphicBuffer no se declara en este ámbito. Los mismos comentarios para eglCreateImageKHR y glEGLImageTargetTexture2DOES.
He añadido EGL / eglext.h y GLES2 / gl2ext.h. Intenté incluir ui / GraphicBuffer.h pero no lo está tomando. ¿Hay otro archivo de cabecera que se agregará?
- Confusión entre OPEN GL ES y EGL library
- ¿Cómo acceder a EGL Image directamente desde Android Surface para su uso en el decodificador de video MediaCodec?
- Opengls eglCreateWindowSurface GL Error EGL_BAD_ALLOC
- ¿Cómo usar MediaMuxer / MediaCodec InputSurface con GLSurfaceView?
- Android inicializa el contexto openGL2.0 con EGL
El código dado abajo he agregado para evitar el uso de 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);
¿Qué puedo hacer para que se ejecute ……
Gracias por adelantado..
- Preservar el contenido del búfer tras eglSwapBuffers
- ¿Por qué eglCreateImageKHR está devolviendo EGL_NO_IMAGE_KHR (en android)?
- EglSwapBuffers es errático / lento
- Android EGL / OpenGL ES Frecuencia de fotogramas tartamudeando
- Tipo 'EGL_DEFAULT_DISPLAY' no se pudo resolver el error mientras que la constante está claramente definida
- OPENGL ES no funciona: no Contexto actual
- Rendimiento lento de glTexSubImage2D en Nexus 10 / Android 4.2.2 (Samsung Exynos 5 con Mali-T604)
- EGL trabajando en Linux pero no en Android
Estoy trabajando en este problema en estos días, también.
Muchos blogs dijeron que una copia del código fuente de Android es necesaria para vincularse con su proyecto. Creo que es más elegante para obtener la función de libui.so
en tiempo de ejecución, que es el "enfoque alternativo" mencionado por Aleksandar Stojiljkovic.
He escrito una biblioteca simple para hacer eso. Aquí está.
Lamentablemente, se eliminó de aquí, pero usted podría obtener algunas respuestas allí: http://community.arm.com/groups/arm-mali-graphics/blog/2013/10/24/eglimage–updating-a-texture- Sin-copiar-memoria-bajo-android
En resumen, necesitará crear un código de plataforma Android y crear una biblioteca que abra el acceso a GraphicBuffer y la API necesaria y crearla contra la base de código android. Como otros indicados, tendrás que mantener la biblioteca …
Este es un enfoque alternativo: https://code.google.com/p/chromium/codesearch#chromium/src/third_party/deqp/src/framework/platform/android/tcuAndroidInternals.cpp&l=167
GraphicBuffer está en el espacio de nombres android.
O bien añadir:
Usando el espacio de nombres android;
O consulte GraphicBuffer con android :: GraphicBuffer