[Spice-commits] 3 commits - server/display-channel.h server/red_worker.c server/tree.h

Frediano Ziglio fziglio at kemper.freedesktop.org
Thu Nov 5 03:15:10 PST 2015


 server/display-channel.h |   32 +++++++++++++++++
 server/red_worker.c      |   84 ++++++++++++++++-------------------------------
 server/tree.h            |    1 
 3 files changed, 62 insertions(+), 55 deletions(-)

New commits:
commit 81cf3997db6590a9f52f86307ac5f836ab5e03b2
Author: Marc-André Lureau <marcandre.lureau at gmail.com>
Date:   Fri Sep 13 18:00:44 2013 +0200

    worker: minor simplification
    
    Acked-by: Fabiano Fidêncio <fidencio at redhat.com>

diff --git a/server/red_worker.c b/server/red_worker.c
index b6be530..4a43154 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -2957,6 +2957,7 @@ static inline int red_current_add_with_shadow(RedWorker *worker, Ring *ring, Dra
 {
 #ifdef RED_WORKER_STAT
     stat_time_t start_time = stat_now(worker);
+    ++worker->add_with_shadow_count;
 #endif
 
     Shadow *shadow = __new_shadow(worker, item, delta);
@@ -3032,24 +3033,8 @@ static inline void red_update_streamable(RedWorker *worker, Drawable *drawable,
     drawable->streamable = TRUE;
 }
 
-static inline int red_current_add_qxl(RedWorker *worker, Ring *ring, Drawable *drawable,
-                                      RedDrawable *red_drawable)
+static void red_print_stats(RedWorker *worker)
 {
-    int ret;
-
-    if (has_shadow(red_drawable)) {
-        SpicePoint delta;
-
-#ifdef RED_WORKER_STAT
-        ++worker->add_with_shadow_count;
-#endif
-        delta.x = red_drawable->u.copy_bits.src_pos.x - red_drawable->bbox.left;
-        delta.y = red_drawable->u.copy_bits.src_pos.y - red_drawable->bbox.top;
-        ret = red_current_add_with_shadow(worker, ring, drawable, &delta);
-    } else {
-        red_update_streamable(worker, drawable, red_drawable);
-        ret = red_current_add(worker, ring, drawable);
-    }
 #ifdef RED_WORKER_STAT
     if ((++worker->add_count % 100) == 0) {
         stat_time_t total = worker->add_stat.total;
@@ -3074,6 +3059,26 @@ static inline int red_current_add_qxl(RedWorker *worker, Ring *ring, Drawable *d
         stat_reset(&worker->__exclude_stat);
     }
 #endif
+}
+
+static int red_add_drawable(RedWorker *worker, Drawable *drawable)
+{
+    int ret = FALSE, surface_id = drawable->surface_id;
+    RedDrawable *red_drawable = drawable->red_drawable;
+    Ring *ring = &worker->surfaces[surface_id].current;
+
+    if (has_shadow(red_drawable)) {
+        SpicePoint delta = {
+            .x = red_drawable->u.copy_bits.src_pos.x - red_drawable->bbox.left,
+            .y = red_drawable->u.copy_bits.src_pos.y - red_drawable->bbox.top
+        };
+        ret = red_current_add_with_shadow(worker, ring, drawable, &delta);
+    } else {
+        red_update_streamable(worker, drawable, red_drawable);
+        ret = red_current_add(worker, ring, drawable);
+    }
+
+    red_print_stats(worker);
     return ret;
 }
 
@@ -3371,8 +3376,7 @@ static inline void red_process_draw(RedWorker *worker, RedDrawable *red_drawable
         goto cleanup;
     }
 
-    if (red_current_add_qxl(worker, &worker->surfaces[surface_id].current, drawable,
-                            red_drawable)) {
+    if (red_add_drawable(worker, drawable)) {
         if (drawable->tree_item.effect != QXL_EFFECT_OPAQUE) {
             worker->transparent_count++;
         }
diff --git a/server/tree.h b/server/tree.h
index 704bf53..82f9ce3 100644
--- a/server/tree.h
+++ b/server/tree.h
@@ -45,6 +45,7 @@ struct TreeItem {
     QRegion rgn;
 };
 
+/* A region "below" a copy, or the src region of the copy */
 struct Shadow {
     TreeItem base;
     QRegion on_hold;
commit 63b8ea5afba5c6eb1b9825b06f2006930c318aed
Author: Frediano Ziglio <fziglio at redhat.com>
Date:   Wed Nov 4 15:07:28 2015 +0000

    worker: don't process drawable if it can't be allocated
    
    Acked-by: Fabiano Fidêncio <fidencio at redhat.com>

diff --git a/server/red_worker.c b/server/red_worker.c
index f317b10..b6be530 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -3181,14 +3181,14 @@ static inline int red_handle_self_bitmap(RedWorker *worker, Drawable *drawable)
     return TRUE;
 }
 
-static void free_one_drawable(RedWorker *worker, int force_glz_free)
+static bool free_one_drawable(RedWorker *worker, int force_glz_free)
 {
     RingItem *ring_item = ring_get_tail(&worker->current_list);
     Drawable *drawable;
     Container *container;
 
     if (!ring_item) {
-        return;
+        return FALSE;
     }
     drawable = SPICE_CONTAINEROF(ring_item, Drawable, list_link);
     if (force_glz_free) {
@@ -3203,6 +3203,8 @@ static void free_one_drawable(RedWorker *worker, int force_glz_free)
 
     current_remove_drawable(worker, drawable);
     container_cleanup(worker, container);
+
+    return TRUE;
 }
 
 static Drawable *get_drawable(RedWorker *worker, uint8_t effect, RedDrawable *red_drawable,
@@ -3223,7 +3225,8 @@ static Drawable *get_drawable(RedWorker *worker, uint8_t effect, RedDrawable *re
     }
 
     while (!(drawable = alloc_drawable(worker))) {
-        free_one_drawable(worker, FALSE);
+        if (!free_one_drawable(worker, FALSE))
+            return NULL;
     }
     worker->drawable_count++;
     memset(drawable, 0, sizeof(Drawable));
@@ -3326,7 +3329,6 @@ static inline void red_process_draw(RedWorker *worker, RedDrawable *red_drawable
     Drawable *drawable = get_drawable(worker, red_drawable->effect, red_drawable, group_id);
 
     if (!drawable) {
-        rendering_incorrect("failed to get_drawable");
         return;
     }
 
commit d29ebe459056aa6307f99063db1625f8e94101fa
Author: Marc-André Lureau <marcandre.lureau at gmail.com>
Date:   Fri Sep 13 21:15:55 2013 +0200

    worker: move DisplayChannel struct
    
    Acked-by: Frediano Ziglio <fziglio at redhat.com>

diff --git a/server/display-channel.h b/server/display-channel.h
index c4c55ff..48e28a6 100644
--- a/server/display-channel.h
+++ b/server/display-channel.h
@@ -327,4 +327,36 @@ MonitorsConfig*            monitors_config_new                       (QXLHead *h
 MonitorsConfig *           monitors_config_ref                       (MonitorsConfig *config);
 void                       monitors_config_unref                     (MonitorsConfig *config);
 
+struct DisplayChannel {
+    CommonChannel common; // Must be the first thing
+
+    MonitorsConfig *monitors_config;
+
+    uint32_t num_renderers;
+    uint32_t renderers[RED_RENDERER_LAST];
+    uint32_t renderer;
+
+    int enable_jpeg;
+    int jpeg_quality;
+    int enable_zlib_glz_wrap;
+    int zlib_level;
+
+    RedCompressBuf *free_compress_bufs;
+
+#ifdef RED_STATISTICS
+    uint64_t *cache_hits_counter;
+    uint64_t *add_to_cache_counter;
+    uint64_t *non_cache_counter;
+#endif
+#ifdef COMPRESS_STAT
+    stat_info_t lz_stat;
+    stat_info_t glz_stat;
+    stat_info_t quic_stat;
+    stat_info_t jpeg_stat;
+    stat_info_t zlib_glz_stat;
+    stat_info_t jpeg_alpha_stat;
+    stat_info_t lz4_stat;
+#endif
+};
+
 #endif /* DISPLAY_CHANNEL_H_ */
diff --git a/server/red_worker.c b/server/red_worker.c
index 1c37dc0..f317b10 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -343,38 +343,6 @@ struct RedGlzDrawable {
 pthread_mutex_t glz_dictionary_list_lock = PTHREAD_MUTEX_INITIALIZER;
 Ring glz_dictionary_list = {&glz_dictionary_list, &glz_dictionary_list};
 
-struct DisplayChannel {
-    CommonChannel common; // Must be the first thing
-
-    MonitorsConfig *monitors_config;
-
-    uint32_t num_renderers;
-    uint32_t renderers[RED_RENDERER_LAST];
-    uint32_t renderer;
-
-    int enable_jpeg;
-    int jpeg_quality;
-    int enable_zlib_glz_wrap;
-    int zlib_level;
-
-    RedCompressBuf *free_compress_bufs;
-
-#ifdef RED_STATISTICS
-    uint64_t *cache_hits_counter;
-    uint64_t *add_to_cache_counter;
-    uint64_t *non_cache_counter;
-#endif
-#ifdef COMPRESS_STAT
-    stat_info_t lz_stat;
-    stat_info_t glz_stat;
-    stat_info_t quic_stat;
-    stat_info_t jpeg_stat;
-    stat_info_t zlib_glz_stat;
-    stat_info_t jpeg_alpha_stat;
-    stat_info_t lz4_stat;
-#endif
-};
-
 typedef struct _Drawable _Drawable;
 struct _Drawable {
     union {


More information about the Spice-commits mailing list