Hi, As you may know, DirectFB backend of gtk+ in recent versions is heavily broken, and I want to know if anyone working on fixing DirectFB backend :) I was able to fix crash by applying 2 patches (attached) from André Draszik, and now simple gtk apps works, but that's not enough for complete gtk-demo - it just draws white window. Does anyone knows what can cause such behavior? Any thoughts/ideas/clues? I've debugged app that doesn't work correctly, and noticed that with DirectFB backend gtk calls _gdk_windowing_create_cairo_surface more often than with X11 backend. Also I've noticed that backend calls surface->Flip() for GdkWindow surface, so windows flushes its content to screen, but for some reason there's no content :) Regards Vasily
From 99284a2257559d3f2a74ca0e9d25662268d17cb7 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Andr=C3=A9=20Draszik?= <andre draszik st com> Date: Mon, 14 Sep 2009 16:04:17 +0100 Subject: [PATCH] gdk/directfb: fix usage of cairo_directfb_surface_create() MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit It expects an already created IDirectFBSurface, not NULL. This change fixes another GTK+ segfault on startup and gtk's 'simple' test app works again Signed-off-by: André Draszik <andre draszik st com> --- gdk/directfb/gdkdrawable-directfb.c | 85 ++++++++++++++++++++--------------- gdk/directfb/gdkprivate-directfb.h | 2 +- 2 files changed, 49 insertions(+), 38 deletions(-) diff --git a/gdk/directfb/gdkdrawable-directfb.c b/gdk/directfb/gdkdrawable-directfb.c index 3406f08..d91a0a3 100644 --- a/gdk/directfb/gdkdrawable-directfb.c +++ b/gdk/directfb/gdkdrawable-directfb.c @@ -1593,18 +1593,24 @@ static GdkScreen * gdk_directfb_get_screen (GdkDrawable *drawable){ return gdk_screen_get_default(); } -static void -gdk_directfb_cairo_surface_destroy (void *data) -{ - GdkDrawableImplDirectFB *impl = data; - impl->cairo_surface = NULL; -} - void _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, int width, int height) { + /* no need to call cairo here, cairo figures this out on its own */ +} + + +static void +gdk_directfb_cairo_surface_destroy (void *data) +{ + GdkDrawableImplDirectFB *impl = GDK_DRAWABLE_IMPL_DIRECTFB (data); + + D_ASSUME (impl->cairo_surface != NULL); + + cairo_surface_destroy (impl->cairo_surface); + impl->cairo_surface = NULL; } cairo_surface_t * @@ -1613,17 +1619,36 @@ _gdk_windowing_create_cairo_surface (GdkDrawable *drawable, int height) { GdkDrawableImplDirectFB *impl; - IDirectFB *dfb; - cairo_surface_t *ret; + GdkDisplayDFB *display_dfb; + IDirectFBSurface *surface; + cairo_surface_t *ret; impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable); - dfb = GDK_DISPLAY_DFB (gdk_drawable_get_display (drawable))->directfb; - ret = cairo_directfb_surface_create (dfb, impl->surface); + if (impl->cairo_surface) + return cairo_surface_reference (impl->cairo_surface); + + display_dfb = GDK_DISPLAY_DFB (gdk_drawable_get_display (drawable)); + + /* if we don't have a surface yet, we have to create one */ + surface = impl->surface; + if (!surface) + { + D_ASSUME (impl->format != DSPF_UNKNOWN); + + surface = gdk_display_dfb_create_surface (display_dfb, + impl->format, width, height); + if (!surface) + return NULL; + } + + ret = cairo_directfb_surface_create (display_dfb->directfb, surface); cairo_surface_set_user_data (ret, &gdk_directfb_cairo_key, drawable, gdk_directfb_cairo_surface_destroy); + impl->surface = surface; + return ret; } @@ -1631,38 +1656,24 @@ static cairo_surface_t * gdk_directfb_ref_cairo_surface (GdkDrawable *drawable) { GdkDrawableImplDirectFB *impl; - IDirectFB *dfb; - + g_return_val_if_fail (GDK_IS_DRAWABLE (drawable), NULL); g_return_val_if_fail (GDK_IS_DRAWABLE_IMPL_DIRECTFB (drawable), NULL); impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable); - dfb = GDK_DISPLAY_DFB(gdk_drawable_get_display(drawable))->directfb; - - if (!impl->cairo_surface) { - IDirectFBSurface *surface; - g_assert (impl->surface != NULL); -#if defined(CAIRO_VERSION) && CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,5,5) - impl->surface->GetSubSurface (impl->surface, NULL, &surface); -#else - surface = impl->surface; -#endif - if (surface) { - impl->cairo_surface = cairo_directfb_surface_create (dfb, surface); - if (impl->cairo_surface) { - cairo_surface_set_user_data (impl->cairo_surface, - &gdk_directfb_cairo_key, drawable, - gdk_directfb_cairo_surface_destroy); - } -#if defined(CAIRO_VERSION) && CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1,5,5) - surface->Release (surface); -#endif + + if (!impl->cairo_surface) + { + int width, height; + + gdk_drawable_get_size (drawable, &width, &height); + impl->cairo_surface = _gdk_windowing_create_cairo_surface (drawable, + width, + height); } - } else { + else cairo_surface_reference (impl->cairo_surface); - } - - g_assert (impl->cairo_surface != NULL); + return impl->cairo_surface; } diff --git a/gdk/directfb/gdkprivate-directfb.h b/gdk/directfb/gdkprivate-directfb.h index 201a1e6..df53cc9 100644 --- a/gdk/directfb/gdkprivate-directfb.h +++ b/gdk/directfb/gdkprivate-directfb.h @@ -85,7 +85,7 @@ struct _GdkDrawableImplDirectFB IDirectFBSurface *surface; DFBSurfacePixelFormat format; - cairo_surface_t * cairo_surface; + cairo_surface_t *cairo_surface; }; -- 1.6.3.3
From ce88c3f1baf1d780842bf5b93fb3a8beaa775b11 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Andr=C3=A9=20Draszik?= <gtk andred net> Date: Sun, 14 Feb 2010 11:33:04 +0000 Subject: [PATCH] for pop --- gdk/directfb/gdkdrawable-directfb.c | 31 +++++++++++++++++++++++-- gdk/directfb/gdkevents-directfb.c | 3 +- gdk/directfb/gdkwindow-directfb.c | 42 ++++++++++++++++++++++++++++++---- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/gdk/directfb/gdkdrawable-directfb.c b/gdk/directfb/gdkdrawable-directfb.c index b211968..1b922f3 100644 --- a/gdk/directfb/gdkdrawable-directfb.c +++ b/gdk/directfb/gdkdrawable-directfb.c @@ -1656,9 +1671,12 @@ gdk_directfb_cairo_surface_destroy (void *data) { GdkDrawableImplDirectFB *impl = GDK_DRAWABLE_IMPL_DIRECTFB (data); + D_DEBUG_AT (GDKDFB_Drawable, "%s for %p (cairo: %p surface: %p)\n", + G_STRLOC, impl, impl->cairo_surface, impl->surface); + D_ASSUME (impl->cairo_surface != NULL); - cairo_surface_destroy (impl->cairo_surface); +// cairo_surface_destroy (impl->cairo_surface); impl->cairo_surface = NULL; } @@ -1674,6 +1692,9 @@ _gdk_windowing_create_cairo_surface (GdkDrawable *drawable, impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable); + D_DEBUG_AT (GDKDFB_Drawable, "%s for %p (cairo: %p surface: %p)\n", + G_STRLOC, impl, impl->cairo_surface, impl->surface); + if (impl->cairo_surface) return cairo_surface_reference (impl->cairo_surface); @@ -1697,6 +1718,7 @@ _gdk_windowing_create_cairo_surface (GdkDrawable *drawable, gdk_directfb_cairo_surface_destroy); impl->surface = surface; + impl->cairo_surface = ret; return ret; } @@ -1711,6 +1733,9 @@ gdk_directfb_ref_cairo_surface (GdkDrawable *drawable) impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable); + D_DEBUG_AT (GDKDFB_Drawable, "%s for %p (cairo: %p surface: %p)\n", + G_STRLOC, impl, impl->cairo_surface, impl->surface); + if (!impl->cairo_surface) { int width, height;
Attachment:
signature.asc
Description: This is a digitally signed message part.