0019-egl-add-support-for-EGL_TIZEN_image_native_surface.patch 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. From 917eca873d3c493ce552811cbe4860334e73ddc1 Mon Sep 17 00:00:00 2001
  2. From: Eric Engestrom <eric.engestrom@imgtec.com>
  3. Date: Mon, 6 Feb 2017 15:54:00 +0000
  4. Subject: [PATCH] egl: add support for EGL_TIZEN_image_native_surface
  5. ---
  6. src/egl/drivers/dri2/egl_dri2.c | 127 ++++++++++++++++++++------
  7. src/egl/drivers/dri2/platform_tizen.c | 1 +
  8. src/egl/main/eglapi.c | 2 +
  9. src/egl/main/egldisplay.h | 2 +
  10. 4 files changed, 102 insertions(+), 30 deletions(-)
  11. diff --git a/src/egl/drivers/dri2/egl_dri2.c b/src/egl/drivers/dri2/egl_dri2.c
  12. index 6d34395..eaa0bae 100644
  13. --- a/src/egl/drivers/dri2/egl_dri2.c
  14. +++ b/src/egl/drivers/dri2/egl_dri2.c
  15. @@ -58,6 +58,10 @@
  16. #include "X11/Xlibint.h"
  17. #endif
  18. +#ifdef HAVE_TIZEN_PLATFORM
  19. +#include <tpl.h>
  20. +#endif
  21. +
  22. #include "egldefines.h"
  23. #include "egl_dri2.h"
  24. #include "GL/mesa_glinterop.h"
  25. @@ -2311,28 +2315,115 @@ dri2_fourcc_from_tbm_format(tbm_format format)
  26. switch (format) {
  27. case TBM_FORMAT_ARGB8888:
  28. return DRM_FORMAT_ARGB8888;
  29. + case TBM_FORMAT_ABGR8888:
  30. + return DRM_FORMAT_ABGR8888;
  31. case TBM_FORMAT_XRGB8888:
  32. return DRM_FORMAT_XRGB8888;
  33. + case TBM_FORMAT_XBGR8888:
  34. + return DRM_FORMAT_XBGR8888;
  35. + case TBM_FORMAT_ARGB4444:
  36. + return DRM_FORMAT_ARGB4444;
  37. + case TBM_FORMAT_ARGB1555:
  38. + return DRM_FORMAT_ARGB1555;
  39. case TBM_FORMAT_RGB565:
  40. return DRM_FORMAT_RGB565;
  41. + case TBM_FORMAT_YUV420:
  42. + return DRM_FORMAT_YUV420;
  43. + case TBM_FORMAT_YVU420:
  44. + return DRM_FORMAT_YVU420;
  45. + case TBM_FORMAT_NV12:
  46. + return DRM_FORMAT_NV12;
  47. + case TBM_FORMAT_NV21:
  48. + return DRM_FORMAT_NV21;
  49. default:
  50. _eglLog(_EGL_DEBUG, "%s: unsupported tbm format %#x", __func__, format);
  51. return 0;
  52. }
  53. }
  54. +static _EGLImage *
  55. +dri2_create_image_tbm_surface(_EGLDisplay *disp, _EGLContext *ctx,
  56. + tbm_surface_h tbm_surf)
  57. +{
  58. + struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
  59. + __DRIimage *dri_image;
  60. + tbm_surface_info_s info;
  61. + int fd[TBM_SURF_PLANE_MAX], pitch[TBM_SURF_PLANE_MAX], offset[TBM_SURF_PLANE_MAX];
  62. + int fourcc;
  63. + int i;
  64. +
  65. + if (tbm_surface_get_info(tbm_surf, &info)) {
  66. + _eglError(EGL_BAD_PARAMETER, "tbm_surface_get_info");
  67. + return NULL;
  68. + }
  69. +
  70. + fourcc = dri2_fourcc_from_tbm_format(info.format);
  71. + if (!fourcc) {
  72. + _eglError(EGL_BAD_PARAMETER, "dri2_fourcc_from_tbm_format");
  73. + return NULL;
  74. + }
  75. +
  76. + for (i = 0; i < info.num_planes; i++) {
  77. + tbm_bo tbm_buf;
  78. +
  79. + tbm_buf = tbm_surface_internal_get_bo(tbm_surf, i);
  80. + if (!tbm_buf) {
  81. + _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
  82. + goto fail_close;
  83. + }
  84. +
  85. + pitch[i] = info.planes[i].stride;
  86. + offset[i] = info.planes[i].offset;
  87. + fd[i] = tbm_bo_export_fd(tbm_buf);
  88. + }
  89. +
  90. + dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
  91. + info.width,
  92. + info.height,
  93. + fourcc,
  94. + &fd[0],
  95. + info.num_planes,
  96. + &pitch[0],
  97. + &offset[0],
  98. + tbm_surf);
  99. + for (i = 0; i < info.num_planes; i++) {
  100. + close(fd[i]);
  101. + fd[i] = -1;
  102. + }
  103. +
  104. + if (!dri_image) {
  105. + _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
  106. + return NULL;
  107. + }
  108. +
  109. + return dri2_create_image_from_dri(disp, dri_image);
  110. +
  111. +fail_close:
  112. + while (i--)
  113. + close(fd[i]);
  114. +
  115. + return NULL;
  116. +}
  117. +
  118. +static _EGLImage *
  119. +dri2_create_image_tizen(_EGLDisplay *disp, _EGLContext *ctx,
  120. + EGLClientBuffer _buffer,
  121. + const EGLint *attr_list)
  122. +{
  123. + tbm_surface_h tbm_surf = (tbm_surface_h)_buffer;
  124. +
  125. + return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
  126. +}
  127. +
  128. static _EGLImage *
  129. dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
  130. EGLClientBuffer _buffer,
  131. const EGLint *attr_list)
  132. {
  133. struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
  134. - __DRIimage *dri_image;
  135. _EGLImageAttribs attrs;
  136. tbm_surface_h tbm_surf;
  137. - tbm_bo tbm_buf;
  138. tbm_surface_info_s info;
  139. - int fourcc, fd, pitch, offset;
  140. tbm_surf = tpl_display_get_buffer_from_native_pixmap(dri2_dpy->tpl_dpy,
  141. (tpl_handle_t) _buffer);
  142. @@ -2363,33 +2454,7 @@ dri2_create_image_wayland_wl_buffer_tizen(_EGLDisplay *disp, _EGLContext *ctx,
  143. return NULL;
  144. }
  145. - tbm_buf = tbm_surface_internal_get_bo(tbm_surf, attrs.PlaneWL);
  146. - if (!tbm_buf) {
  147. - _eglError(EGL_BAD_PARAMETER, "tbm_surface_internal_get_bo");
  148. - return NULL;
  149. - }
  150. -
  151. - fourcc = dri2_fourcc_from_tbm_format(info.format);
  152. - pitch = info.planes[attrs.PlaneWL].stride;
  153. - offset = info.planes[attrs.PlaneWL].offset;
  154. - fd = tbm_bo_export_fd(tbm_buf);
  155. -
  156. - dri_image = dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
  157. - info.width,
  158. - info.height,
  159. - fourcc,
  160. - &fd,
  161. - 1,
  162. - &pitch,
  163. - &offset,
  164. - tbm_surf);
  165. - close(fd);
  166. - if (dri_image == NULL) {
  167. - _eglError(EGL_BAD_PARAMETER, "createImageFromFds");
  168. - return NULL;
  169. - }
  170. -
  171. - return dri2_create_image_from_dri(disp, dri_image);
  172. + return dri2_create_image_tbm_surface(disp, ctx, tbm_surf);
  173. }
  174. #endif
  175. @@ -3296,6 +3361,8 @@ dri2_create_image_khr(_EGLDisplay *disp, _EGLContext *ctx, EGLenum target,
  176. #ifdef HAVE_TIZEN_PLATFORM
  177. case EGL_WAYLAND_BUFFER_WL:
  178. return dri2_create_image_wayland_wl_buffer_tizen(disp, ctx, buffer, attr_list);
  179. + case EGL_NATIVE_SURFACE_TIZEN:
  180. + return dri2_create_image_tizen(disp, ctx, buffer, attr_list);
  181. #endif
  182. case EGL_CL_IMAGE_IMG:
  183. return dri2_create_image_img_buffer(disp, ctx, target, buffer, attr_list);
  184. diff --git a/src/egl/drivers/dri2/platform_tizen.c b/src/egl/drivers/dri2/platform_tizen.c
  185. index a08bc8c..ad75c11 100644
  186. --- a/src/egl/drivers/dri2/platform_tizen.c
  187. +++ b/src/egl/drivers/dri2/platform_tizen.c
  188. @@ -965,6 +965,7 @@ dri2_initialize_tizen(_EGLDisplay *dpy)
  189. dpy->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
  190. dpy->Extensions.KHR_image_base = EGL_TRUE;
  191. dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
  192. + dpy->Extensions.TIZEN_image_native_surface = EGL_TRUE;
  193. /*
  194. * Fill vtbl last to prevent accidentally calling virtual function during
  195. diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
  196. index 43c7b91..e2a7797 100644
  197. --- a/src/egl/main/eglapi.c
  198. +++ b/src/egl/main/eglapi.c
  199. @@ -553,6 +553,8 @@ _eglCreateExtensionsString(_EGLDisplay *disp)
  200. _EGL_CHECK_EXTENSION(NV_post_sub_buffer);
  201. + _EGL_CHECK_EXTENSION(TIZEN_image_native_surface);
  202. +
  203. _EGL_CHECK_EXTENSION(WL_bind_wayland_display);
  204. _EGL_CHECK_EXTENSION(WL_create_wayland_buffer_from_image);
  205. diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
  206. index cbb0983..0a7366b 100644
  207. --- a/src/egl/main/egldisplay.h
  208. +++ b/src/egl/main/egldisplay.h
  209. @@ -149,6 +149,8 @@ struct _egl_extensions
  210. EGLBoolean NV_post_sub_buffer;
  211. + EGLBoolean TIZEN_image_native_surface;
  212. +
  213. EGLBoolean WL_bind_wayland_display;
  214. EGLBoolean WL_create_wayland_buffer_from_image;