Files
fml13v01-buildroot/package/mesa3d/0019-egl-add-support-for-EGL_TIZEN_image_native_surface.patch
T
2022-08-16 17:38:05 +08:00

232 lines
7.8 KiB
Diff

From 230a8cb550dc23a46a96b1852720c262bb244665 Mon Sep 17 00:00:00 2001
From: Eric Engestrom <eric.engestrom@imgtec.com>
Date: Mon, 6 Feb 2017 15:54:00 +0000
Subject: [PATCH 19/67] egl: add support for EGL_TIZEN_image_native_surface
---
src/egl/drivers/dri2/egl_dri2.c | 127 ++++++++++++++++++++------
src/egl/drivers/dri2/platform_tizen.c | 1 +
src/egl/main/eglapi.c | 2 +
src/egl/main/egldisplay.h | 2 +
4 files changed, 102 insertions(+), 30 deletions(-)
diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
index 6d34395d65d..eaa0baed066 100644
--- a/src/egl/drivers/dri2/egl_dri2.c
+++ b/src/egl/drivers/dri2/egl_dri2.c
@@ -58,6 +58,10 @@
#include "X11/Xlibint.h"
#endif
+#ifdef HAVE_TIZEN_PLATFORM
+#include <tpl.h>
+#endif
+
#include "egldefines.h"
#include "egl_dri2.h"
#include "GL/mesa_glinterop.h"
@@ -2311,28 +2315,115 @@ dri2_fourcc_from_tbm_format(tbm_format format)
switch (format) {
case TBM_FORMAT_ARGB8888:
return DRM_FORMAT_ARGB8888;
+ case TBM_FORMAT_ABGR8888:
+ return DRM_FORMAT_ABGR8888;
case TBM_FORMAT_XRGB8888:
return DRM_FORMAT_XRGB8888;
+ case TBM_FORMAT_XBGR8888:
+ return DRM_FORMAT_XBGR8888;
+ case TBM_FORMAT_ARGB4444:
+ return DRM_FORMAT_ARGB4444;
+ case TBM_FORMAT_ARGB1555:
+ return DRM_FORMAT_ARGB1555;
case TBM_FORMAT_RGB565:
return DRM_FORMAT_RGB565;
+ case TBM_FORMAT_YUV420:
+ return DRM_FORMAT_YUV420;
+ case TBM_FORMAT_YVU420:
+ return DRM_FORMAT_YVU420;
+ case TBM_FORMAT_NV12:
+ return DRM_FORMAT_NV12;
+ case TBM_FORMAT_NV21:
+ return DRM_FORMAT_NV21;
default:
_eglLog(_EGL_DEBUG, "%s: unsupported tbm format %#x", __func__, format);
return 0;
}
}
+static _EGLImage *
+dri2_create_image_tbm_surface(_EGLDisplay *disp, _EGLContext *ctx,
+ tbm_surface_h tbm_surf)
+{
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ __DRIimage *dri_image;
+ tbm_surface_info_s info;
+ int fd[TBM_SURF_PLANE_MAX], pitch[TBM_SURF_PLANE_MAX], offset[TBM_SURF_PLANE_MAX];
+ int fourcc;
+ int i;
+
+ if (tbm_surface_get_info(tbm_surf, &info)) {
+ _eglError(EGL_BAD_PARAMETER, "tbm_surface_get_info");
+ return NULL;
+ }
+
+ fourcc = dri2_fourcc_from_tbm_format(info.format);
+ if (!fourcc) {
+ _eglError(EGL_BAD_PARAMETER, "dri2_fourcc_from_tbm_format");
+ return NULL;
+ }
+
+ for (i = 0; i < info.num_planes; i++) {
+ tbm_bo tbm_buf;
+
+ tbm_buf = tbm_surface_internal_get_bo(tbm_surf, i);
+ if (!tbm_buf) {
+ _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
+ goto fail_close;
+ }
+
+ pitch[i] = info.planes[i].stride;
+ offset[i] = info.planes[i].offset;
+ fd[i] = tbm_bo_export_fd(tbm_buf);
+ }
+
+ dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
+ info.width,
+ info.height,
+ fourcc,
+ &fd[0],
+ info.num_planes,
+ &pitch[0],
+ &offset[0],
+ tbm_surf);
+ for (i = 0; i < info.num_planes; i++) {
+ close(fd[i]);
+ fd[i] = -1;
+ }
+
+ if (!dri_image) {
+ _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
+ return NULL;
+ }
+
+ return dri2_create_image_from_dri(disp, dri_image);
+
+fail_close:
+ while (i--)
+ close(fd[i]);
+
+ return NULL;
+}
+
+static _EGLImage *
+dri2_create_image_tizen(_EGLDisplay *disp, _EGLContext *ctx,
+ EGLClientBuffer _buffer,
+ const EGLint *attr_list)
+{
+ tbm_surface_h tbm_surf = (tbm_surface_h)_buffer;
+
+ return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
+}
+
static _EGLImage *
dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
EGLClientBuffer _buffer,
const EGLint *attr_list)
{
struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
- __DRIimage *dri_image;
_EGLImageAttribs attrs;
tbm_surface_h tbm_surf;
- tbm_bo tbm_buf;
tbm_surface_info_s info;
- int fourcc, fd, pitch, offset;
tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
(tpl_handle_t) _buffer);
@@ -2363,33 +2454,7 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
return NULL;
}
- tbm_buf = tbm_surface_internal_get_bo(tbm_surf, attrs.PlaneWL);
- if (!tbm_buf) {
- _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
- return NULL;
- }
-
- fourcc = dri2_fourcc_from_tbm_format(info.format);
- pitch = info.planes[attrs.PlaneWL].stride;
- offset = info.planes[attrs.PlaneWL].offset;
- fd = tbm_bo_export_fd(tbm_buf);
-
- dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
- info.width,
- info.height,
- fourcc,
- &fd,
- 1,
- &pitch,
- &offset,
- tbm_surf);
- close(fd);
- if (dri_image == NULL) {
- _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
- return NULL;
- }
-
- return dri2_create_image_from_dri(disp, dri_image);
+ return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
}
#endif
@@ -3296,6 +3361,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
#ifdef HAVE_TIZEN_PLATFORM
case EGL_WAYLAND_BUFFER_WL:
return dri2_create_image_wayland_wl_buffer_tizen(disp, ctx, buffer, attr_list);
+ case EGL_NATIVE_SURFACE_TIZEN:
+ return dri2_create_image_tizen(disp, ctx, buffer, attr_list);
#endif
case EGL_CL_IMAGE_IMG:
return dri2_create_image_img_buffer(disp, ctx, target, buffer, attr_list);
diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
index a08bc8c07bf..ad75c115d7e 100644
--- a/src/egl/drivers/dri2/platform_tizen.c
+++ b/src/egl/drivers/dri2/platform_tizen.c
@@ -965,6 +965,7 @@ dri2_initialize_tizen(_EGLDisplay *dpy)
dpy->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
dpy->Extensions.KHR_image_base = EGL_TRUE;
dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
+ dpy->Extensions.TIZEN_image_native_surface = EGL_TRUE;
/*
* Fill vtbl last to prevent accidentally calling virtual function during
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 43c7b917909..e2a7797d73e 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -553,6 +553,8 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
_EGL_CHECK_EXTENSION(NV_post_sub_buffer);
+ _EGL_CHECK_EXTENSION(TIZEN_image_native_surface);
+
_EGL_CHECK_EXTENSION(WL_bind_wayland_display);
_EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index cbb098331bf..0a7366b7c07 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -149,6 +149,8 @@ struct _egl_extensions
EGLBoolean NV_post_sub_buffer;
+ EGLBoolean TIZEN_image_native_surface;
+
EGLBoolean WL_bind_wayland_display;
EGLBoolean WL_create_wayland_buffer_from_image;
--
2.25.1