diff options
author | Philipp Zabel <p.zabel@pengutronix.de> | 2018-10-17 17:11:20 +0200 |
---|---|---|
committer | Michael Olbrich <m.olbrich@pengutronix.de> | 2018-10-30 12:25:08 +0100 |
commit | eb20293a028403167e347118b756171ced9d3271 (patch) | |
tree | ef6b5ef949c93194edf5594e3231e67443671652 | |
parent | c4edd80c8c8f6874db473e070873d32a4d890db6 (diff) | |
download | gst-plugins-base-eb20293a028403167e347118b756171ced9d3271.tar.gz gst-plugins-base-eb20293a028403167e347118b756171ced9d3271.tar.xz |
glupload: dmabuf-direct: query formats before modifiers
The EXT_image_dma_buf_import_modifiers extension [1] states regarding
eglQueryDmaBufModifiersEXT:
The format must be one of those returned by the
eglQueryDmaBufFormatsEXT command.
To comply with this requirement eglQueryDmaBufFormatsEXT must be called
before eglQueryDmaBufModifiersEXT.
[1] https://www.khronos.org/registry/EGL/extensions/EXT/EGL_EXT_image_dma_buf_import_modifiers.txt
https://bugzilla.gnome.org/show_bug.cgi?id=783521
-rw-r--r-- | gst-libs/gst/gl/egl/gsteglimage.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/gst-libs/gst/gl/egl/gsteglimage.c b/gst-libs/gst/gl/egl/gsteglimage.c index 229f377c2..6138ba0fa 100644 --- a/gst-libs/gst/gl/egl/gsteglimage.c +++ b/gst-libs/gst/gl/egl/gsteglimage.c @@ -586,20 +586,26 @@ _gst_egl_image_check_dmabuf_direct (GstGLContext * context, int fourcc) { EGLDisplay egl_display = EGL_DEFAULT_DISPLAY; GstGLDisplayEGL *display_egl; + EGLint *formats; + EGLint num_formats; EGLuint64KHR *modifiers; EGLBoolean *external_only; int num_modifiers; gboolean ret; int i; + EGLBoolean (*gst_eglQueryDmaBufFormatsEXT) (EGLDisplay dpy, + EGLint max_formats, EGLint * formats, EGLint * num_formats); EGLBoolean (*gst_eglQueryDmaBufModifiersEXT) (EGLDisplay dpy, int format, int max_modifiers, EGLuint64KHR * modifiers, EGLBoolean * external_only, int *num_modifiers); + gst_eglQueryDmaBufFormatsEXT = + gst_gl_context_get_proc_address (context, "eglQueryDmaBufFormatsEXT"); gst_eglQueryDmaBufModifiersEXT = gst_gl_context_get_proc_address (context, "eglQueryDmaBufModifiersEXT"); - if (!gst_eglQueryDmaBufModifiersEXT) + if (!gst_eglQueryDmaBufFormatsEXT || !gst_eglQueryDmaBufModifiersEXT) return FALSE; display_egl = gst_gl_display_egl_from_gl_display (context->display); @@ -613,6 +619,27 @@ _gst_egl_image_check_dmabuf_direct (GstGLContext * context, int fourcc) (EGLDisplay) gst_gl_display_get_handle (GST_GL_DISPLAY (display_egl)); gst_object_unref (display_egl); + ret = gst_eglQueryDmaBufFormatsEXT (egl_display, 0, NULL, &num_formats); + if (!ret || num_formats == 0) + return FALSE; + + formats = g_new (EGLint, num_formats); + + ret = gst_eglQueryDmaBufFormatsEXT (egl_display, num_formats, formats, + &num_formats); + if (!ret || num_formats == 0) { + g_free (formats); + return FALSE; + } + + for (i = 0; i < num_formats; i++) { + if (formats[i] == fourcc) + break; + } + g_free (formats); + if (i == num_formats) + return FALSE; + ret = gst_eglQueryDmaBufModifiersEXT (egl_display, fourcc, 0, NULL, NULL, &num_modifiers); if (!ret || num_modifiers == 0) |