egl: Add destroy notify instead of always calling eglTerminate() on the display

In some scenarios, for example in QtWebKit, might be difficult to obtain full
control on the egl display and it might be only accessible indirectly via
eglGetCurrentDisplay().

https://bugzilla.gnome.org/show_bug.cgi?id=700058
This commit is contained in:
Sebastian Dröge 2013-05-10 12:49:06 +02:00
parent db3d5f92d6
commit 275e104be6
3 changed files with 7 additions and 5 deletions

View file

@ -168,7 +168,7 @@ gst_egl_adaptation_init_egl_display (GstEglAdaptationContext * ctx)
GST_ERROR_OBJECT (ctx->element, "Could not get EGL display connection"); GST_ERROR_OBJECT (ctx->element, "Could not get EGL display connection");
goto HANDLE_ERROR; /* No EGL error is set by eglGetDisplay() */ goto HANDLE_ERROR; /* No EGL error is set by eglGetDisplay() */
} }
ctx->display = gst_egl_display_new (display); ctx->display = gst_egl_display_new (display, (GDestroyNotify) eglTerminate);
context = gst_context_new (); context = gst_context_new ();
gst_context_set_egl_display (context, ctx->display); gst_context_set_egl_display (context, ctx->display);

View file

@ -328,16 +328,18 @@ struct _GstEGLDisplay
{ {
EGLDisplay display; EGLDisplay display;
volatile gint refcount; volatile gint refcount;
GDestroyNotify destroy_notify;
}; };
GstEGLDisplay * GstEGLDisplay *
gst_egl_display_new (EGLDisplay display) gst_egl_display_new (EGLDisplay display, GDestroyNotify destroy_notify)
{ {
GstEGLDisplay *gdisplay; GstEGLDisplay *gdisplay;
gdisplay = g_slice_new (GstEGLDisplay); gdisplay = g_slice_new (GstEGLDisplay);
gdisplay->display = display; gdisplay->display = display;
gdisplay->refcount = 1; gdisplay->refcount = 1;
gdisplay->destroy_notify = destroy_notify;
return gdisplay; return gdisplay;
} }
@ -358,8 +360,8 @@ gst_egl_display_unref (GstEGLDisplay * display)
g_return_if_fail (display != NULL); g_return_if_fail (display != NULL);
if (g_atomic_int_dec_and_test (&display->refcount)) { if (g_atomic_int_dec_and_test (&display->refcount)) {
if (display->display != EGL_NO_DISPLAY) if (display->destroy_notify)
eglTerminate (display->display); display->destroy_notify (display->display);
g_slice_free (GstEGLDisplay, display); g_slice_free (GstEGLDisplay, display);
} }
} }

View file

@ -65,7 +65,7 @@ gboolean gst_context_get_egl_display (GstContext * context,
#define GST_TYPE_EGL_DISPLAY (gst_egl_display_get_type()) #define GST_TYPE_EGL_DISPLAY (gst_egl_display_get_type())
GType gst_egl_display_get_type (void); GType gst_egl_display_get_type (void);
GstEGLDisplay *gst_egl_display_new (EGLDisplay display); GstEGLDisplay *gst_egl_display_new (EGLDisplay display, GDestroyNotify destroy_notify);
GstEGLDisplay *gst_egl_display_ref (GstEGLDisplay * display); GstEGLDisplay *gst_egl_display_ref (GstEGLDisplay * display);
void gst_egl_display_unref (GstEGLDisplay * display); void gst_egl_display_unref (GstEGLDisplay * display);
EGLDisplay gst_egl_display_get (GstEGLDisplay * display); EGLDisplay gst_egl_display_get (GstEGLDisplay * display);