Compare commits

...

1 Commits

Author SHA1 Message Date
Marco Trevisan (Treviño)
d76bba5cb4 mir: swap buffer async only when a repaint has been requested
And ignore swapping while still processing a request.
2014-11-20 04:52:58 +01:00
4 changed files with 62 additions and 12 deletions

View File

@@ -81,7 +81,7 @@ GdkCursor *_gdk_mir_cursor_new_for_name (GdkDisplay *display, const gchar *name)
const gchar *_gdk_mir_cursor_get_name (GdkCursor *cursor); const gchar *_gdk_mir_cursor_get_name (GdkCursor *cursor);
GdkWindowImpl *_gdk_mir_window_impl_new (void); GdkWindowImpl *_gdk_mir_window_impl_new (GdkWindow *window);
void _gdk_mir_window_impl_set_surface_state (GdkMirWindowImpl *impl, MirSurfaceState state); void _gdk_mir_window_impl_set_surface_state (GdkMirWindowImpl *impl, MirSurfaceState state);

View File

@@ -404,7 +404,7 @@ gdk_mir_display_create_window_impl (GdkDisplay *display,
g_printerr ("\n"); g_printerr ("\n");
if (attributes->wclass != GDK_INPUT_OUTPUT) if (attributes->wclass != GDK_INPUT_OUTPUT)
return; return;
window->impl = _gdk_mir_window_impl_new (); window->impl = _gdk_mir_window_impl_new (window);
} }
static GdkKeymap * static GdkKeymap *

View File

@@ -257,7 +257,7 @@ gdk_mir_screen_get_root_window (GdkScreen *screen)
get_screen_size (GDK_MIR_SCREEN (screen)->display_config, &width, &height); get_screen_size (GDK_MIR_SCREEN (screen)->display_config, &width, &height);
s->root_window = _gdk_display_create_window (s->display); s->root_window = _gdk_display_create_window (s->display);
s->root_window->impl = _gdk_mir_window_impl_new (); s->root_window->impl = _gdk_mir_window_impl_new (s->root_window);
s->root_window->impl_window = s->root_window; s->root_window->impl_window = s->root_window;
s->root_window->visual = s->visual; s->root_window->visual = s->visual;
s->root_window->window_type = GDK_WINDOW_ROOT; s->root_window->window_type = GDK_WINDOW_ROOT;

View File

@@ -28,6 +28,7 @@
#include "gdkintl.h" #include "gdkintl.h"
#include "gdkdisplayprivate.h" #include "gdkdisplayprivate.h"
#include "gdkdeviceprivate.h" #include "gdkdeviceprivate.h"
#include "gdkframeclockprivate.h"
#define GDK_MIR_WINDOW_IMPL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOW_IMPL_MIR, GdkMirWindowImplClass)) #define GDK_MIR_WINDOW_IMPL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOW_IMPL_MIR, GdkMirWindowImplClass))
#define GDK_IS_WINDOW_IMPL_MIR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOW_IMPL_MIR)) #define GDK_IS_WINDOW_IMPL_MIR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOW_IMPL_MIR))
@@ -79,6 +80,9 @@ struct _GdkMirWindowImpl
/* TRUE if cursor is inside this window */ /* TRUE if cursor is inside this window */
gboolean cursor_inside; gboolean cursor_inside;
gboolean pending_commit;
gboolean pending_swap;
}; };
struct _GdkMirWindowImplClass struct _GdkMirWindowImplClass
@@ -89,10 +93,16 @@ struct _GdkMirWindowImplClass
G_DEFINE_TYPE (GdkMirWindowImpl, gdk_mir_window_impl, GDK_TYPE_WINDOW_IMPL) G_DEFINE_TYPE (GdkMirWindowImpl, gdk_mir_window_impl, GDK_TYPE_WINDOW_IMPL)
static cairo_surface_t *gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window); static cairo_surface_t *gdk_mir_window_impl_ref_cairo_surface (GdkWindow *window);
static void on_frame_clock_after_paint (GdkFrameClock *clock, GdkWindow *window);
GdkWindowImpl * GdkWindowImpl *
_gdk_mir_window_impl_new (void) _gdk_mir_window_impl_new (GdkWindow *window)
{ {
GdkFrameClock *frame_clock = gdk_window_get_frame_clock (window);
g_signal_connect (frame_clock, "after-paint",
G_CALLBACK (on_frame_clock_after_paint), window);
return g_object_new (GDK_TYPE_MIR_WINDOW_IMPL, NULL); return g_object_new (GDK_TYPE_MIR_WINDOW_IMPL, NULL);
} }
@@ -274,6 +284,9 @@ ensure_no_surface (GdkWindow *window)
g_clear_pointer (&impl->dummy_surface, mir_surface_release_sync); g_clear_pointer (&impl->dummy_surface, mir_surface_release_sync);
} }
impl->pending_commit = FALSE;
impl->pending_swap = FALSE;
g_clear_pointer(&impl->surface, mir_surface_release_sync); g_clear_pointer(&impl->surface, mir_surface_release_sync);
} }
@@ -289,10 +302,43 @@ redraw_transient (GdkWindow *window)
} }
static void static void
send_buffer (GdkWindow *window) on_swap_buffer_completed (MirSurface *surface, void *data)
{
GdkWindow *window = data;
GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
/* The Cairo context is no longer valid */
g_clear_pointer (&impl->cairo_surface, cairo_surface_destroy);
impl->pending_swap = FALSE;
_gdk_frame_clock_thaw (gdk_window_get_frame_clock (window));
}
static void
on_frame_clock_after_paint (GdkFrameClock *clock,
GdkWindow *window)
{ {
GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl); GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
if (!impl->pending_commit)
return;
impl->pending_commit = FALSE;
_gdk_frame_clock_freeze (clock);
/* Send the completed buffer to Mir */
impl->pending_swap = TRUE;
mir_surface_swap_buffers (impl->surface, on_swap_buffer_completed, window);
}
static void
send_buffer_delayed (GdkWindow *window)
{
GdkMirWindowImpl *impl = GDK_MIR_WINDOW_IMPL (window->impl);
if (impl->pending_swap || impl->pending_commit)
return;
/* Transient windows draw onto parent instead */ /* Transient windows draw onto parent instead */
if (impl->transient_for) if (impl->transient_for)
{ {
@@ -328,11 +374,15 @@ send_buffer (GdkWindow *window)
cairo_surface_destroy (surface); cairo_surface_destroy (surface);
} }
/* Send the completed buffer to Mir */ impl->pending_commit = TRUE;
mir_surface_swap_buffers_sync (impl->surface); }
/* The Cairo context is no longer valid */ static void
g_clear_pointer (&impl->cairo_surface, cairo_surface_destroy); send_buffer (GdkWindow *window)
{
send_buffer_delayed (window);
gdk_frame_clock_request_phase (gdk_window_get_frame_clock (window),
GDK_FRAME_CLOCK_PHASE_AFTER_PAINT);
} }
static cairo_surface_t * static cairo_surface_t *
@@ -669,8 +719,8 @@ gdk_mir_window_impl_begin_paint_region (GdkWindow *window,
const cairo_region_t *region) const cairo_region_t *region)
{ {
//g_printerr ("gdk_mir_window_impl_begin_paint_region window=%p\n", window); //g_printerr ("gdk_mir_window_impl_begin_paint_region window=%p\n", window);
/* Indicate we are ready to be drawn onto directly? */ /* Indicate we are ready to be drawn right now */
return FALSE; return GDK_MIR_WINDOW_IMPL (window->impl)->pending_swap;
} }
static void static void
@@ -680,7 +730,7 @@ gdk_mir_window_impl_end_paint (GdkWindow *window)
//g_printerr ("gdk_mir_window_impl_end_paint window=%p\n", window); //g_printerr ("gdk_mir_window_impl_end_paint window=%p\n", window);
if (impl->visible && !window->current_paint.use_gl) if (impl->visible && !window->current_paint.use_gl)
send_buffer (window); send_buffer_delayed (window);
} }
static cairo_region_t * static cairo_region_t *