#include "selfdrive/common/visionimg.h" #include #ifdef QCOM #include #include #include #include #define GL_GLEXT_PROTOTYPES #include using namespace android; EGLImageTexture::EGLImageTexture(const VisionBuf *buf) { const int bpp = 3; assert((buf->len % buf->stride) == 0); assert((buf->stride % bpp) == 0); const int format = HAL_PIXEL_FORMAT_RGB_888; private_handle = new private_handle_t(buf->fd, buf->len, private_handle_t::PRIV_FLAGS_USES_ION|private_handle_t::PRIV_FLAGS_FRAMEBUFFER, 0, format, buf->stride/bpp, buf->len/buf->stride, buf->width, buf->height); // GraphicBuffer is ref counted by EGLClientBuffer(ANativeWindowBuffer), no need and not possible to release. GraphicBuffer* gb = new GraphicBuffer(buf->width, buf->height, (PixelFormat)format, GraphicBuffer::USAGE_HW_TEXTURE, buf->stride/bpp, (private_handle_t*)private_handle, false); EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); assert(display != EGL_NO_DISPLAY); EGLint img_attrs[] = {EGL_IMAGE_PRESERVED_KHR, EGL_TRUE, EGL_NONE}; img_khr = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID, gb->getNativeBuffer(), img_attrs); assert(img_khr != EGL_NO_IMAGE_KHR); glGenTextures(1, &frame_tex); glBindTexture(GL_TEXTURE_2D, frame_tex); glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, img_khr); } EGLImageTexture::~EGLImageTexture() { glDeleteTextures(1, &frame_tex); EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); assert(display != EGL_NO_DISPLAY); eglDestroyImageKHR(display, img_khr); delete (private_handle_t*)private_handle; } #else // ifdef QCOM EGLImageTexture::EGLImageTexture(const VisionBuf *buf) { glGenTextures(1, &frame_tex); glBindTexture(GL_TEXTURE_2D, frame_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, buf->width, buf->height, 0, GL_RGB, GL_UNSIGNED_BYTE, buf->addr); glGenerateMipmap(GL_TEXTURE_2D); } EGLImageTexture::~EGLImageTexture() { glDeleteTextures(1, &frame_tex); } #endif // ifdef QCOM