summaryrefslogtreecommitdiffstats
path: root/server/red_worker.c
diff options
context:
space:
mode:
authorYonit Halperin <yhalperi@redhat.com>2012-04-30 09:09:57 +0300
committerYonit Halperin <yhalperi@redhat.com>2012-05-03 12:31:02 +0300
commit21b857f3ce568735a8c7951652f3e412d69b6df8 (patch)
tree86d84563f49740f7c6a4ed3ca06a43d6cea17aa9 /server/red_worker.c
parent81fe00b08ad4f8abe848f9840c4879e8c1e645c1 (diff)
downloadspice-21b857f3ce568735a8c7951652f3e412d69b6df8.tar.gz
spice-21b857f3ce568735a8c7951652f3e412d69b6df8.tar.xz
spice-21b857f3ce568735a8c7951652f3e412d69b6df8.zip
server/red_worker/video: don't detach a drawable from a stream due to it being rendered.
The previous patch took care that streams will be upgraded by a surface screenshot and not the last frame, if necessary. Thus, there is no more a reason for detaching drawables from streams when they are rendered. Moreover, detaching such drawables can cause glitches, in case they are still in the pipe, and red_update_area is called frequently and leads to stream frames rendering.
Diffstat (limited to 'server/red_worker.c')
-rw-r--r--server/red_worker.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/server/red_worker.c b/server/red_worker.c
index dc66fc1a..85ad7b8a 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1743,9 +1743,12 @@ static inline void release_drawable(RedWorker *worker, Drawable *drawable)
RingItem *item, *next;
if (!--drawable->refs) {
- spice_assert(!drawable->stream);
spice_assert(!drawable->tree_item.shadow);
spice_assert(ring_is_empty(&drawable->pipes));
+
+ if (drawable->stream) {
+ red_detach_stream(worker, drawable->stream);
+ }
region_destroy(&drawable->tree_item.base.rgn);
remove_drawable_dependencies(worker, drawable);
@@ -1846,9 +1849,7 @@ static inline void current_remove_drawable(RedWorker *worker, Drawable *item)
if (item->tree_item.effect != QXL_EFFECT_OPAQUE) {
worker->transparent_count--;
}
- if (item->stream) {
- red_detach_stream(worker, item->stream);
- } else {
+ if (!item->stream) {
red_add_item_trace(worker, item);
}
remove_shadow(worker, &item->tree_item);
@@ -2741,9 +2742,7 @@ static inline void red_handle_streams_timout(RedWorker *worker)
Stream *stream = SPICE_CONTAINEROF(item, Stream, link);
item = ring_next(ring, item);
if (now >= (stream->last_time + RED_STREAM_TIMOUT)) {
- if (stream->current) {
- red_detach_stream_gracefully(worker, stream);
- }
+ red_detach_stream_gracefully(worker, stream);
red_stop_stream(worker, stream);
}
}
@@ -4504,7 +4503,8 @@ static void red_update_area(RedWorker *worker, const SpiceRect *area, int surfac
#ifdef ACYCLIC_SURFACE_DEBUG
int gn;
#endif
-
+ spice_debug("surface %d: area ==>", surface_id);
+ rect_debug(area);
surface = &worker->surfaces[surface_id];
last = NULL;