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
parent
92257e4dff
commit
b3107e153c
5 changed files with 54 additions and 113 deletions
@ -1,99 +1,62 @@ |
||||
#include <cassert> |
||||
#include "common/visionimg.h" |
||||
|
||||
#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); |
||||
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); |
||||
buf->stride/bpp, buf->len/buf->stride, |
||||
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.
|
||||
*pph = hnd; |
||||
return (EGLClientBuffer) gb->getNativeBuffer(); |
||||
} |
||||
|
||||
GLuint visionimg_to_gl(const VisionImg *img, EGLImageKHR *pkhr, void **pph) { |
||||
|
||||
EGLClientBuffer buf = visionimg_to_egl(img, pph); |
||||
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); |
||||
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
|
||||
|
@ -1,25 +1,27 @@ |
||||
#pragma once |
||||
|
||||
#include "visionbuf.h" |
||||
#include "common/glutil.h" |
||||
|
||||
#ifdef __APPLE__ |
||||
#include <OpenGL/gl3.h> |
||||
#else |
||||
#include <GLES3/gl3.h> |
||||
#endif |
||||
|
||||
#ifdef QCOM |
||||
#include <EGL/egl.h> |
||||
#define EGL_EGLEXT_PROTOTYPES |
||||
#include <EGL/eglext.h> |
||||
#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 |
||||
}; |
||||
|
Loading…
Reference in new issue