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.