Re: [Spice-devel] [PATCH spice-gtk 05/10] display: keep a reference to the primary surface

2013-09-09 Thread Yonit Halperin

ack
On 09/08/2013 02:59 PM, Marc-André Lureau wrote:

Avoid hard-coding surface 0 as being primary, although in practice it
always is so far. Also a lot of lookups are primary, so add a shortcut
for this special case (~30% apparently), it shows some small lookup
speedup.

before:
real 0m5.008s
user 0m3.253s
sys  0m2.015s

after:
real0m4.930s
user0m3.133s
sys 0m2.027s
---
  gtk/channel-display.c | 28 +++-
  1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/gtk/channel-display.c b/gtk/channel-display.c
index 979ce7b..03ae535 100644
--- a/gtk/channel-display.c
+++ b/gtk/channel-display.c
@@ -67,6 +67,7 @@

  struct _SpiceDisplayChannelPrivate {
  GHashTable  *surfaces;
+display_surface *primary;
  display_cache   *images;
  display_cache   *palettes;
  SpiceImageCache image_cache;
@@ -180,13 +181,11 @@ static void spice_display_get_property(GObject*object,

  switch (prop_id) {
  case PROP_WIDTH: {
-display_surface *surface = find_surface(c, 0);
-g_value_set_uint(value, surface ? surface-width : 0);
+g_value_set_uint(value, c-primary ? c-primary-width : 0);
  break;
  }
  case PROP_HEIGHT: {
-display_surface *surface = find_surface(c, 0);
-g_value_set_uint(value, surface ? surface-height : 0);
+g_value_set_uint(value, c-primary ? c-primary-height : 0);
  break;
  }
  case PROP_MONITORS: {
@@ -739,18 +738,16 @@ static int create_canvas(SpiceChannel *channel, 
display_surface *surface)
  SpiceDisplayChannelPrivate *c = SPICE_DISPLAY_CHANNEL(channel)-priv;

  if (surface-primary) {
-display_surface *primary = find_surface(c, 0);
-
-if (primary) {
-if (primary-width == surface-width 
-primary-height == surface-height) {
+if (c-primary) {
+if (c-primary-width == surface-width 
+c-primary-height == surface-height) {
  CHANNEL_DEBUG(channel, Reusing existing primary surface);
  return 0;
  }

  emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY);

-g_hash_table_remove(c-surfaces, 0);
+g_hash_table_remove(c-surfaces, 
GINT_TO_POINTER(c-primary-surface_id));
  }

  CHANNEL_DEBUG(channel, Create primary canvas);
@@ -803,6 +800,8 @@ static int create_canvas(SpiceChannel *channel, 
display_surface *surface)
  g_hash_table_insert(c-surfaces, GINT_TO_POINTER(surface-surface_id), 
surface);

  if (surface-primary) {
+g_warn_if_fail(c-primary == NULL);
+c-primary = surface;
  emit_main_context(channel, SPICE_DISPLAY_PRIMARY_CREATE,
surface-format, surface-width, surface-height,
surface-stride, surface-shmid, surface-data);
@@ -847,6 +846,9 @@ static void destroy_canvas(display_surface *surface)

  static display_surface *find_surface(SpiceDisplayChannelPrivate *c, guint32 
surface_id)
  {
+if (c-primary  c-primary-surface_id == surface_id)
+return c-primary;
+
  return g_hash_table_lookup(c-surfaces, GINT_TO_POINTER(surface_id));
  }

@@ -944,10 +946,9 @@ static void display_handle_mode(SpiceChannel *channel, 
SpiceMsgIn *in)
  static void display_handle_mark(SpiceChannel *channel, SpiceMsgIn *in)
  {
  SpiceDisplayChannelPrivate *c = SPICE_DISPLAY_CHANNEL(channel)-priv;
-display_surface *surface = find_surface(c, 0);

  CHANNEL_DEBUG(channel, %s, __FUNCTION__);
-g_return_if_fail(surface != NULL);
+g_return_if_fail(c-primary != NULL);
  #ifdef EXTRA_CHECKS
  g_warn_if_fail(c-mark == FALSE);
  #endif
@@ -960,7 +961,7 @@ static void display_handle_mark(SpiceChannel *channel, 
SpiceMsgIn *in)
  static void display_handle_reset(SpiceChannel *channel, SpiceMsgIn *in)
  {
  SpiceDisplayChannelPrivate *c = SPICE_DISPLAY_CHANNEL(channel)-priv;
-display_surface *surface = find_surface(c, 0);
+display_surface *surface = c-primary;

  CHANNEL_DEBUG(channel, %s: TODO detach_from_screen, __FUNCTION__);

@@ -1784,6 +1785,7 @@ static void display_handle_surface_destroy(SpiceChannel 
*channel, SpiceMsgIn *in
  if (id != 0  c-mark_false_event_id == 0) {
  c-mark_false_event_id = g_timeout_add_seconds(1, 
display_mark_false, channel);
  }
+c-primary = NULL;
  emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY);
  }




___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


[Spice-devel] [PATCH spice-gtk 05/10] display: keep a reference to the primary surface

2013-09-08 Thread Marc-André Lureau
Avoid hard-coding surface 0 as being primary, although in practice it
always is so far. Also a lot of lookups are primary, so add a shortcut
for this special case (~30% apparently), it shows some small lookup
speedup.

before:
real 0m5.008s
user 0m3.253s
sys  0m2.015s

after:
real0m4.930s
user0m3.133s
sys 0m2.027s
---
 gtk/channel-display.c | 28 +++-
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/gtk/channel-display.c b/gtk/channel-display.c
index 979ce7b..03ae535 100644
--- a/gtk/channel-display.c
+++ b/gtk/channel-display.c
@@ -67,6 +67,7 @@
 
 struct _SpiceDisplayChannelPrivate {
 GHashTable  *surfaces;
+display_surface *primary;
 display_cache   *images;
 display_cache   *palettes;
 SpiceImageCache image_cache;
@@ -180,13 +181,11 @@ static void spice_display_get_property(GObject*object,
 
 switch (prop_id) {
 case PROP_WIDTH: {
-display_surface *surface = find_surface(c, 0);
-g_value_set_uint(value, surface ? surface-width : 0);
+g_value_set_uint(value, c-primary ? c-primary-width : 0);
 break;
 }
 case PROP_HEIGHT: {
-display_surface *surface = find_surface(c, 0);
-g_value_set_uint(value, surface ? surface-height : 0);
+g_value_set_uint(value, c-primary ? c-primary-height : 0);
 break;
 }
 case PROP_MONITORS: {
@@ -739,18 +738,16 @@ static int create_canvas(SpiceChannel *channel, 
display_surface *surface)
 SpiceDisplayChannelPrivate *c = SPICE_DISPLAY_CHANNEL(channel)-priv;
 
 if (surface-primary) {
-display_surface *primary = find_surface(c, 0);
-
-if (primary) {
-if (primary-width == surface-width 
-primary-height == surface-height) {
+if (c-primary) {
+if (c-primary-width == surface-width 
+c-primary-height == surface-height) {
 CHANNEL_DEBUG(channel, Reusing existing primary surface);
 return 0;
 }
 
 emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY);
 
-g_hash_table_remove(c-surfaces, 0);
+g_hash_table_remove(c-surfaces, 
GINT_TO_POINTER(c-primary-surface_id));
 }
 
 CHANNEL_DEBUG(channel, Create primary canvas);
@@ -803,6 +800,8 @@ static int create_canvas(SpiceChannel *channel, 
display_surface *surface)
 g_hash_table_insert(c-surfaces, GINT_TO_POINTER(surface-surface_id), 
surface);
 
 if (surface-primary) {
+g_warn_if_fail(c-primary == NULL);
+c-primary = surface;
 emit_main_context(channel, SPICE_DISPLAY_PRIMARY_CREATE,
   surface-format, surface-width, surface-height,
   surface-stride, surface-shmid, surface-data);
@@ -847,6 +846,9 @@ static void destroy_canvas(display_surface *surface)
 
 static display_surface *find_surface(SpiceDisplayChannelPrivate *c, guint32 
surface_id)
 {
+if (c-primary  c-primary-surface_id == surface_id)
+return c-primary;
+
 return g_hash_table_lookup(c-surfaces, GINT_TO_POINTER(surface_id));
 }
 
@@ -944,10 +946,9 @@ static void display_handle_mode(SpiceChannel *channel, 
SpiceMsgIn *in)
 static void display_handle_mark(SpiceChannel *channel, SpiceMsgIn *in)
 {
 SpiceDisplayChannelPrivate *c = SPICE_DISPLAY_CHANNEL(channel)-priv;
-display_surface *surface = find_surface(c, 0);
 
 CHANNEL_DEBUG(channel, %s, __FUNCTION__);
-g_return_if_fail(surface != NULL);
+g_return_if_fail(c-primary != NULL);
 #ifdef EXTRA_CHECKS
 g_warn_if_fail(c-mark == FALSE);
 #endif
@@ -960,7 +961,7 @@ static void display_handle_mark(SpiceChannel *channel, 
SpiceMsgIn *in)
 static void display_handle_reset(SpiceChannel *channel, SpiceMsgIn *in)
 {
 SpiceDisplayChannelPrivate *c = SPICE_DISPLAY_CHANNEL(channel)-priv;
-display_surface *surface = find_surface(c, 0);
+display_surface *surface = c-primary;
 
 CHANNEL_DEBUG(channel, %s: TODO detach_from_screen, __FUNCTION__);
 
@@ -1784,6 +1785,7 @@ static void display_handle_surface_destroy(SpiceChannel 
*channel, SpiceMsgIn *in
 if (id != 0  c-mark_false_event_id == 0) {
 c-mark_false_event_id = g_timeout_add_seconds(1, 
display_mark_false, channel);
 }
+c-primary = NULL;
 emit_main_context(channel, SPICE_DISPLAY_PRIMARY_DESTROY);
 }
 
-- 
1.8.3.1

___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel