|
|
|
#include <cassert>
|
|
|
|
|
|
|
|
#ifdef QCOM
|
|
|
|
|
|
|
|
#include <system/graphics.h>
|
|
|
|
#include <ui/GraphicBuffer.h>
|
|
|
|
#include <ui/PixelFormat.h>
|
|
|
|
#include <gralloc_priv.h>
|
|
|
|
|
|
|
|
#include <GLES3/gl3.h>
|
|
|
|
#define GL_GLEXT_PROTOTYPES
|
|
|
|
#include <GLES2/gl2ext.h>
|
|
|
|
|
|
|
|
#include <EGL/egl.h>
|
|
|
|
#define EGL_EGLEXT_PROTOTYPES
|
|
|
|
#include <EGL/eglext.h>
|
|
|
|
|
|
|
|
#else // ifdef QCOM
|
|
|
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
#include <OpenGL/gl3.h>
|
|
|
|
#else
|
|
|
|
#include <GLES3/gl3.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // ifdef QCOM
|
|
|
|
|
|
|
|
#include "common/visionimg.h"
|
|
|
|
|
|
|
|
#ifdef QCOM
|
|
|
|
using namespace android;
|
|
|
|
|
|
|
|
static EGLClientBuffer visionimg_to_egl(const VisionImg *img, void **pph) {
|
|
|
|
assert((img->size % img->stride) == 0);
|
|
|
|
assert((img->stride % img->bpp) == 0);
|
|
|
|
|
|
|
|
int format = 0;
|
|
|
|
if (img->format == VISIONIMG_FORMAT_RGB24) {
|
|
|
|
format = HAL_PIXEL_FORMAT_RGB_888;
|
|
|
|
} else {
|
|
|
|
assert(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
private_handle_t* hnd = new private_handle_t(img->fd, img->size,
|
|
|
|
private_handle_t::PRIV_FLAGS_USES_ION|private_handle_t::PRIV_FLAGS_FRAMEBUFFER,
|
|
|
|
0, format,
|
|
|
|
img->stride/img->bpp, img->size/img->stride,
|
|
|
|
img->width, img->height);
|
|
|
|
|
|
|
|
GraphicBuffer* gb = new GraphicBuffer(img->width, img->height, (PixelFormat)format,
|
|
|
|
GraphicBuffer::USAGE_HW_TEXTURE, img->stride/img->bpp, hnd, false);
|
|
|
|
// GraphicBuffer is ref counted by EGLClientBuffer(ANativeWindowBuffer), no need and not possible to release.
|
|
|
|
*pph = hnd;
|
|
|
|
return (EGLClientBuffer) gb->getNativeBuffer();
|
|
|
|
}
|
|
|
|
|
|
|
|
GLuint visionimg_to_gl(const VisionImg *img, EGLImageKHR *pkhr, void **pph) {
|
|
|
|
|
|
|
|
EGLClientBuffer buf = visionimg_to_egl(img, pph);
|
|
|
|
|
|
|
|
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
|
|
assert(display != EGL_NO_DISPLAY);
|
|
|
|
|
|
|
|
EGLint img_attrs[] = { EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE };
|
|
|
|
EGLImageKHR image = eglCreateImageKHR(display, EGL_NO_CONTEXT,
|
|
|
|
EGL_NATIVE_BUFFER_ANDROID, buf, img_attrs);
|
|
|
|
assert(image != EGL_NO_IMAGE_KHR);
|
|
|
|
|
|
|
|
GLuint tex = 0;
|
|
|
|
glGenTextures(1, &tex);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, tex);
|
|
|
|
glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
|
|
|
|
*pkhr = image;
|
|
|
|
return tex;
|
|
|
|
}
|
|
|
|
|
|
|
|
void visionimg_destroy_gl(EGLImageKHR khr, void *ph) {
|
|
|
|
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
|
|
|
|
assert(display != EGL_NO_DISPLAY);
|
|
|
|
eglDestroyImageKHR(display, khr);
|
|
|
|
delete (private_handle_t*)ph;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else // ifdef QCOM
|
|
|
|
|
|
|
|
GLuint visionimg_to_gl(const VisionImg *img, EGLImageKHR *pkhr, void **pph) {
|
|
|
|
unsigned int texture;
|
|
|
|
glGenTextures(1, &texture);
|
|
|
|
glBindTexture(GL_TEXTURE_2D, texture);
|
|
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, *pph);
|
|
|
|
glGenerateMipmap(GL_TEXTURE_2D);
|
|
|
|
*pkhr = (EGLImageKHR)1; // not NULL
|
|
|
|
return texture;
|
|
|
|
}
|
|
|
|
|
|
|
|
void visionimg_destroy_gl(EGLImageKHR khr, void *ph) {
|
|
|
|
// empty
|
|
|
|
}
|
|
|
|
#endif // ifdef QCOM
|