From 3811d132691252f4af13c97330d8fde806c5b3d3 Mon Sep 17 00:00:00 2001 From: Philippe Normand Date: Wed, 12 Jun 2019 11:12:37 +0100 Subject: [PATCH] wpe: Port for WPEWebKit 2.25.x When WPEBackend-fdo >= 1.3.0 is detected, the threaded view now relies on the wpe_fdo_egl_exported_image API instead of the EGLImageKHR-based API which is going to be deprecated in 2.26. The GLib sources created by the view now use the default priority as well, the custom priority is no longer required. --- ext/wpe/WPEThreadedView.cpp | 75 ++++++++++++++++++++++++++++++++++----------- ext/wpe/WPEThreadedView.h | 6 +++- 2 files changed, 62 insertions(+), 19 deletions(-) diff --git a/ext/wpe/WPEThreadedView.cpp b/ext/wpe/WPEThreadedView.cpp index af7fc7a..c22fd1d 100644 --- a/ext/wpe/WPEThreadedView.cpp +++ b/ext/wpe/WPEThreadedView.cpp @@ -31,9 +31,15 @@ #include GST_DEBUG_CATEGORY_EXTERN (wpe_src_debug); +#define GST_CAT_DEFAULT wpe_src_debug -// -70 is the GLib priority we use internally in WebKit, for WPE. +#if defined(WPE_FDO_CHECK_VERSION) && WPE_FDO_CHECK_VERSION(1, 3, 0) +#define USE_DEPRECATED_FDO_EGL_IMAGE 0 +#define WPE_GLIB_SOURCE_PRIORITY G_PRIORITY_DEFAULT +#else +#define USE_DEPRECATED_FDO_EGL_IMAGE 1 #define WPE_GLIB_SOURCE_PRIORITY -70 +#endif class GMutexHolder { public: @@ -382,7 +388,7 @@ void WPEThreadedView::loadUri(const gchar* uri) void WPEThreadedView::setDrawBackground(gboolean drawsBackground) { -#if WEBKIT_CHECK_VERSION(2, 23, 0) +#if WEBKIT_CHECK_VERSION(2, 24, 0) GST_DEBUG("%s background rendering", drawsBackground ? "Enabling" : "Disabling"); WebKitColor color; webkit_color_parse(&color, drawsBackground ? "white" : "transparent"); @@ -392,12 +398,12 @@ void WPEThreadedView::setDrawBackground(gboolean drawsBackground) #endif } -void WPEThreadedView::releaseImage(EGLImageKHR image) +void WPEThreadedView::releaseImage(gpointer imagePointer) { struct ReleaseImageContext { WPEThreadedView& view; - EGLImageKHR image; - } releaseImageContext{ *this, image }; + gpointer imagePointer; + } releaseImageContext{ *this, imagePointer }; GSource* source = g_idle_source_new(); g_source_set_callback(source, @@ -406,9 +412,14 @@ void WPEThreadedView::releaseImage(EGLImageKHR image) auto& view = releaseImageContext.view; GMutexHolder lock(view.threading.mutex); - wpe_view_backend_exportable_fdo_egl_dispatch_release_image( - releaseImageContext.view.wpe.exportable, releaseImageContext.image); - + GST_DEBUG("Dispatch release exported image"); +#if USE_DEPRECATED_FDO_EGL_IMAGE + wpe_view_backend_exportable_fdo_egl_dispatch_release_image(releaseImageContext.view.wpe.exportable, + static_cast(releaseImageContext.imagePointer)); +#else + wpe_view_backend_exportable_fdo_egl_dispatch_release_exported_image(releaseImageContext.view.wpe.exportable, + static_cast(releaseImageContext.imagePointer)); +#endif g_cond_signal(&view.threading.cond); return G_SOURCE_REMOVE; }, @@ -424,23 +435,51 @@ void WPEThreadedView::releaseImage(EGLImageKHR image) g_source_unref(source); } +struct ImageContext { + WPEThreadedView* view; + gpointer image; +}; + +void WPEThreadedView::handleExportedImage(gpointer image) +{ + ImageContext* imageContext = g_slice_new(ImageContext); + imageContext->view = this; + imageContext->image = static_cast(image); + EGLImageKHR eglImage; +#if USE_DEPRECATED_FDO_EGL_IMAGE + eglImage = static_cast(image); +#else + eglImage = wpe_fdo_egl_exported_image_get_egl_image(static_cast(image)); +#endif + + auto* gstImage = gst_egl_image_new_wrapped(gst.context, eglImage, GST_GL_RGBA, imageContext, s_releaseImage); + GMutexHolder lock(images.mutex); + images.pending = gstImage; +} + struct wpe_view_backend_exportable_fdo_egl_client WPEThreadedView::s_exportableClient = { - // export_buffer_resource +#if USE_DEPRECATED_FDO_EGL_IMAGE + // export_egl_image [](void* data, EGLImageKHR image) { auto& view = *static_cast(data); - auto* gstImage = gst_egl_image_new_wrapped(view.gst.context, image, - GST_GL_RGBA, &view, s_releaseImage); - GMutexHolder lock(view.images.mutex); - - view.images.pending = gstImage; + view.handleExportedImage(static_cast(image)); }, + nullptr, +#else + // export_egl_image + nullptr, + [](void* data, struct wpe_fdo_egl_exported_image* image) { + auto& view = *static_cast(data); + view.handleExportedImage(static_cast(image)); + }, +#endif // padding - nullptr, nullptr, nullptr, nullptr + nullptr, nullptr, nullptr }; void WPEThreadedView::s_releaseImage(GstEGLImage* image, gpointer data) { - auto& view = *static_cast(data); - GST_DEBUG("view %p image %" GST_PTR_FORMAT, &view, image); - view.releaseImage(gst_egl_image_get_image(image)); + ImageContext* context = static_cast(data); + context->view->releaseImage(context->image); + g_slice_free(ImageContext, context); } diff --git a/ext/wpe/WPEThreadedView.h b/ext/wpe/WPEThreadedView.h index 5b2c389..59dbe6e 100644 --- a/ext/wpe/WPEThreadedView.h +++ b/ext/wpe/WPEThreadedView.h @@ -46,11 +46,15 @@ public: struct wpe_view_backend* backend() const; +protected: + void handleExportedImage(gpointer); + private: void frameComplete(); - void releaseImage(EGLImageKHR); void loadUriUnlocked(const gchar*); + void releaseImage(gpointer); + static void s_loadEvent(WebKitWebView*, WebKitLoadEvent, gpointer); static gpointer s_viewThread(gpointer); -- 2.7.4