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>
old-commit-hash: b3107e153c
			
			
				commatwo_master
			
			
		
							parent
							
								
									ab5eef3a12
								
							
						
					
					
						commit
						4b15f8a12d
					
				
				 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); | 
				
			||||
  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
 | 
				
			||||
 | 
				
			||||
@ -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