diff --git a/selfdrive/common/visionimg.cc b/selfdrive/common/visionimg.cc index 925abe0ff9..fdd7d07c74 100644 --- a/selfdrive/common/visionimg.cc +++ b/selfdrive/common/visionimg.cc @@ -1,99 +1,62 @@ #include +#include "common/visionimg.h" #ifdef QCOM - #include #include #include #include - -#include #define GL_GLEXT_PROTOTYPES #include - -#include -#define EGL_EGLEXT_PROTOTYPES -#include - -#else // ifdef QCOM - -#ifdef __APPLE__ -#include -#else -#include -#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); +EGLImageTexture::EGLImageTexture(const VisionBuf *buf) { + const int bpp = 3; + assert((buf->len % buf->stride) == 0); + assert((buf->stride % 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, + 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, - 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) { + buf->stride/bpp, buf->len/buf->stride, + buf->width, buf->height); - EGLClientBuffer buf = visionimg_to_egl(img, pph); + // 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 }; - EGLImageKHR image = eglCreateImageKHR(display, EGL_NO_CONTEXT, - EGL_NATIVE_BUFFER_ANDROID, buf, img_attrs); - assert(image != EGL_NO_IMAGE_KHR); + 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); - GLuint tex = 0; - glGenTextures(1, &tex); - glBindTexture(GL_TEXTURE_2D, tex); - glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); - *pkhr = image; - return tex; + glGenTextures(1, &frame_tex); + glBindTexture(GL_TEXTURE_2D, frame_tex); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, img_khr); } -void visionimg_destroy_gl(EGLImageKHR khr, void *ph) { +EGLImageTexture::~EGLImageTexture() { + glDeleteTextures(1, &frame_tex); EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); assert(display != EGL_NO_DISPLAY); - eglDestroyImageKHR(display, khr); - delete (private_handle_t*)ph; + eglDestroyImageKHR(display, img_khr); + delete (private_handle_t*)private_handle; } #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); +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); - *pkhr = (EGLImageKHR)1; // not NULL - return texture; } -void visionimg_destroy_gl(EGLImageKHR khr, void *ph) { - // empty +EGLImageTexture::~EGLImageTexture() { + glDeleteTextures(1, &frame_tex); } #endif // ifdef QCOM diff --git a/selfdrive/common/visionimg.h b/selfdrive/common/visionimg.h index 40a8fb8214..20a476c1a1 100644 --- a/selfdrive/common/visionimg.h +++ b/selfdrive/common/visionimg.h @@ -1,25 +1,27 @@ #pragma once + #include "visionbuf.h" -#include "common/glutil.h" + +#ifdef __APPLE__ + #include +#else + #include +#endif #ifdef QCOM #include +#define EGL_EGLEXT_PROTOTYPES #include #undef Status -#else -typedef int EGLImageKHR; -typedef void *EGLClientBuffer; #endif -#define VISIONIMG_FORMAT_RGB24 1 - -typedef struct VisionImg { - int fd; - int format; - int width, height, stride; - int bpp; - size_t size; -} VisionImg; - -GLuint visionimg_to_gl(const VisionImg *img, EGLImageKHR *pkhr, void **pph); -void visionimg_destroy_gl(EGLImageKHR khr, void *ph); +class EGLImageTexture { + public: + EGLImageTexture(const VisionBuf *buf); + ~EGLImageTexture(); + GLuint frame_tex = 0; +#ifdef QCOM + void *private_handle = nullptr; + EGLImageKHR img_khr = 0; +#endif +}; diff --git a/selfdrive/ui/paint.cc b/selfdrive/ui/paint.cc index 839492f475..ab92bd064f 100644 --- a/selfdrive/ui/paint.cc +++ b/selfdrive/ui/paint.cc @@ -158,11 +158,11 @@ static void draw_frame(UIState *s) { glActiveTexture(GL_TEXTURE0); if (s->last_frame) { - glBindTexture(GL_TEXTURE_2D, s->frame_texs[s->last_frame->idx]); + glBindTexture(GL_TEXTURE_2D, s->texture[s->last_frame->idx]->frame_tex); #ifndef QCOM // this is handled in ion on QCOM glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, s->last_frame->width, s->last_frame->height, - 0, GL_RGB, GL_UNSIGNED_BYTE, s->priv_hnds[s->last_frame->idx]); + 0, GL_RGB, GL_UNSIGNED_BYTE, s->last_frame->addr); #endif } @@ -643,9 +643,4 @@ void ui_nvg_init(UIState *s) { s->front_frame_mat = matmul(device_transform, full_to_wide_frame_transform); s->rear_frame_mat = matmul(device_transform, frame_transform); - - for(int i = 0; i < UI_BUF_COUNT; i++) { - s->khr[i] = 0; - s->priv_hnds[i] = NULL; - } } diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 53c97da869..23d16ef4ff 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -24,27 +24,9 @@ static void ui_init_vision(UIState *s) { s->scene.world_objects_visible = false; for (int i = 0; i < s->vipc_client->num_buffers; i++) { - if (s->khr[i] != 0) { - visionimg_destroy_gl(s->khr[i], s->priv_hnds[i]); - glDeleteTextures(1, &s->frame_texs[i]); - } - VisionBuf * buf = &s->vipc_client->buffers[i]; - - VisionImg img = { - .fd = buf->fd, - .format = VISIONIMG_FORMAT_RGB24, - .width = (int)buf->width, - .height = (int)buf->height, - .stride = (int)buf->stride, - .bpp = 3, - .size = buf->len, - }; -#ifndef QCOM - s->priv_hnds[i] = buf->addr; -#endif - s->frame_texs[i] = visionimg_to_gl(&img, &s->khr[i], &s->priv_hnds[i]); - - glBindTexture(GL_TEXTURE_2D, s->frame_texs[i]); + s->texture[i].reset(new EGLImageTexture(&s->vipc_client->buffers[i])); + + glBindTexture(GL_TEXTURE_2D, s->texture[i]->frame_tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); diff --git a/selfdrive/ui/ui.hpp b/selfdrive/ui/ui.hpp index e359f3bcfa..fc9ae251e8 100644 --- a/selfdrive/ui/ui.hpp +++ b/selfdrive/ui/ui.hpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -171,9 +172,7 @@ typedef struct UIState { // graphics GLuint frame_program; - GLuint frame_texs[UI_BUF_COUNT]; - EGLImageKHR khr[UI_BUF_COUNT]; - void *priv_hnds[UI_BUF_COUNT]; + std::unique_ptr texture[UI_BUF_COUNT]; GLint frame_pos_loc, frame_texcoord_loc; GLint frame_texture_loc, frame_transform_loc;