You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					123 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					123 lines
				
				3.5 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#include <cassert>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#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>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "common/util.h"
							 | 
						||
| 
								 | 
							
								#include "common/visionbuf.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "common/visionimg.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef QCOM
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								using namespace android;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// from libadreno_utils.so
							 | 
						||
| 
								 | 
							
								extern "C" void compute_aligned_width_and_height(int width,
							 | 
						||
| 
								 | 
							
								                                      int height,
							 | 
						||
| 
								 | 
							
								                                      int bpp,
							 | 
						||
| 
								 | 
							
								                                      int tile_mode,
							 | 
						||
| 
								 | 
							
								                                      int raster_mode,
							 | 
						||
| 
								 | 
							
								                                      int padding_threshold,
							 | 
						||
| 
								 | 
							
								                                      int *aligned_w,
							 | 
						||
| 
								 | 
							
								                                      int *aligned_h);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void visionimg_compute_aligned_width_and_height(int width, int height, int *aligned_w, int *aligned_h) {
							 | 
						||
| 
								 | 
							
								#ifdef QCOM
							 | 
						||
| 
								 | 
							
								  compute_aligned_width_and_height(ALIGN(width, 32), ALIGN(height, 32), 3, 0, 0, 512, aligned_w, aligned_h);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								  *aligned_w = width; *aligned_h = height;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								VisionImg visionimg_alloc_rgb24(int width, int height, VisionBuf *out_buf) {
							 | 
						||
| 
								 | 
							
								  int aligned_w = 0, aligned_h = 0;
							 | 
						||
| 
								 | 
							
								  visionimg_compute_aligned_width_and_height(width, height, &aligned_w, &aligned_h);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  int stride = aligned_w * 3;
							 | 
						||
| 
								 | 
							
								  size_t size = aligned_w * aligned_h * 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  VisionBuf buf = visionbuf_allocate(size);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  *out_buf = buf;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return (VisionImg){
							 | 
						||
| 
								 | 
							
								    .fd = buf.fd,
							 | 
						||
| 
								 | 
							
								    .format = VISIONIMG_FORMAT_RGB24,
							 | 
						||
| 
								 | 
							
								    .width = width,
							 | 
						||
| 
								 | 
							
								    .height = height,
							 | 
						||
| 
								 | 
							
								    .stride = stride,
							 | 
						||
| 
								 | 
							
								    .size = size,
							 | 
						||
| 
								 | 
							
								    .bpp = 3,
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef QCOM
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								EGLClientBuffer visionimg_to_egl(const VisionImg *img, void **pph) {
							 | 
						||
| 
								 | 
							
								  assert((img->size % img->stride) == 0);
							 | 
						||
| 
								 | 
							
								  assert((img->stride % img->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,
							 | 
						||
| 
								 | 
							
								                             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) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  EGLClientBuffer buf = visionimg_to_egl(img, pph);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  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);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  GLuint tex = 0;
							 | 
						||
| 
								 | 
							
								  glGenTextures(1, &tex);
							 | 
						||
| 
								 | 
							
								  glBindTexture(GL_TEXTURE_2D, tex);
							 | 
						||
| 
								 | 
							
								  glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
							 | 
						||
| 
								 | 
							
								  *pkhr = image;
							 | 
						||
| 
								 | 
							
								  return tex;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void visionimg_destroy_gl(EGLImageKHR khr, void *ph) {
							 | 
						||
| 
								 | 
							
								  EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
							 | 
						||
| 
								 | 
							
								  assert(display != EGL_NO_DISPLAY);
							 | 
						||
| 
								 | 
							
								  eglDestroyImageKHR(display, khr);
							 | 
						||
| 
								 | 
							
								  delete (private_handle_t*)ph;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 |