diff options
author | Song Bing <bing.song@nxp.com> | 2016-07-13 17:15:44 +0800 |
---|---|---|
committer | Matthew Waters <matthew@centricular.com> | 2016-08-16 15:34:08 +1000 |
commit | 4e04f28478fee0b85b677b9f636c50d6887a6165 (patch) | |
tree | cf703a0810b847783f5ef11759ebd4c0e9bd9197 | |
parent | 2776cef25d2a98668b73272aecfe77e684e6627e (diff) |
gl/egl/dmabuf: Wrong attribute list type for EGL 1.5
For EGL 1.5 spec, the attribute list type should be EGLAttrib.
https://bugzilla.gnome.org/show_bug.cgi?id=768602
-rw-r--r-- | gst-libs/gst/gl/egl/gsteglimage.c | 78 | ||||
-rw-r--r-- | gst-libs/gst/gl/egl/gstglcontext_egl.c | 40 | ||||
-rw-r--r-- | gst-libs/gst/gl/egl/gstglcontext_egl.h | 7 | ||||
-rw-r--r-- | gst-libs/gst/gl/egl/gstglmemoryegl.c | 2 |
4 files changed, 84 insertions, 43 deletions
diff --git a/gst-libs/gst/gl/egl/gsteglimage.c b/gst-libs/gst/gl/egl/gsteglimage.c index 569ed220f..5d2a0a0d8 100644 --- a/gst-libs/gst/gl/egl/gsteglimage.c +++ b/gst-libs/gst/gl/egl/gsteglimage.c @@ -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 ())); diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.c b/gst-libs/gst/gl/egl/gstglcontext_egl.c index ceafdf344..057c6a9ba 100644 --- a/gst-libs/gst/gl/egl/gstglcontext_egl.c +++ b/gst-libs/gst/gl/egl/gstglcontext_egl.c @@ -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; } diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.h b/gst-libs/gst/gl/egl/gstglcontext_egl.h index 90abb03f8..c73cd0229 100644 --- a/gst-libs/gst/gl/egl/gstglcontext_egl.h +++ b/gst-libs/gst/gl/egl/gstglcontext_egl.h @@ -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 */ diff --git a/gst-libs/gst/gl/egl/gstglmemoryegl.c b/gst-libs/gst/gl/egl/gstglmemoryegl.c index 0094c34c3..cde47ca19 100644 --- a/gst-libs/gst/gl/egl/gstglmemoryegl.c +++ b/gst-libs/gst/gl/egl/gstglmemoryegl.c @@ -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); |