Re: [Spice-devel] [PATCH] Limiting video streaming to the primary surface. freedesktop bug #28088.

2010-08-23 Thread Yonit Halperin
Fixed and pushed

- Original Message -
From: Alexander Larsson al...@redhat.com
To: Yonit Halperin yhalp...@redhat.com
Cc: spice-devel@lists.freedesktop.org
Sent: Monday, August 23, 2010 1:15:57 PM (GMT+0200) Auto-Detected
Subject: Re: [Spice-devel] [PATCH] Limiting video streaming to the primary 
surface. freedesktop bug #28088.

On Sun, 2010-08-22 at 09:17 +0300, Yonit Halperin wrote:

 @@ -3262,10 +3271,12 @@ static inline int red_current_add(RedWorker *worker, 
 Ring *ring, Drawable *drawa
  red_streams_update_clip(worker, drawable);
  } else {
  #ifdef STREAM_TRACE
 -red_detach_streams_behind(worker, drawable-tree_item.base.rgn);
 +if (drawable-surface_id == 0) {
 +red_detach_streams_behind(worker, drawable-tree_item.base.rgn);
  #else
 -red_stop_streams_behind(worker, drawable-tree_item.base.rgn);
 +red_stop_streams_behind(worker, drawable-tree_item.base.rgn);
  #endif
 +}

The if is inside the ifdef, but the } is outside it, will not build
with !STREAM_TRACE.

Otherwise ack.

-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Alexander LarssonRed Hat, Inc 
   al...@redhat.comalexander.lars...@gmail.com 
He's a fast talking chivalrous werewolf living undercover at Ringling Bros. 
Circus. She's an orphaned paranoid college professor with her own daytime 
radio talk show. They fight crime! 

___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


[Spice-devel] [PATCH] Limiting video streaming to the primary surface. freedesktop bug #28088.

2010-08-22 Thread Yonit Halperin
---
 server/red_worker.c |   47 ---
 1 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index cbfe405..ef9aa53 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1516,7 +1516,10 @@ static inline void red_destroy_surface(RedWorker 
*worker, uint32_t surface_id)
 
 if (!--surface-refs) {
 #ifdef STREAM_TRACE
-red_reset_stream_trace(worker);
+// only primary surface streams are supported
+if (surface_id == 0) {
+red_reset_stream_trace(worker);
+}
 #endif
 if (surface-context.canvas) {
 surface-context.canvas-ops-destroy(surface-context.canvas);
@@ -2504,6 +2507,7 @@ static inline void red_stop_stream_gracefully(RedWorker 
*worker, Stream *stream)
 #endif
 
 #ifdef STREAM_TRACE
+// region should be a primary surface region
 static void red_detach_streams_behind(RedWorker *worker, QRegion *region)
 {
 Ring *ring = worker-streams;
@@ -2559,6 +2563,11 @@ static void red_streams_update_clip(RedWorker *worker, 
Drawable *drawable)
 return;
 }
 
+// only primary surface streams are supported
+if (drawable-surface_id != 0) {
+return;
+}
+
 ring = worker-streams;
 item = ring_get_head(ring);
 
@@ -3262,10 +3271,12 @@ static inline int red_current_add(RedWorker *worker, 
Ring *ring, Drawable *drawa
 red_streams_update_clip(worker, drawable);
 } else {
 #ifdef STREAM_TRACE
-red_detach_streams_behind(worker, drawable-tree_item.base.rgn);
+if (drawable-surface_id == 0) {
+red_detach_streams_behind(worker, drawable-tree_item.base.rgn);
 #else
-red_stop_streams_behind(worker, drawable-tree_item.base.rgn);
+red_stop_streams_behind(worker, drawable-tree_item.base.rgn);
 #endif
+}
 }
 region_destroy(exclude_rgn);
 __current_add_drawable(worker, drawable, ring);
@@ -3416,11 +3427,15 @@ static inline int red_current_add_with_shadow(RedWorker 
*worker, Ring *ring, Dra
 worker-current_size++;
 // item and his shadow must initially be placed in the same container.
 // for now putting them on root.
+
+// only primary surface streams are supported
+if (item-surface_id == 0) {
 #ifdef STREAM_TRACE
-red_detach_streams_behind(worker, shadow-base.rgn);
+red_detach_streams_behind(worker, shadow-base.rgn);
 #else
-red_stop_streams_behind(worker, shadow-base.rgn);
+red_stop_streams_behind(worker, shadow-base.rgn);
 #endif
+}
 ring_add(ring, shadow-base.siblings_link);
 __current_add_drawable(worker, item, ring);
 if (item-tree_item.effect == QXL_EFFECT_OPAQUE) {
@@ -3434,11 +3449,13 @@ static inline int red_current_add_with_shadow(RedWorker 
*worker, Ring *ring, Dra
 region_destroy(exclude_rgn);
 red_streams_update_clip(worker, item);
 } else {
+if (item-surface_id == 0) {
 #ifdef STREAM_TRACE
-red_detach_streams_behind(worker, item-tree_item.base.rgn);
+red_detach_streams_behind(worker, item-tree_item.base.rgn);
 #else
-red_stop_streams_behind(worker, item-tree_item.base.rgn);
+red_stop_streams_behind(worker, item-tree_item.base.rgn);
 #endif
+}
 }
 stat_add(worker-add_stat, start_time);
 return TRUE;
@@ -3459,6 +3476,11 @@ static inline void red_update_streamable(RedWorker 
*worker, Drawable *drawable,
 return;
 }
 
+// only primary surface streams are supported
+if (drawable-surface_id != 0) {
+return;
+}
+
 if (drawable-tree_item.effect != QXL_EFFECT_OPAQUE ||
 red_drawable-type != QXL_DRAW_COPY ||
 red_drawable-u.copy.rop_descriptor != 
SPICE_ROPD_OP_PUT) {
@@ -3753,6 +3775,17 @@ static inline int 
red_handle_surfaces_dependencies(RedWorker *worker, Drawable *
 if (drawable-surfaces_dest[x] != drawable-surface_id) {
 add_to_surface_dependency(worker, drawable-surfaces_dest[x],
   drawable-depend_items[x], drawable);
+
+if (drawable-surfaces_dest[x] == 0) {
+QRegion depend_region;
+region_init(depend_region);
+region_add(depend_region, 
drawable-red_drawable-surfaces_rects[x]);
+#ifdef STREAM_TRACE
+red_detach_streams_behind(worker, depend_region);
+#else
+red_stop_streams_behind(worker, depend_region);
+#endif
+}
 }
 }
 
-- 
1.7.1.1

___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


[Spice-devel] [PATCH] Limiting video streaming to the primary surface. freedesktop bug #28088.

2010-08-19 Thread Yonit Halperin
---
 server/red_worker.c |   13 -
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index cbfe405..6fd01d5 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1516,7 +1516,10 @@ static inline void red_destroy_surface(RedWorker 
*worker, uint32_t surface_id)
 
 if (!--surface-refs) {
 #ifdef STREAM_TRACE
-red_reset_stream_trace(worker);
+// only primary surface streams are supported
+if (surface_id == 0) {
+red_reset_stream_trace(worker);
+}
 #endif
 if (surface-context.canvas) {
 surface-context.canvas-ops-destroy(surface-context.canvas);
@@ -3459,6 +3462,14 @@ static inline void red_update_streamable(RedWorker 
*worker, Drawable *drawable,
 return;
 }
 
+/*  We support only streaming on the primary surface. If support for all 
surfaces
+is implemented, inter-surfaces dependencies should be handled, 
similarly to
+intra-surface dependencies. See the call to red_detach_streams_behind 
in 
+red_current_add_with_shadow. */
+if (drawable-surface_id != 0) {
+return;
+}
+
 if (drawable-tree_item.effect != QXL_EFFECT_OPAQUE ||
 red_drawable-type != QXL_DRAW_COPY ||
 red_drawable-u.copy.rop_descriptor != 
SPICE_ROPD_OP_PUT) {
-- 
1.7.1.1

___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


Re: [Spice-devel] [PATCH] Limiting video streaming to the primary surface. freedesktop bug #28088.

2010-08-19 Thread Yonit Halperin

Please ignore the patch. I forgot to add something to it.
I will resend it later.
___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel