[Spice-commits] 3 commits - server/dcc-encoders.c server/dcc-encoders.h server/dcc.c server/display-channel.c server/display-channel.h

Frediano Ziglio fziglio at kemper.freedesktop.org
Fri Jun 17 09:57:44 UTC 2016


 server/dcc-encoders.c    |   29 +++++++++++++++++------------
 server/dcc-encoders.h    |   24 +++++++++++++++++++-----
 server/dcc.c             |    4 +++-
 server/display-channel.c |    6 +++---
 server/display-channel.h |    2 +-
 5 files changed, 43 insertions(+), 22 deletions(-)

New commits:
commit a27eb96811197d0df3eea5bdf19675b53a8c6960
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Tue Jun 7 11:01:08 2016 +0100

    Reduce header dependency
    
    Avoid dependencies from RedChannel stuff.
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Jonathon Jongsma <jjongsma at redhat.com>

diff --git a/server/dcc-encoders.h b/server/dcc-encoders.h
index ed8bdea..9286970 100644
--- a/server/dcc-encoders.h
+++ b/server/dcc-encoders.h
@@ -20,10 +20,10 @@
 
 #include <setjmp.h>
 #include <common/quic.h>
+#include <common/lz.h>
 
-#include "red-channel.h"
+#include "stat.h"
 #include "red-parse-qxl.h"
-#include "image-cache.h"
 #include "glz-encoder.h"
 #include "jpeg-encoder.h"
 #ifdef USE_LZ4
@@ -31,6 +31,8 @@
 #endif
 #include "zlib-encoder.h"
 
+struct RedClient;
+
 typedef struct RedCompressBuf RedCompressBuf;
 typedef struct RedGlzDrawable RedGlzDrawable;
 typedef struct ImageEncoders ImageEncoders;
commit e281703af830fdb12de5a94143e3159057c7e65e
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Tue Jun 7 10:54:45 2016 +0100

    Remove dependency from dcc-encoders to Drawable
    
    Encoding image requires a RedDrawable (where the data is stored) and
    a Ring where to store information to free Glz structures.
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Jonathon Jongsma <jjongsma at redhat.com>

diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
index 42affd5..984f2d4 100644
--- a/server/dcc-encoders.c
+++ b/server/dcc-encoders.c
@@ -22,7 +22,9 @@
 #include <glib.h>
 
 #include "dcc-encoders.h"
-#include "display-channel.h"
+#include "spice-bitmap-utils.h"
+#include "red-worker.h" // red_drawable_unref
+#include "pixmap-cache.h" // MAX_CACHE_CLIENTS
 
 #define ZLIB_DEFAULT_COMPRESSION_LEVEL 3
 
@@ -1151,7 +1153,8 @@ int image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest,
 
 /* if already exists, returns it. Otherwise allocates and adds it (1) to the ring tail
    in the channel (2) to the Drawable*/
-static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, Drawable *drawable)
+static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, RedDrawable *red_drawable,
+                                        GlzImageRetention *glz_retention)
 {
     RedGlzDrawable *ret;
     RingItem *item, *next;
@@ -1159,7 +1162,7 @@ static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, Drawable *drawable)
     // TODO - I don't really understand what's going on here, so doing the technical equivalent
     // now that we have multiple glz_dicts, so the only way to go from dcc to drawable glz is to go
     // over the glz_ring (unless adding some better data structure then a ring)
-    DRAWABLE_FOREACH_GLZ_SAFE(drawable, item, next, ret) {
+    SAFE_FOREACH(item, next, TRUE, &glz_retention->ring, ret, LINK_TO_GLZ(item)) {
         if (ret->encoders == enc) {
             return ret;
         }
@@ -1168,7 +1171,7 @@ static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, Drawable *drawable)
     ret = spice_new(RedGlzDrawable, 1);
 
     ret->encoders = enc;
-    ret->red_drawable = red_drawable_ref(drawable->red_drawable);
+    ret->red_drawable = red_drawable_ref(red_drawable);
     ret->has_drawable = TRUE;
     ret->instances_count = 0;
     ring_init(&ret->instances);
@@ -1176,7 +1179,7 @@ static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, Drawable *drawable)
     ring_item_init(&ret->link);
     ring_item_init(&ret->drawable_link);
     ring_add_before(&ret->link, &enc->glz_drawables);
-    ring_add(&drawable->glz_retention.ring, &ret->drawable_link);
+    ring_add(&glz_retention->ring, &ret->drawable_link);
     enc->shared_data->glz_drawable_count++;
     return ret;
 }
@@ -1202,7 +1205,9 @@ static GlzDrawableInstanceItem *add_glz_drawable_instance(RedGlzDrawable *glz_dr
 #define MIN_GLZ_SIZE_FOR_ZLIB 100
 
 int image_encoders_compress_glz(ImageEncoders *enc,
-                                SpiceImage *dest, SpiceBitmap *src, Drawable *drawable,
+                                SpiceImage *dest, SpiceBitmap *src,
+                                RedDrawable *red_drawable,
+                                GlzImageRetention *glz_retention,
                                 compress_send_data_t* o_comp_data,
                                 gboolean enable_zlib_glz_wrap)
 {
@@ -1234,7 +1239,7 @@ int image_encoders_compress_glz(ImageEncoders *enc,
 
     encoder_data_init(&glz_data->data);
 
-    glz_drawable = get_glz_drawable(enc, drawable);
+    glz_drawable = get_glz_drawable(enc, red_drawable, glz_retention);
     glz_drawable_instance = add_glz_drawable_instance(glz_drawable);
 
     glz_data->data.u.lines_data.chunks = src->data;
diff --git a/server/dcc-encoders.h b/server/dcc-encoders.h
index 38e6c5a..ed8bdea 100644
--- a/server/dcc-encoders.h
+++ b/server/dcc-encoders.h
@@ -204,7 +204,9 @@ int image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest,
 int image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest,
                                 SpiceBitmap *src, compress_send_data_t* o_comp_data);
 int image_encoders_compress_glz(ImageEncoders *enc,
-                                SpiceImage *dest, SpiceBitmap *src, struct Drawable *drawable,
+                                SpiceImage *dest, SpiceBitmap *src,
+                                RedDrawable *red_drawable,
+                                GlzImageRetention *glz_retention,
                                 compress_send_data_t* o_comp_data,
                                 gboolean enable_zlib_glz_wrap);
 
diff --git a/server/dcc.c b/server/dcc.c
index e5c80ad..45c3ca8 100644
--- a/server/dcc.c
+++ b/server/dcc.c
@@ -735,7 +735,9 @@ int dcc_compress_image(DisplayChannelClient *dcc,
         success = image_encoders_compress_quic(&dcc->encoders, dest, src, o_comp_data);
         break;
     case SPICE_IMAGE_COMPRESSION_GLZ:
-        success = image_encoders_compress_glz(&dcc->encoders, dest, src, drawable, o_comp_data,
+        success = image_encoders_compress_glz(&dcc->encoders, dest, src,
+                                              drawable->red_drawable, &drawable->glz_retention,
+                                              o_comp_data,
                                               display_channel->enable_zlib_glz_wrap);
         if (success) {
             break;
commit a5eae2a0e9ffb12e5609831d1e60c558e3b45581
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Tue Jun 7 10:12:36 2016 +0100

    Use new GlzImageRetention instead of accessing Drawable internals
    
    Remove some coupling, we mainly need to store a list of RedGlzDrawables.
    
    Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
    Acked-by: Jonathon Jongsma <jjongsma at redhat.com>

diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c
index ea68ac1..42affd5 100644
--- a/server/dcc-encoders.c
+++ b/server/dcc-encoders.c
@@ -70,7 +70,7 @@ struct RedGlzDrawable {
 #define LINK_TO_GLZ(ptr) SPICE_CONTAINEROF((ptr), RedGlzDrawable, \
                                            drawable_link)
 #define DRAWABLE_FOREACH_GLZ_SAFE(drawable, link, next, glz) \
-    SAFE_FOREACH(link, next, drawable, &(drawable)->glz_ring, glz, LINK_TO_GLZ(link))
+    SAFE_FOREACH(link, next, drawable, &(drawable)->glz_retention.ring, glz, LINK_TO_GLZ(link))
 
 static void glz_drawable_instance_item_free(GlzDrawableInstanceItem *instance);
 static void encoder_data_init(EncoderData *data);
@@ -642,20 +642,20 @@ void image_encoders_free_glz_drawables(ImageEncoders *enc)
     pthread_rwlock_unlock(&glz_dict->encode_lock);
 }
 
-void drawable_free_glz_drawables(struct Drawable *drawable)
+void glz_retention_free_drawables(GlzImageRetention *ret)
 {
     RingItem *glz_item, *next_item;
     RedGlzDrawable *glz;
-    DRAWABLE_FOREACH_GLZ_SAFE(drawable, glz_item, next_item, glz) {
+    SAFE_FOREACH(glz_item, next_item, TRUE, &ret->ring, glz, LINK_TO_GLZ(glz_item)) {
         red_glz_drawable_free(glz);
     }
 }
 
-void drawable_detach_glz_drawables(struct Drawable *drawable)
+void glz_retention_detach_drawables(GlzImageRetention *ret)
 {
     RingItem *item, *next;
 
-    RING_FOREACH_SAFE(item, next, &drawable->glz_ring) {
+    RING_FOREACH_SAFE(item, next, &ret->ring) {
         SPICE_CONTAINEROF(item, RedGlzDrawable, drawable_link)->has_drawable = FALSE;
         ring_remove(item);
     }
@@ -1176,7 +1176,7 @@ static RedGlzDrawable *get_glz_drawable(ImageEncoders *enc, Drawable *drawable)
     ring_item_init(&ret->link);
     ring_item_init(&ret->drawable_link);
     ring_add_before(&ret->link, &enc->glz_drawables);
-    ring_add(&drawable->glz_ring, &ret->drawable_link);
+    ring_add(&drawable->glz_retention.ring, &ret->drawable_link);
     enc->shared_data->glz_drawable_count++;
     return ret;
 }
diff --git a/server/dcc-encoders.h b/server/dcc-encoders.h
index 114dacd..38e6c5a 100644
--- a/server/dcc-encoders.h
+++ b/server/dcc-encoders.h
@@ -36,6 +36,7 @@ typedef struct RedGlzDrawable RedGlzDrawable;
 typedef struct ImageEncoders ImageEncoders;
 typedef struct ImageEncoderSharedData ImageEncoderSharedData;
 typedef struct GlzSharedDictionary GlzSharedDictionary;
+typedef struct GlzImageRetention GlzImageRetention;
 
 void image_encoder_shared_init(ImageEncoderSharedData *shared_data);
 void image_encoder_shared_stat_reset(ImageEncoderSharedData *shared_data);
@@ -51,8 +52,8 @@ void image_encoders_glz_get_restore_data(ImageEncoders *enc,
                                          uint8_t *out_id, GlzEncDictRestoreData *out_data);
 gboolean image_encoders_glz_encode_lock(ImageEncoders *enc);
 void image_encoders_glz_encode_unlock(ImageEncoders *enc);
-void drawable_free_glz_drawables(struct Drawable *drawable);
-void drawable_detach_glz_drawables(struct Drawable *drawable);
+void glz_retention_free_drawables(GlzImageRetention *ret);
+void glz_retention_detach_drawables(GlzImageRetention *ret);
 
 #define RED_COMPRESS_BUF_SIZE (1024 * 64)
 struct RedCompressBuf {
@@ -130,6 +131,15 @@ typedef struct {
     EncoderData data;
 } GlzData;
 
+struct GlzImageRetention {
+    Ring ring;
+};
+
+static inline void glz_retention_init(GlzImageRetention *ret)
+{
+    ring_init(&ret->ring);
+}
+
 struct ImageEncoderSharedData {
     uint32_t glz_drawable_count;
 
diff --git a/server/display-channel.c b/server/display-channel.c
index 2366a98..073d45e 100644
--- a/server/display-channel.c
+++ b/server/display-channel.c
@@ -1179,7 +1179,7 @@ static bool free_one_drawable(DisplayChannel *display, int force_glz_free)
 
     drawable = SPICE_CONTAINEROF(ring_item, Drawable, list_link);
     if (force_glz_free) {
-        drawable_free_glz_drawables(drawable);
+        glz_retention_free_drawables(&drawable->glz_retention);
     }
     drawable_draw(display, drawable);
     container = drawable->tree_item.base.container;
@@ -1280,7 +1280,7 @@ static Drawable *display_channel_drawable_try_new(DisplayChannel *display,
     drawable->tree_item.base.type = TREE_ITEM_TYPE_DRAWABLE;
     region_init(&drawable->tree_item.base.rgn);
     ring_init(&drawable->pipes);
-    ring_init(&drawable->glz_ring);
+    glz_retention_init(&drawable->glz_retention);
     drawable->process_commands_generation = process_commands_generation;
 
     return drawable;
@@ -1341,7 +1341,7 @@ void drawable_unref(Drawable *drawable)
     drawable_unref_surface_deps(display, drawable);
     display_channel_surface_unref(display, drawable->surface_id);
 
-    drawable_detach_glz_drawables(drawable);
+    glz_retention_detach_drawables(&drawable->glz_retention);
 
     if (drawable->red_drawable) {
         red_drawable_unref(drawable->red_drawable);
diff --git a/server/display-channel.h b/server/display-channel.h
index ec84f2d..f090d99 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -62,7 +62,7 @@ struct Drawable {
     uint32_t size_pipe_item_rest;
     RedDrawable *red_drawable;
 
-    Ring glz_ring;
+    GlzImageRetention glz_retention;
 
     red_time_t creation_time;
     red_time_t first_frame_time;


More information about the Spice-commits mailing list