Refactor image texture stuff into class (#19719)

* Refactor image texture stuff into class

* cleanup

* Update selfdrive/common/visionimg.cc

Co-authored-by: Willem Melching <willem.melching@gmail.com>
pull/19727/head
Dean Lee 4 years ago committed by GitHub
parent 92257e4dff
commit b3107e153c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 91
      selfdrive/common/visionimg.cc
  2. 34
      selfdrive/common/visionimg.h
  3. 9
      selfdrive/ui/paint.cc
  4. 24
      selfdrive/ui/ui.cc
  5. 5
      selfdrive/ui/ui.hpp

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

@ -1,25 +1,27 @@
#pragma once #pragma once
#include "visionbuf.h" #include "visionbuf.h"
#include "common/glutil.h"
#ifdef __APPLE__
#include <OpenGL/gl3.h>
#else
#include <GLES3/gl3.h>
#endif
#ifdef QCOM #ifdef QCOM
#include <EGL/egl.h> #include <EGL/egl.h>
#define EGL_EGLEXT_PROTOTYPES
#include <EGL/eglext.h> #include <EGL/eglext.h>
#undef Status #undef Status
#else
typedef int EGLImageKHR;
typedef void *EGLClientBuffer;
#endif #endif
#define VISIONIMG_FORMAT_RGB24 1 class EGLImageTexture {
public:
typedef struct VisionImg { EGLImageTexture(const VisionBuf *buf);
int fd; ~EGLImageTexture();
int format; GLuint frame_tex = 0;
int width, height, stride; #ifdef QCOM
int bpp; void *private_handle = nullptr;
size_t size; EGLImageKHR img_khr = 0;
} VisionImg; #endif
};
GLuint visionimg_to_gl(const VisionImg *img, EGLImageKHR *pkhr, void **pph);
void visionimg_destroy_gl(EGLImageKHR khr, void *ph);

@ -158,11 +158,11 @@ static void draw_frame(UIState *s) {
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
if (s->last_frame) { 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 #ifndef QCOM
// this is handled in ion on QCOM // this is handled in ion on QCOM
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, s->last_frame->width, s->last_frame->height, 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 #endif
} }
@ -643,9 +643,4 @@ void ui_nvg_init(UIState *s) {
s->front_frame_mat = matmul(device_transform, full_to_wide_frame_transform); s->front_frame_mat = matmul(device_transform, full_to_wide_frame_transform);
s->rear_frame_mat = matmul(device_transform, 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;
}
} }

@ -24,27 +24,9 @@ static void ui_init_vision(UIState *s) {
s->scene.world_objects_visible = false; s->scene.world_objects_visible = false;
for (int i = 0; i < s->vipc_client->num_buffers; i++) { for (int i = 0; i < s->vipc_client->num_buffers; i++) {
if (s->khr[i] != 0) { s->texture[i].reset(new EGLImageTexture(&s->vipc_client->buffers[i]));
visionimg_destroy_gl(s->khr[i], s->priv_hnds[i]);
glDeleteTextures(1, &s->frame_texs[i]); glBindTexture(GL_TEXTURE_2D, s->texture[i]->frame_tex);
}
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]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

@ -13,6 +13,7 @@
#include <atomic> #include <atomic>
#include <map> #include <map>
#include <memory>
#include <string> #include <string>
#include <sstream> #include <sstream>
@ -171,9 +172,7 @@ typedef struct UIState {
// graphics // graphics
GLuint frame_program; GLuint frame_program;
GLuint frame_texs[UI_BUF_COUNT]; std::unique_ptr<EGLImageTexture> texture[UI_BUF_COUNT];
EGLImageKHR khr[UI_BUF_COUNT];
void *priv_hnds[UI_BUF_COUNT];
GLint frame_pos_loc, frame_texcoord_loc; GLint frame_pos_loc, frame_texcoord_loc;
GLint frame_texture_loc, frame_transform_loc; GLint frame_texture_loc, frame_transform_loc;

Loading…
Cancel
Save