From f752ad63ac73ff9c80951dc61b62908870dd3065 Mon Sep 17 00:00:00 2001 From: Comma Device Date: Tue, 24 May 2022 11:42:13 -0700 Subject: [PATCH 1/7] doesn't work yet --- visionipc/visionbuf.h | 1 + visionipc/visionbuf_ion.cc | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/visionipc/visionbuf.h b/visionipc/visionbuf.h index fe546a64e..46028975d 100644 --- a/visionipc/visionbuf.h +++ b/visionipc/visionbuf.h @@ -57,6 +57,7 @@ class VisionBuf { void allocate(size_t len); void import(); void init_cl(cl_device_id device_id, cl_context ctx); + void init_gl(); void init_rgb(size_t width, size_t height, size_t stride); void init_yuv(size_t width, size_t height, size_t stride, size_t uv_offset); int sync(int dir); diff --git a/visionipc/visionbuf_ion.cc b/visionipc/visionbuf_ion.cc index c66b668c6..6cc9f15ba 100644 --- a/visionipc/visionbuf_ion.cc +++ b/visionipc/visionbuf_ion.cc @@ -12,6 +12,11 @@ #include #include +#define EGL_EGLEXT_PROTOTYPES +#include +#include +#include + #include #include "visionbuf.h" @@ -117,6 +122,24 @@ void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx) { assert(err == 0); } +void VisionBuf::init_gl() { + EGLint img_attrs[] = { + EGL_WIDTH, (int)this->width, + EGL_HEIGHT, 1, + //EGL_HEIGHT, (int)this->height, + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_R8, + EGL_DMA_BUF_PLANE0_FD_EXT, this->fd, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, + EGL_DMA_BUF_PLANE0_PITCH_EXT, 2048, + EGL_NONE + }; + EGLDisplay display = eglGetCurrentDisplay(); + EGLContext context = eglGetCurrentContext(); + // returning EGL_BAD_MATCH + EGLImageKHR image = eglCreateImageKHR(display, context, EGL_LINUX_DMA_BUF_EXT, 0, img_attrs); + printf("got %p %p gl image %p error %d\n", display, context, image, eglGetError()); +} + int VisionBuf::sync(int dir) { struct ion_flush_data flush_data = {0}; From 48edf68f9fa2c616ec14e9352eff44d8d5f2a62f Mon Sep 17 00:00:00 2001 From: Comma Device Date: Tue, 24 May 2022 12:30:51 -0700 Subject: [PATCH 2/7] nv12 works --- visionipc/visionbuf_ion.cc | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/visionipc/visionbuf_ion.cc b/visionipc/visionbuf_ion.cc index 6cc9f15ba..15059ee6e 100644 --- a/visionipc/visionbuf_ion.cc +++ b/visionipc/visionbuf_ion.cc @@ -123,21 +123,28 @@ void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx) { } void VisionBuf::init_gl() { + EGLDisplay display = eglGetCurrentDisplay(); + EGLContext context = eglGetCurrentContext(); + EGLint img_attrs[] = { EGL_WIDTH, (int)this->width, - EGL_HEIGHT, 1, - //EGL_HEIGHT, (int)this->height, - EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_R8, + EGL_HEIGHT, (int)this->height, + //EGL_HEIGHT, 4, + //EGL_HEIGHT, ((int)this->height)*3/2, + //EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_YUYV, + EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_NV12, EGL_DMA_BUF_PLANE0_FD_EXT, this->fd, EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, - EGL_DMA_BUF_PLANE0_PITCH_EXT, 2048, + EGL_DMA_BUF_PLANE0_PITCH_EXT, (int)this->width, + /*EGL_DMA_BUF_PLANE1_FD_EXT, this->fd, + EGL_DMA_BUF_PLANE1_OFFSET_EXT, (int)(this->width*this->height), + EGL_DMA_BUF_PLANE1_PITCH_EXT, (int)this->width,*/ EGL_NONE }; - EGLDisplay display = eglGetCurrentDisplay(); - EGLContext context = eglGetCurrentContext(); - // returning EGL_BAD_MATCH EGLImageKHR image = eglCreateImageKHR(display, context, EGL_LINUX_DMA_BUF_EXT, 0, img_attrs); - printf("got %p %p gl image %p error %d\n", display, context, image, eglGetError()); + printf("got %p %p gl image %p (%lux%lu) with fd %d error 0x%x\n", display, EGL_NO_CONTEXT, + image, this->width, this->height, + this->fd, eglGetError()); } From a44e8284d28c7e1a6d03b9e63d0c119f87966c3f Mon Sep 17 00:00:00 2001 From: Comma Device Date: Tue, 24 May 2022 14:22:46 -0700 Subject: [PATCH 3/7] works --- SConscript | 1 + visionipc/visionbuf.h | 8 ++++++++ visionipc/visionbuf_ion.cc | 25 ++++++++++--------------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/SConscript b/SConscript index e40d3ba1a..4d9fb38bc 100644 --- a/SConscript +++ b/SConscript @@ -64,6 +64,7 @@ if arch == "Darwin": vipc_frameworks.append('OpenCL') else: vipc_libs.append('OpenCL') + vipc_libs.append('EGL') envCython.Program('visionipc/visionipc_pyx.so', 'visionipc/visionipc_pyx.pyx', LIBS=vipc_libs, FRAMEWORKS=vipc_frameworks) diff --git a/visionipc/visionbuf.h b/visionipc/visionbuf.h index 46028975d..46b6bcc44 100644 --- a/visionipc/visionbuf.h +++ b/visionipc/visionbuf.h @@ -8,6 +8,11 @@ #include #endif +#define EGL_EGLEXT_PROTOTYPES +#include +#include +#include + #define VISIONBUF_SYNC_FROM_DEVICE 0 #define VISIONBUF_SYNC_TO_DEVICE 1 @@ -51,6 +56,9 @@ class VisionBuf { cl_mem buf_cl = nullptr; cl_command_queue copy_q = nullptr; + // OpenGL + EGLImageKHR egl_image = EGL_NO_IMAGE_KHR; + // ion int handle = 0; diff --git a/visionipc/visionbuf_ion.cc b/visionipc/visionbuf_ion.cc index 15059ee6e..d0f4778fc 100644 --- a/visionipc/visionbuf_ion.cc +++ b/visionipc/visionbuf_ion.cc @@ -12,11 +12,6 @@ #include #include -#define EGL_EGLEXT_PROTOTYPES -#include -#include -#include - #include #include "visionbuf.h" @@ -126,24 +121,24 @@ void VisionBuf::init_gl() { EGLDisplay display = eglGetCurrentDisplay(); EGLContext context = eglGetCurrentContext(); + // hack until this is real + this->stride = 2048; + EGLint img_attrs[] = { EGL_WIDTH, (int)this->width, - EGL_HEIGHT, (int)this->height, - //EGL_HEIGHT, 4, - //EGL_HEIGHT, ((int)this->height)*3/2, - //EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_YUYV, + EGL_HEIGHT, 1000, // hack until stride is real EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_NV12, EGL_DMA_BUF_PLANE0_FD_EXT, this->fd, EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, - EGL_DMA_BUF_PLANE0_PITCH_EXT, (int)this->width, - /*EGL_DMA_BUF_PLANE1_FD_EXT, this->fd, - EGL_DMA_BUF_PLANE1_OFFSET_EXT, (int)(this->width*this->height), - EGL_DMA_BUF_PLANE1_PITCH_EXT, (int)this->width,*/ + EGL_DMA_BUF_PLANE0_PITCH_EXT, (int)this->stride, + EGL_DMA_BUF_PLANE1_FD_EXT, this->fd, + EGL_DMA_BUF_PLANE1_OFFSET_EXT, (int)(this->stride*this->height), + EGL_DMA_BUF_PLANE1_PITCH_EXT, (int)this->stride, EGL_NONE }; - EGLImageKHR image = eglCreateImageKHR(display, context, EGL_LINUX_DMA_BUF_EXT, 0, img_attrs); + this->egl_image = eglCreateImageKHR(display, context, EGL_LINUX_DMA_BUF_EXT, 0, img_attrs); printf("got %p %p gl image %p (%lux%lu) with fd %d error 0x%x\n", display, EGL_NO_CONTEXT, - image, this->width, this->height, + this->egl_image, this->width, this->height, this->fd, eglGetError()); } From 8bf2e5b6c38adab77a3fcb491cfb103cd5b55ea9 Mon Sep 17 00:00:00 2001 From: Comma Device Date: Wed, 1 Jun 2022 17:38:56 +0200 Subject: [PATCH 4/7] fix build, use visionbuf nv12 vars --- visionipc/visionbuf.h | 1 + visionipc/visionbuf_ion.cc | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/visionipc/visionbuf.h b/visionipc/visionbuf.h index 46b6bcc44..e3872ca02 100644 --- a/visionipc/visionbuf.h +++ b/visionipc/visionbuf.h @@ -9,6 +9,7 @@ #endif #define EGL_EGLEXT_PROTOTYPES +#define EGL_NO_X11 #include #include #include diff --git a/visionipc/visionbuf_ion.cc b/visionipc/visionbuf_ion.cc index d0f4778fc..8f1d0b56f 100644 --- a/visionipc/visionbuf_ion.cc +++ b/visionipc/visionbuf_ion.cc @@ -121,18 +121,15 @@ void VisionBuf::init_gl() { EGLDisplay display = eglGetCurrentDisplay(); EGLContext context = eglGetCurrentContext(); - // hack until this is real - this->stride = 2048; - EGLint img_attrs[] = { EGL_WIDTH, (int)this->width, - EGL_HEIGHT, 1000, // hack until stride is real + EGL_HEIGHT, (int)this->height, // 1000 // hack until stride is real EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_NV12, EGL_DMA_BUF_PLANE0_FD_EXT, this->fd, EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, EGL_DMA_BUF_PLANE0_PITCH_EXT, (int)this->stride, EGL_DMA_BUF_PLANE1_FD_EXT, this->fd, - EGL_DMA_BUF_PLANE1_OFFSET_EXT, (int)(this->stride*this->height), + EGL_DMA_BUF_PLANE1_OFFSET_EXT, (int)this->uv_offset, EGL_DMA_BUF_PLANE1_PITCH_EXT, (int)this->stride, EGL_NONE }; @@ -142,7 +139,6 @@ void VisionBuf::init_gl() { this->fd, eglGetError()); } - int VisionBuf::sync(int dir) { struct ion_flush_data flush_data = {0}; flush_data.handle = this->handle; From c167c9c0f330067b7e9ec670c79838629e4e7c00 Mon Sep 17 00:00:00 2001 From: Comma Device Date: Thu, 2 Jun 2022 13:05:19 +0200 Subject: [PATCH 5/7] some cleanup --- visionipc/visionbuf_ion.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/visionipc/visionbuf_ion.cc b/visionipc/visionbuf_ion.cc index 8f1d0b56f..a81d32a4b 100644 --- a/visionipc/visionbuf_ion.cc +++ b/visionipc/visionbuf_ion.cc @@ -119,11 +119,10 @@ void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx) { void VisionBuf::init_gl() { EGLDisplay display = eglGetCurrentDisplay(); - EGLContext context = eglGetCurrentContext(); EGLint img_attrs[] = { EGL_WIDTH, (int)this->width, - EGL_HEIGHT, (int)this->height, // 1000 // hack until stride is real + EGL_HEIGHT, (int)this->height, EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_NV12, EGL_DMA_BUF_PLANE0_FD_EXT, this->fd, EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, @@ -133,10 +132,8 @@ void VisionBuf::init_gl() { EGL_DMA_BUF_PLANE1_PITCH_EXT, (int)this->stride, EGL_NONE }; - this->egl_image = eglCreateImageKHR(display, context, EGL_LINUX_DMA_BUF_EXT, 0, img_attrs); - printf("got %p %p gl image %p (%lux%lu) with fd %d error 0x%x\n", display, EGL_NO_CONTEXT, - this->egl_image, this->width, this->height, - this->fd, eglGetError()); + this->egl_image = eglCreateImageKHR(display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, 0, img_attrs); + assert(eglGetError() == EGL_SUCCESS); } int VisionBuf::sync(int dir) { @@ -163,6 +160,9 @@ int VisionBuf::sync(int dir) { int VisionBuf::free() { int err = 0; + EGLDisplay display = eglGetCurrentDisplay(); + eglDestroyImageKHR(display, this->egl_image); + if (this->buf_cl){ err = clReleaseMemObject(this->buf_cl); if (err != 0) return err; From a747f354c8d37774be9ad386140a1689c9ec9e97 Mon Sep 17 00:00:00 2001 From: Joost Wooning Date: Thu, 2 Jun 2022 14:04:48 +0200 Subject: [PATCH 6/7] build on pc --- visionipc/visionbuf_cl.cc | 3 +++ visionipc/visionbuf_ion.cc | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/visionipc/visionbuf_cl.cc b/visionipc/visionbuf_cl.cc index 0286d28fd..08d768df7 100644 --- a/visionipc/visionbuf_cl.cc +++ b/visionipc/visionbuf_cl.cc @@ -49,6 +49,9 @@ void VisionBuf::init_cl(cl_device_id device_id, cl_context ctx){ assert(err == 0); } +void VisionBuf::init_gl() { + assert(false); // only used for visionbuf_ion +}; void VisionBuf::import(){ assert(this->fd >= 0); diff --git a/visionipc/visionbuf_ion.cc b/visionipc/visionbuf_ion.cc index a81d32a4b..157ed8901 100644 --- a/visionipc/visionbuf_ion.cc +++ b/visionipc/visionbuf_ion.cc @@ -160,8 +160,10 @@ int VisionBuf::sync(int dir) { int VisionBuf::free() { int err = 0; - EGLDisplay display = eglGetCurrentDisplay(); - eglDestroyImageKHR(display, this->egl_image); + if (this->egl_image) { + EGLDisplay display = eglGetCurrentDisplay(); + eglDestroyImageKHR(display, this->egl_image); + } if (this->buf_cl){ err = clReleaseMemObject(this->buf_cl); From ebe1df652436d0026229840486b42cf5e56722a8 Mon Sep 17 00:00:00 2001 From: Joost Wooning Date: Thu, 2 Jun 2022 15:44:18 +0200 Subject: [PATCH 7/7] fix build --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 21902d197..10b280172 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,6 +25,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ make \ ocl-icd-opencl-dev \ opencl-headers \ + libegl-dev \ python-openssl \ tk-dev \ wget \