[Spice-devel,01/14] Store display in Drawable struct

Submitted by Jonathon Jongsma on April 21, 2016, 9:43 p.m.

Details

Message ID 1461275040-7815-2-git-send-email-jjongsma@redhat.com
State New
Headers show
Series "Rebased patches from refactory branch (April 21)" ( rev: 1 ) in Spice

Not browsing as part of any series.

Commit Message

Jonathon Jongsma April 21, 2016, 9:43 p.m.
If the Drawable keeps a pointer to the Display channel that it is
associated with, we can unref it directly and not need to pass the
'display' parameter separately to the unref function
---
NEW PATCH. This prepares for the UpgradeItem change as discussed on the
previous review.

 server/dcc.c             | 14 +++++---------
 server/display-channel.c | 17 +++++++++++------
 server/display-channel.h |  4 +++-
 3 files changed, 19 insertions(+), 16 deletions(-)

Patch hide | download patch | download mbox

diff --git a/server/dcc.c b/server/dcc.c
index 91c3f82..4f3f227 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -277,13 +277,11 @@  static void add_drawable_surface_images(DisplayChannelClient *dcc, Drawable *dra
 void drawable_pipe_item_free(PipeItem *item)
 {
     DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem, dpi_pipe_item);
-    DisplayChannel *display = DCC_TO_DC(dpi->dcc);
-
     spice_assert(item->refcount == 0);
 
     spice_warn_if_fail(!ring_item_is_linked(&item->link));
     spice_warn_if_fail(!ring_item_is_linked(&dpi->base));
-    display_channel_drawable_unref(display, dpi->drawable);
+    drawable_unref(dpi->drawable);
     free(dpi);
 }
 
@@ -1591,20 +1589,18 @@  int dcc_handle_migrate_data(DisplayChannelClient *dcc, uint32_t size, void *mess
     return TRUE;
 }
 
-static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
+static void upgrade_item_unref(UpgradeItem *item)
 {
     if (--item->refs != 0)
         return;
 
-    display_channel_drawable_unref(display, item->drawable);
+    drawable_unref(item->drawable);
     free(item->rects);
     free(item);
 }
 
 static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item)
 {
-    DisplayChannel *display = DCC_TO_DC(dcc);
-
     switch (item->type) {
     case PIPE_ITEM_TYPE_DRAW:
     case PIPE_ITEM_TYPE_IMAGE:
@@ -1613,7 +1609,7 @@  static void release_item_after_push(DisplayChannelClient *dcc, PipeItem *item)
         pipe_item_unref(item);
         break;
     case PIPE_ITEM_TYPE_UPGRADE:
-        upgrade_item_unref(display, (UpgradeItem *)item);
+        upgrade_item_unref((UpgradeItem *)item);
         break;
     case PIPE_ITEM_TYPE_GL_SCANOUT:
     case PIPE_ITEM_TYPE_GL_DRAW:
@@ -1651,7 +1647,7 @@  static void release_item_before_push(DisplayChannelClient *dcc, PipeItem *item)
     }
     case PIPE_ITEM_TYPE_STREAM_CLIP:
     case PIPE_ITEM_TYPE_UPGRADE:
-        upgrade_item_unref(display, (UpgradeItem *)item);
+        upgrade_item_unref((UpgradeItem *)item);
         break;
     case PIPE_ITEM_TYPE_IMAGE:
     case PIPE_ITEM_TYPE_MONITORS_CONFIG:
diff --git a/server/display-channel.c b/server/display-channel.c
index 88dbc74..f2bdc1d 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -397,7 +397,7 @@  static void current_remove_drawable(DisplayChannel *display, Drawable *item)
     ring_remove(&item->tree_item.base.siblings_link);
     ring_remove(&item->list_link);
     ring_remove(&item->surface_list_link);
-    display_channel_drawable_unref(display, item);
+    drawable_unref(item);
     display->current_size--;
 }
 
@@ -495,7 +495,7 @@  static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *
             pipes_add_drawable(display, drawable);
         }
         drawable_remove_from_pipes(other_drawable);
-        display_channel_drawable_unref(display, other_drawable);
+        drawable_unref(other_drawable);
         return TRUE;
     }
 
@@ -538,7 +538,7 @@  static int current_add_equal(DisplayChannel *display, DrawItem *item, TreeItem *
             /* not sending other_drawable where possible */
             drawable_remove_from_pipes(other_drawable);
 
-            display_channel_drawable_unref(display, other_drawable);
+            drawable_unref(other_drawable);
             return TRUE;
         }
         break;
@@ -1192,7 +1192,7 @@  void display_channel_process_draw(DisplayChannel *display, RedDrawable *red_draw
 
     display_channel_add_drawable(display, drawable);
 
-    display_channel_drawable_unref(display, drawable);
+    drawable_unref(drawable);
 }
 
 int display_channel_wait_for_migrate_data(DisplayChannel *display)
@@ -1380,6 +1380,10 @@  Drawable *display_channel_drawable_try_new(DisplayChannel *display,
     }
 
     bzero(drawable, sizeof(Drawable));
+    /* Pointer to the display from which the drawable is allocated.  This
+     * pointer is safe to be retained as DisplayChannel lifespan is bigger than
+     * all drawables.  */
+    drawable->display = display;
     drawable->refs = 1;
     drawable->creation_time = drawable->first_frame_time = spice_get_monotonic_time_ns();
     ring_item_init(&drawable->list_link);
@@ -1430,8 +1434,9 @@  static void drawable_unref_surface_deps(DisplayChannel *display, Drawable *drawa
     }
 }
 
-void display_channel_drawable_unref(DisplayChannel *display, Drawable *drawable)
+void drawable_unref(Drawable *drawable)
 {
+    DisplayChannel *display = drawable->display;
     RingItem *item, *next;
 
     if (--drawable->refs != 0)
@@ -1653,7 +1658,7 @@  static void draw_until(DisplayChannel *display, RedSurface *surface, Drawable *l
            that display_channel_draw is called for, Otherwise, 'now' would have already been rendered.
            See the call for red_handle_depends_on_target_surface in red_process_draw */
         drawable_draw(display, now);
-        display_channel_drawable_unref(display, now);
+        drawable_unref(now);
     } while (now != last);
 }
 
diff --git a/server/display-channel.h b/server/display-channel.h
index 6b053de..c4a3b19 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -79,8 +79,11 @@  struct Drawable {
     int surface_deps[3];
 
     uint32_t process_commands_generation;
+    DisplayChannel *display;
 };
 
+void drawable_unref (Drawable *drawable);
+
 #define LINK_TO_DPI(ptr) SPICE_CONTAINEROF((ptr), DrawablePipeItem, base)
 #define DRAWABLE_FOREACH_DPI_SAFE(drawable, link, next, dpi)            \
     SAFE_FOREACH(link, next, drawable,  &(drawable)->pipes, dpi, LINK_TO_DPI(link))
@@ -280,7 +283,6 @@  void                       display_channel_compress_stats_print      (const Disp
 void                       display_channel_compress_stats_reset      (DisplayChannel *display);
 Drawable *                 display_channel_drawable_try_new          (DisplayChannel *display,
                                                                       int process_commands_generation);
-void                       display_channel_drawable_unref            (DisplayChannel *display, Drawable *drawable);
 void                       display_channel_surface_unref             (DisplayChannel *display,
                                                                       uint32_t surface_id);
 bool                       display_channel_surface_has_canvas        (DisplayChannel *display,

Comments

Hi Jonathon,

On Thu, 2016-04-21 at 16:43 -0500, Jonathon Jongsma wrote:
> If the Drawable keeps a pointer to the Display channel that it is
> associated with, we can unref it directly and not need to pass the
> 'display' parameter separately to the unref function

So drawable needs 'display' just for unref'ing surface(s) - detach_stream()
doesn't need DisplayChannel, the same applies for
drawable_remove_dependencies(). Looking at the DisplayChannel struct it still
has an array of Drawables and free_drawables. (It is not clear to me - I need to
read previous reviews)

> ---
> NEW PATCH. This prepares for the UpgradeItem change as discussed on the
> previous review.
> 
>  server/dcc.c             | 14 +++++---------
>  server/display-channel.c | 17 +++++++++++------
>  server/display-channel.h |  4 +++-
>  3 files changed, 19 insertions(+), 16 deletions(-)
> 
> diff --git a/server/dcc.c b/server/dcc.c
> index 91c3f82..4f3f227 100644
> --- a/server/dcc.c
> +++ b/server/dcc.c
> @@ -277,13 +277,11 @@ static void
> add_drawable_surface_images(DisplayChannelClient *dcc, Drawable *dra
>  void drawable_pipe_item_free(PipeItem *item)
>  {
>      DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem,
> dpi_pipe_item);
> -    DisplayChannel *display = DCC_TO_DC(dpi->dcc);
> -
>      spice_assert(item->refcount == 0);
>  
>      spice_warn_if_fail(!ring_item_is_linked(&item->link));
>      spice_warn_if_fail(!ring_item_is_linked(&dpi->base));
> -    display_channel_drawable_unref(display, dpi->drawable);
> +    drawable_unref(dpi->drawable);
>      free(dpi);
>  }
>  
> @@ -1591,20 +1589,18 @@ int dcc_handle_migrate_data(DisplayChannelClient *dcc,
> uint32_t size, void *mess
>      return TRUE;
>  }
>  
> -static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
> +static void upgrade_item_unref(UpgradeItem *item)
>  {
>      if (--item->refs != 0)
>          return;
>  
> -    display_channel_drawable_unref(display, item->drawable);
> +    drawable_unref(item->drawable);
>      free(item->rects);
>      free(item);
>  }
>  
>  static void release_item_after_push(DisplayChannelClient *dcc, PipeItem
> *item)
dcc is unused in the function, it should be removed

The patch makes a sense to me, in my opinion more cleanups should be done.

Pavel

>  {
> -    DisplayChannel *display = DCC_TO_DC(dcc);
> -
>      switch (item->type) {
>      case PIPE_ITEM_TYPE_DRAW:
>      case PIPE_ITEM_TYPE_IMAGE:
> @@ -1613,7 +1609,7 @@ static void release_item_after_push(DisplayChannelClient
> *dcc, PipeItem *item)
>          pipe_item_unref(item);
>          break;
>      case PIPE_ITEM_TYPE_UPGRADE:
> -        upgrade_item_unref(display, (UpgradeItem *)item);
> +        upgrade_item_unref((UpgradeItem *)item);
>          break;
>      case PIPE_ITEM_TYPE_GL_SCANOUT:
>      case PIPE_ITEM_TYPE_GL_DRAW:
> @@ -1651,7 +1647,7 @@ static void
> release_item_before_push(DisplayChannelClient *dcc, PipeItem *item)
>      }
>      case PIPE_ITEM_TYPE_STREAM_CLIP:
>      case PIPE_ITEM_TYPE_UPGRADE:
> -        upgrade_item_unref(display, (UpgradeItem *)item);
> +        upgrade_item_unref((UpgradeItem *)item);
>          break;
>      case PIPE_ITEM_TYPE_IMAGE:
>      case PIPE_ITEM_TYPE_MONITORS_CONFIG:
> diff --git a/server/display-channel.c b/server/display-channel.c
> index 88dbc74..f2bdc1d 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -397,7 +397,7 @@ static void current_remove_drawable(DisplayChannel
> *display, Drawable *item)
>      ring_remove(&item->tree_item.base.siblings_link);
>      ring_remove(&item->list_link);
>      ring_remove(&item->surface_list_link);
> -    display_channel_drawable_unref(display, item);
> +    drawable_unref(item);
>      display->current_size--;
>  }
>  
> @@ -495,7 +495,7 @@ static int current_add_equal(DisplayChannel *display,
> DrawItem *item, TreeItem *
>              pipes_add_drawable(display, drawable);
>          }
>          drawable_remove_from_pipes(other_drawable);
> -        display_channel_drawable_unref(display, other_drawable);
> +        drawable_unref(other_drawable);
>          return TRUE;
>      }
>  
> @@ -538,7 +538,7 @@ static int current_add_equal(DisplayChannel *display,
> DrawItem *item, TreeItem *
>              /* not sending other_drawable where possible */
>              drawable_remove_from_pipes(other_drawable);
>  
> -            display_channel_drawable_unref(display, other_drawable);
> +            drawable_unref(other_drawable);
>              return TRUE;
>          }
>          break;
> @@ -1192,7 +1192,7 @@ void display_channel_process_draw(DisplayChannel
> *display, RedDrawable *red_draw
>  
>      display_channel_add_drawable(display, drawable);
>  
> -    display_channel_drawable_unref(display, drawable);
> +    drawable_unref(drawable);
>  }
>  
>  int display_channel_wait_for_migrate_data(DisplayChannel *display)
> @@ -1380,6 +1380,10 @@ Drawable
> *display_channel_drawable_try_new(DisplayChannel *display,
>      }
>  
>      bzero(drawable, sizeof(Drawable));
> +    /* Pointer to the display from which the drawable is allocated.  This
> +     * pointer is safe to be retained as DisplayChannel lifespan is bigger
> than
> +     * all drawables.  */
> +    drawable->display = display;
>      drawable->refs = 1;
>      drawable->creation_time = drawable->first_frame_time =
> spice_get_monotonic_time_ns();
>      ring_item_init(&drawable->list_link);
> @@ -1430,8 +1434,9 @@ static void drawable_unref_surface_deps(DisplayChannel
> *display, Drawable *drawa
>      }
>  }
>  
> -void display_channel_drawable_unref(DisplayChannel *display, Drawable
> *drawable)
> +void drawable_unref(Drawable *drawable)
>  {
> +    DisplayChannel *display = drawable->display;
>      RingItem *item, *next;
>  
>      if (--drawable->refs != 0)
> @@ -1653,7 +1658,7 @@ static void draw_until(DisplayChannel *display,
> RedSurface *surface, Drawable *l
>             that display_channel_draw is called for, Otherwise, 'now' would
> have already been rendered.
>             See the call for red_handle_depends_on_target_surface in
> red_process_draw */
>          drawable_draw(display, now);
> -        display_channel_drawable_unref(display, now);
> +        drawable_unref(now);
>      } while (now != last);
>  }
>  
> diff --git a/server/display-channel.h b/server/display-channel.h
> index 6b053de..c4a3b19 100644
> --- a/server/display-channel.h
> +++ b/server/display-channel.h
> @@ -79,8 +79,11 @@ struct Drawable {
>      int surface_deps[3];
>  
>      uint32_t process_commands_generation;
> +    DisplayChannel *display;
>  };
>  
> +void drawable_unref (Drawable *drawable);
> +
>  #define LINK_TO_DPI(ptr) SPICE_CONTAINEROF((ptr), DrawablePipeItem, base)
>  #define DRAWABLE_FOREACH_DPI_SAFE(drawable, link, next, dpi)            \
>      SAFE_FOREACH(link, next, drawable,  &(drawable)->pipes, dpi,
> LINK_TO_DPI(link))
> @@ -280,7 +283,6 @@
> void                       display_channel_compress_stats_print      (const
> Disp
>  void                       display_channel_compress_stats_reset      (Display
> Channel *display);
>  Drawable
> *                 display_channel_drawable_try_new          (DisplayChannel
> *display,
>                                                                        int
> process_commands_generation);
> -void                       display_channel_drawable_unref            (Display
> Channel *display, Drawable *drawable);
>  void                       display_channel_surface_unref             (Display
> Channel *display,
>                                                                        uint32_
> t surface_id);
>  bool                       display_channel_surface_has_canvas        (Display
> Channel *display,
> 
> Hi Jonathon,
> 
> On Thu, 2016-04-21 at 16:43 -0500, Jonathon Jongsma wrote:
> > If the Drawable keeps a pointer to the Display channel that it is
> > associated with, we can unref it directly and not need to pass the
> > 'display' parameter separately to the unref function
> 
> So drawable needs 'display' just for unref'ing surface(s) - detach_stream()
> doesn't need DisplayChannel, the same applies for

Yes, the display is useful to make possible to free Drawable just having
a pointer to it.
Yes, some function have additional parameters not used but they could be useful
in the future. Could be the Stream does not have a pointer to Drawable to
get the DisplayChannel. Looks like not really related to this patch.
There could be more cleanup possibly following this patch.

> drawable_remove_dependencies(). Looking at the DisplayChannel struct it still
> has an array of Drawables and free_drawables. (It is not clear to me - I need
> to
> read previous reviews)

You are confusing _Drawable with Drawable, _Drawable(s) are used for
memory pooling of Drawable(s).

> 
> > ---
> > NEW PATCH. This prepares for the UpgradeItem change as discussed on the
> > previous review.
> > 
> >  server/dcc.c             | 14 +++++---------
> >  server/display-channel.c | 17 +++++++++++------
> >  server/display-channel.h |  4 +++-
> >  3 files changed, 19 insertions(+), 16 deletions(-)
> > 
> > diff --git a/server/dcc.c b/server/dcc.c
> > index 91c3f82..4f3f227 100644
> > --- a/server/dcc.c
> > +++ b/server/dcc.c
> > @@ -277,13 +277,11 @@ static void
> > add_drawable_surface_images(DisplayChannelClient *dcc, Drawable *dra
> >  void drawable_pipe_item_free(PipeItem *item)
> >  {
> >      DrawablePipeItem *dpi = SPICE_CONTAINEROF(item, DrawablePipeItem,
> > dpi_pipe_item);
> > -    DisplayChannel *display = DCC_TO_DC(dpi->dcc);
> > -
> >      spice_assert(item->refcount == 0);
> >  
> >      spice_warn_if_fail(!ring_item_is_linked(&item->link));
> >      spice_warn_if_fail(!ring_item_is_linked(&dpi->base));
> > -    display_channel_drawable_unref(display, dpi->drawable);
> > +    drawable_unref(dpi->drawable);
> >      free(dpi);
> >  }
> >  
> > @@ -1591,20 +1589,18 @@ int dcc_handle_migrate_data(DisplayChannelClient
> > *dcc,
> > uint32_t size, void *mess
> >      return TRUE;
> >  }
> >  
> > -static void upgrade_item_unref(DisplayChannel *display, UpgradeItem *item)
> > +static void upgrade_item_unref(UpgradeItem *item)
> >  {
> >      if (--item->refs != 0)
> >          return;
> >  
> > -    display_channel_drawable_unref(display, item->drawable);
> > +    drawable_unref(item->drawable);
> >      free(item->rects);
> >      free(item);
> >  }
> >  
> >  static void release_item_after_push(DisplayChannelClient *dcc, PipeItem
> > *item)
> dcc is unused in the function, it should be removed
> 
> The patch makes a sense to me, in my opinion more cleanups should be done.
> 
> Pavel
> 
> >  {
> > -    DisplayChannel *display = DCC_TO_DC(dcc);
> > -
> >      switch (item->type) {
> >      case PIPE_ITEM_TYPE_DRAW:
> >      case PIPE_ITEM_TYPE_IMAGE:
> > @@ -1613,7 +1609,7 @@ static void
> > release_item_after_push(DisplayChannelClient
> > *dcc, PipeItem *item)
> >          pipe_item_unref(item);
> >          break;
> >      case PIPE_ITEM_TYPE_UPGRADE:
> > -        upgrade_item_unref(display, (UpgradeItem *)item);
> > +        upgrade_item_unref((UpgradeItem *)item);
> >          break;
> >      case PIPE_ITEM_TYPE_GL_SCANOUT:
> >      case PIPE_ITEM_TYPE_GL_DRAW:
> > @@ -1651,7 +1647,7 @@ static void
> > release_item_before_push(DisplayChannelClient *dcc, PipeItem *item)
> >      }
> >      case PIPE_ITEM_TYPE_STREAM_CLIP:
> >      case PIPE_ITEM_TYPE_UPGRADE:
> > -        upgrade_item_unref(display, (UpgradeItem *)item);
> > +        upgrade_item_unref((UpgradeItem *)item);
> >          break;
> >      case PIPE_ITEM_TYPE_IMAGE:
> >      case PIPE_ITEM_TYPE_MONITORS_CONFIG:
> > diff --git a/server/display-channel.c b/server/display-channel.c
> > index 88dbc74..f2bdc1d 100644
> > --- a/server/display-channel.c
> > +++ b/server/display-channel.c
> > @@ -397,7 +397,7 @@ static void current_remove_drawable(DisplayChannel
> > *display, Drawable *item)
> >      ring_remove(&item->tree_item.base.siblings_link);
> >      ring_remove(&item->list_link);
> >      ring_remove(&item->surface_list_link);
> > -    display_channel_drawable_unref(display, item);
> > +    drawable_unref(item);
> >      display->current_size--;
> >  }
> >  
> > @@ -495,7 +495,7 @@ static int current_add_equal(DisplayChannel *display,
> > DrawItem *item, TreeItem *
> >              pipes_add_drawable(display, drawable);
> >          }
> >          drawable_remove_from_pipes(other_drawable);
> > -        display_channel_drawable_unref(display, other_drawable);
> > +        drawable_unref(other_drawable);
> >          return TRUE;
> >      }
> >  
> > @@ -538,7 +538,7 @@ static int current_add_equal(DisplayChannel *display,
> > DrawItem *item, TreeItem *
> >              /* not sending other_drawable where possible */
> >              drawable_remove_from_pipes(other_drawable);
> >  
> > -            display_channel_drawable_unref(display, other_drawable);
> > +            drawable_unref(other_drawable);
> >              return TRUE;
> >          }
> >          break;
> > @@ -1192,7 +1192,7 @@ void display_channel_process_draw(DisplayChannel
> > *display, RedDrawable *red_draw
> >  
> >      display_channel_add_drawable(display, drawable);
> >  
> > -    display_channel_drawable_unref(display, drawable);
> > +    drawable_unref(drawable);
> >  }
> >  
> >  int display_channel_wait_for_migrate_data(DisplayChannel *display)
> > @@ -1380,6 +1380,10 @@ Drawable
> > *display_channel_drawable_try_new(DisplayChannel *display,
> >      }
> >  
> >      bzero(drawable, sizeof(Drawable));
> > +    /* Pointer to the display from which the drawable is allocated.  This
> > +     * pointer is safe to be retained as DisplayChannel lifespan is bigger
> > than
> > +     * all drawables.  */
> > +    drawable->display = display;
> >      drawable->refs = 1;
> >      drawable->creation_time = drawable->first_frame_time =
> > spice_get_monotonic_time_ns();
> >      ring_item_init(&drawable->list_link);
> > @@ -1430,8 +1434,9 @@ static void
> > drawable_unref_surface_deps(DisplayChannel
> > *display, Drawable *drawa
> >      }
> >  }
> >  
> > -void display_channel_drawable_unref(DisplayChannel *display, Drawable
> > *drawable)
> > +void drawable_unref(Drawable *drawable)
> >  {
> > +    DisplayChannel *display = drawable->display;
> >      RingItem *item, *next;
> >  
> >      if (--drawable->refs != 0)
> > @@ -1653,7 +1658,7 @@ static void draw_until(DisplayChannel *display,
> > RedSurface *surface, Drawable *l
> >             that display_channel_draw is called for, Otherwise, 'now' would
> > have already been rendered.
> >             See the call for red_handle_depends_on_target_surface in
> > red_process_draw */
> >          drawable_draw(display, now);
> > -        display_channel_drawable_unref(display, now);
> > +        drawable_unref(now);
> >      } while (now != last);
> >  }
> >  
> > diff --git a/server/display-channel.h b/server/display-channel.h
> > index 6b053de..c4a3b19 100644
> > --- a/server/display-channel.h
> > +++ b/server/display-channel.h
> > @@ -79,8 +79,11 @@ struct Drawable {
> >      int surface_deps[3];
> >  
> >      uint32_t process_commands_generation;
> > +    DisplayChannel *display;
> >  };
> >  
> > +void drawable_unref (Drawable *drawable);
> > +
> >  #define LINK_TO_DPI(ptr) SPICE_CONTAINEROF((ptr), DrawablePipeItem, base)
> >  #define DRAWABLE_FOREACH_DPI_SAFE(drawable, link, next, dpi)            \
> >      SAFE_FOREACH(link, next, drawable,  &(drawable)->pipes, dpi,
> > LINK_TO_DPI(link))
> > @@ -280,7 +283,6 @@
> > void                       display_channel_compress_stats_print      (const
> > Disp
> >  void                       display_channel_compress_stats_reset
> >        (Display
> > Channel *display);
> >  Drawable
> > *                 display_channel_drawable_try_new          (DisplayChannel
> > *display,
> >                                                                        int
> > process_commands_generation);
> > -void                       display_channel_drawable_unref
> >             (Display
> > Channel *display, Drawable *drawable);
> >  void                       display_channel_surface_unref
> >               (Display
> > Channel *display,
> >                                                                        uint32_
> > t surface_id);
> >  bool                       display_channel_surface_has_canvas
> >          (Display
> > Channel *display,

Frediano