[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