changeset 2086:724e6afd4b58

dynamic change of texture upload priority
author Vladimir Nadvornik <nadvornik@suse.cz>
date Sat, 18 Aug 2012 16:25:18 +0200
parents 4819bb191532
children db758ceaa1fc
files src/renderer-clutter.c
diffstat 1 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/renderer-clutter.c	Sat Aug 18 00:33:54 2012 +0200
+++ b/src/renderer-clutter.c	Sat Aug 18 16:25:18 2012 +0200
@@ -105,6 +105,7 @@
 	ClutterActor *group;
 	
 	gboolean clut_updated;
+	gint64 last_pixbuf_change;
 };
 
 typedef struct _RendererClutterAreaParam RendererClutterAreaParam;
@@ -373,6 +374,23 @@
 
 #define MAX_REGION_AREA (32768 * 1024)
 
+static gboolean renderer_area_changed_cb(gpointer data);
+
+static void rc_schedule_texture_upload(RendererClutter *rc)
+{
+	if (g_get_monotonic_time() - rc->last_pixbuf_change < 50000)
+		{
+		/* delay clutter redraw until the texture has some data 
+		   set priority between gtk redraw and clutter redraw */
+		rc->idle_update = g_idle_add_full(CLUTTER_PRIORITY_REDRAW - 10, renderer_area_changed_cb, rc, NULL);
+		}
+	else
+		{
+		/* higher prio than histogram */
+		rc->idle_update = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE - 5, renderer_area_changed_cb, rc, NULL);
+		}
+}
+
 static gboolean renderer_area_changed_cb(gpointer data)
 {
 	RendererClutter *rc = (RendererClutter *)data;
@@ -426,7 +444,10 @@
 
 		return FALSE;
 		}
-	return TRUE;
+
+	rc_schedule_texture_upload(rc);
+
+	return FALSE; /* it was rescheduled, possibly with different prio */
 }
 
 
@@ -457,7 +478,7 @@
 	rc->pending_updates = g_list_append(rc->pending_updates, par);
 	if (!rc->idle_update) 
 		{
-		rc->idle_update = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, renderer_area_changed_cb, rc, NULL);
+		rc_schedule_texture_upload(rc);
 		}
 }
 
@@ -519,6 +540,7 @@
 		}
 
 	rc->clut_updated = FALSE;
+	rc->last_pixbuf_change = g_get_monotonic_time();
 	printf("renderer_update_pixbuf\n");
 	rc_sync_actor(rc);
 }