gl/egl/dmabuf: Wrong attribute list type for EGL 1.5
authorSong Bing <bing.song@nxp.com>
Wed, 13 Jul 2016 09:15:44 +0000 (17:15 +0800)
committerMatthew Waters <matthew@centricular.com>
Tue, 16 Aug 2016 05:34:08 +0000 (15:34 +1000)
For EGL 1.5 spec, the attribute list type should be EGLAttrib.

https://bugzilla.gnome.org/show_bug.cgi?id=768602

gst-libs/gst/gl/egl/gsteglimage.c
gst-libs/gst/gl/egl/gstglcontext_egl.c
gst-libs/gst/gl/egl/gstglcontext_egl.h
gst-libs/gst/gl/egl/gstglmemoryegl.c

index 569ed220f8c1a45daad757fa41f18fbb337576af..5d2a0a0d80c52ef1995cab6e3ca1adbb9b374844 100644 (file)
@@ -244,6 +244,9 @@ gst_egl_image_from_dmabuf (GstGLContext * context,
   gint fourcc;
   gint atti = 0;
   EGLint attribs[13];
+#ifdef EGL_VERSION_1_5
+  EGLAttrib attribs_1_5[13];
+#endif
   EGLImageKHR img = EGL_NO_IMAGE_KHR;
   GstVideoGLTextureType type;
 
@@ -257,32 +260,55 @@ gst_egl_image_from_dmabuf (GstGLContext * context,
       GST_VIDEO_INFO_COMP_WIDTH (in_info, plane),
       GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane));
 
-  attribs[atti++] = EGL_WIDTH;
-  attribs[atti++] = GST_VIDEO_INFO_COMP_WIDTH (in_info, plane);
-  attribs[atti++] = EGL_HEIGHT;
-  attribs[atti++] = GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane);
-
-  attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
-  attribs[atti++] = fourcc;
-
-  attribs[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
-  attribs[atti++] = dmabuf;
-
-  attribs[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
-  attribs[atti++] = offset;
-  attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
-  attribs[atti++] = GST_VIDEO_INFO_PLANE_STRIDE (in_info, plane);
-
-  attribs[atti] = EGL_NONE;
-
-  for (int i = 0; i < atti; i++)
-    GST_LOG ("attr %i: %08X", i, attribs[i]);
-
-  g_assert (atti == 12);
-
-  img = ctx_egl->eglCreateImage (ctx_egl->egl_display, EGL_NO_CONTEXT,
-      EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
-
+#ifdef EGL_VERSION_1_5
+  if (GST_GL_CHECK_GL_VERSION (ctx_egl->egl_major, ctx_egl->egl_minor, 1, 5)) {
+    attribs_1_5[atti++] = EGL_WIDTH;
+    attribs_1_5[atti++] = GST_VIDEO_INFO_COMP_WIDTH (in_info, plane);
+    attribs_1_5[atti++] = EGL_HEIGHT;
+    attribs_1_5[atti++] = GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane);
+    attribs_1_5[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
+    attribs_1_5[atti++] = fourcc;
+    attribs_1_5[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
+    attribs_1_5[atti++] = dmabuf;
+    attribs_1_5[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
+    attribs_1_5[atti++] = offset;
+    attribs_1_5[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
+    attribs_1_5[atti++] = GST_VIDEO_INFO_PLANE_STRIDE (in_info, plane);
+    attribs_1_5[atti] = EGL_NONE;
+
+    for (int i = 0; i < atti; i++)
+      GST_LOG ("attr %i: %" G_GINTPTR_FORMAT, i, attribs_1_5[i]);
+
+    g_assert (atti == 12);
+
+    img = ctx_egl->eglCreateImage (ctx_egl->egl_display, EGL_NO_CONTEXT,
+        EGL_LINUX_DMA_BUF_EXT, NULL, attribs_1_5);
+
+  } else
+#endif
+  {
+    attribs[atti++] = EGL_WIDTH;
+    attribs[atti++] = GST_VIDEO_INFO_COMP_WIDTH (in_info, plane);
+    attribs[atti++] = EGL_HEIGHT;
+    attribs[atti++] = GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane);
+    attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
+    attribs[atti++] = fourcc;
+    attribs[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
+    attribs[atti++] = dmabuf;
+    attribs[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
+    attribs[atti++] = offset;
+    attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
+    attribs[atti++] = GST_VIDEO_INFO_PLANE_STRIDE (in_info, plane);
+    attribs[atti] = EGL_NONE;
+
+    for (int i = 0; i < atti; i++)
+      GST_LOG ("attr %i: %08X", i, attribs[i]);
+
+    g_assert (atti == 12);
+
+    img = ctx_egl->eglCreateImageKHR (ctx_egl->egl_display, EGL_NO_CONTEXT,
+        EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
+  }
   if (!img) {
     GST_WARNING ("eglCreateImage failed: %s",
         gst_gl_context_egl_get_error_string (eglGetError ()));
index ceafdf344db8a6f844d31518d57f0c987e86caca..057c6a9ba2a0cd4de146911817394d508e51eecd 100644 (file)
@@ -309,8 +309,8 @@ gst_gl_context_egl_create_context (GstGLContext * context,
   GstGLContextEGL *egl;
   GstGLWindow *window = NULL;
   EGLNativeWindowType window_handle = (EGLNativeWindowType) 0;
-  EGLint majorVersion;
-  EGLint minorVersion;
+  EGLint egl_major;
+  EGLint egl_minor;
   gboolean need_surface = TRUE;
   guintptr external_gl_context = 0;
   GstGLDisplay *display;
@@ -363,8 +363,8 @@ gst_gl_context_egl_create_context (GstGLContext * context,
   }
   gst_object_unref (display);
 
-  if (eglInitialize (egl->egl_display, &majorVersion, &minorVersion)) {
-    GST_INFO ("egl initialized, version: %d.%d", majorVersion, minorVersion);
+  if (eglInitialize (egl->egl_display, &egl_major, &egl_minor)) {
+    GST_INFO ("egl initialized, version: %d.%d", egl_major, egl_minor);
   } else {
     g_set_error (error, GST_GL_CONTEXT_ERROR,
         GST_GL_CONTEXT_ERROR_RESOURCE_UNAVAILABLE,
@@ -380,16 +380,16 @@ gst_gl_context_egl_create_context (GstGLContext * context,
     gint i;
 
     /* egl + opengl only available with EGL 1.4+ */
-    if (majorVersion == 1 && minorVersion <= 3) {
+    if (egl_major == 1 && egl_minor <= 3) {
       if ((gl_api & ~GST_GL_API_OPENGL) == GST_GL_API_NONE) {
         g_set_error (error, GST_GL_CONTEXT_ERROR, GST_GL_CONTEXT_ERROR_OLD_LIBS,
             "EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
-            majorVersion, minorVersion);
+            egl_major, egl_minor);
         goto failure;
       } else {
         GST_WARNING
             ("EGL version (%i.%i) too old for OpenGL support, (needed at least 1.4)",
-            majorVersion, minorVersion);
+            egl_major, egl_minor);
         if (gl_api & GST_GL_API_GLES2) {
           goto try_gles2;
         } else {
@@ -599,22 +599,28 @@ gst_gl_context_egl_create_context (GstGLContext * context,
   }
 
   /* EGLImage functions */
-  if (GST_GL_CHECK_GL_VERSION (majorVersion, minorVersion, 1, 5)) {
+  if (GST_GL_CHECK_GL_VERSION (egl_major, egl_minor, 1, 5)) {
     egl->eglCreateImage = gst_gl_context_get_proc_address (context,
         "eglCreateImage");
     egl->eglDestroyImage = gst_gl_context_get_proc_address (context,
         "eglDestroyImage");
+    if (egl->eglCreateImage == NULL || egl->eglDestroyImage == NULL) {
+      egl->eglCreateImage = NULL;
+      egl->eglDestroyImage = NULL;
+    }
   } else if (gst_gl_check_extension ("EGL_KHR_image_base", egl->egl_exts)) {
-    egl->eglCreateImage = gst_gl_context_get_proc_address (context,
+    egl->eglCreateImageKHR = gst_gl_context_get_proc_address (context,
         "eglCreateImageKHR");
     egl->eglDestroyImage = gst_gl_context_get_proc_address (context,
         "eglDestroyImageKHR");
+    if (egl->eglCreateImageKHR == NULL || egl->eglDestroyImage == NULL) {
+      egl->eglCreateImageKHR = NULL;
+      egl->eglDestroyImage = NULL;
+    }
   }
-  if (egl->eglCreateImage == NULL || egl->eglDestroyImage == NULL) {
-    egl->eglCreateImage = NULL;
-    egl->eglDestroyImage = NULL;
-  }
-
+  egl->egl_major = egl_major;
+  egl->egl_minor = egl_minor;
   if (window)
     gst_object_unref (window);
 
@@ -817,7 +823,11 @@ gst_gl_context_egl_check_feature (GstGLContext * context, const gchar * feature)
   GstGLContextEGL *context_egl = GST_GL_CONTEXT_EGL (context);
 
   if (g_strcmp0 (feature, "EGL_KHR_image_base") == 0) {
-    return context_egl->eglCreateImage != NULL &&
+    if (GST_GL_CHECK_GL_VERSION (context_egl->egl_major, context_egl->egl_minor, 1, 5))
+      return context_egl->eglCreateImage != NULL &&
+        context_egl->eglDestroyImage != NULL;
+    else
+      return context_egl->eglCreateImageKHR != NULL &&
         context_egl->eglDestroyImage != NULL;
   }
 
index 90abb03f8d8e31f798c8ad986b9777cdd4a4e363..c73cd0229ebd9b8d20d6b80df31c7ac324542bc5 100644 (file)
@@ -46,12 +46,17 @@ struct _GstGLContextEGL {
   EGLSurface egl_surface;
   EGLConfig  egl_config;
 
+  gint egl_major;
+  gint egl_minor;
+
   GstGLAPI gl_api;
 
   const gchar *egl_exts;
 
-  EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+  EGLImageKHR (*eglCreateImageKHR) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
       EGLClientBuffer buffer, const EGLint *attrib_list);
+  EGLImageKHR (*eglCreateImage) (EGLDisplay dpy, EGLContext ctx, EGLenum target,
+      EGLClientBuffer buffer, const EGLAttrib *attrib_list);
   EGLBoolean (*eglDestroyImage) (EGLDisplay dpy, EGLImageKHR image);
 
   /* Cached handle */
index 0094c34c3b5bb29d40239a6ed8b4febaacefe8b2..cde47ca192baea12eb981086f74266509583713b 100644 (file)
@@ -159,7 +159,7 @@ _gl_mem_create (GstGLMemoryEGL * gl_mem, GError ** error)
     return FALSE;
 
   if (gl_mem->image == NULL) {
-    EGLImageKHR image = ctx_egl->eglCreateImage (ctx_egl->egl_display,
+    EGLImageKHR image = ctx_egl->eglCreateImageKHR (ctx_egl->egl_display,
         ctx_egl->egl_context, EGL_GL_TEXTURE_2D_KHR,
         (EGLClientBuffer) (guintptr) gl_mem->mem.tex_id, NULL);