[Spice-commits] Branch '0.10' - 8 commits - server/red_parse_qxl.c server/red_parse_qxl.h server/red_worker.c

Alon Levy alon at kemper.freedesktop.org
Tue May 15 09:25:11 PDT 2012


 server/red_parse_qxl.c |    3 ++
 server/red_parse_qxl.h |    1 
 server/red_worker.c    |   71 ++++++++++++++++++++-----------------------------
 3 files changed, 34 insertions(+), 41 deletions(-)

New commits:
commit e9a4832f2f82ac99468df60ea43da45e8fd8769f
Author: Alon Levy <alevy at redhat.com>
Date:   Tue May 15 13:36:36 2012 +0300

    server: move self_bitmap_image to RedDrawable
    
    Simplify keeping count of self_bitmap_image by putting it in
    RedDrawable. It is allocated on reading from the command pipe and
    deallocated when the last reference to the RedDrawable is dropped,
    instead of keeping track of it in GlzDrawable and Drawable.
    (cherry picked from commit 05f4276cc128c500cd88df13e44b4bff7d5d0937)
    
    Conflicts:
    
    	server/red_worker.c
    
    Over s/ASSERT/spice_assert/

diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c
index 201e683..0b9c605 100644
--- a/server/red_parse_qxl.c
+++ b/server/red_parse_qxl.c
@@ -929,6 +929,9 @@ void red_get_drawable(RedMemSlotInfo *slots, int group_id,
 void red_put_drawable(RedDrawable *red)
 {
     red_put_clip(&red->clip);
+    if (red->self_bitmap_image) {
+        red_put_image(red->self_bitmap_image);
+    }
     switch (red->type) {
     case QXL_DRAW_ALPHA_BLEND:
         red_put_alpha_blend(&red->u.alpha_blend);
diff --git a/server/red_parse_qxl.h b/server/red_parse_qxl.h
index c2edfb9..14598e8 100644
--- a/server/red_parse_qxl.h
+++ b/server/red_parse_qxl.h
@@ -31,6 +31,7 @@ typedef struct RedDrawable {
     uint8_t type;
     uint8_t self_bitmap;
     SpiceRect self_bitmap_area;
+    SpiceImage *self_bitmap_image;
     SpiceRect bbox;
     SpiceClip clip;
     uint32_t mm_time;
diff --git a/server/red_worker.c b/server/red_worker.c
index 7e0cad0..00a5684 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -556,7 +556,6 @@ struct RedGlzDrawable {
     RedDrawable *red_drawable;
     Drawable    *drawable;
     uint32_t     group_id;
-    SpiceImage  *self_bitmap_image;
     GlzDrawableInstanceItem instances_pool[MAX_GLZ_DRAWABLE_INSTANCES];
     Ring instances;
     uint8_t instances_count;
@@ -789,7 +788,6 @@ struct Drawable {
     int streamable;
     BitmapGradualType copy_bitmap_graduality;
     uint32_t group_id;
-    SpiceImage *self_bitmap_image;
     DependItem depend_items[3];
 
     uint8_t *backed_surface_data;
@@ -1676,16 +1674,13 @@ static RedDrawable *ref_red_drawable(RedDrawable *drawable)
 
 
 static inline void put_red_drawable(RedWorker *worker, RedDrawable *red_drawable,
-                                    uint32_t group_id, SpiceImage *self_bitmap_image)
+                                    uint32_t group_id)
 {
     QXLReleaseInfoExt release_info_ext;
 
     if (--red_drawable->refs) {
         return;
     }
-    if (self_bitmap_image) {
-        red_put_image(self_bitmap_image);
-    }
     worker->red_drawable_count--;
     release_info_ext.group_id = group_id;
     release_info_ext.info = red_drawable->release_info;
@@ -1747,8 +1742,7 @@ static inline void release_drawable(RedWorker *worker, Drawable *drawable)
             SPICE_CONTAINEROF(item, RedGlzDrawable, drawable_link)->drawable = NULL;
             ring_remove(item);
         }
-        put_red_drawable(worker, drawable->red_drawable,
-                          drawable->group_id, drawable->self_bitmap_image);
+        put_red_drawable(worker, drawable->red_drawable, drawable->group_id);
         free_drawable(worker, drawable);
         worker->drawable_count--;
     }
@@ -3607,7 +3601,7 @@ static inline int red_handle_self_bitmap(RedWorker *worker, Drawable *drawable)
         }
     }
 
-    drawable->self_bitmap_image = image;
+    red_drawable->self_bitmap_image = image;
     return TRUE;
 }
 
@@ -4029,8 +4023,8 @@ static void localize_bitmap(RedWorker *worker, SpiceImage **image_ptr, SpiceImag
 
     if (image == NULL) {
         ASSERT(drawable != NULL);
-        ASSERT(drawable->self_bitmap_image != NULL);
-        *image_ptr = drawable->self_bitmap_image;
+        ASSERT(drawable->red_drawable->self_bitmap_image != NULL);
+        *image_ptr = drawable->red_drawable->self_bitmap_image;
         return;
     }
 
@@ -4729,7 +4723,7 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int *
                              red_drawable, ext_cmd.cmd.data, ext_cmd.flags);
             red_process_drawable(worker, red_drawable, ext_cmd.group_id);
             // release the red_drawable
-            put_red_drawable(worker, red_drawable, ext_cmd.group_id, NULL);
+            put_red_drawable(worker, red_drawable, ext_cmd.group_id);
             break;
         }
         case QXL_CMD_UPDATE: {
@@ -5075,7 +5069,6 @@ static RedGlzDrawable *red_display_get_glz_drawable(DisplayChannelClient *dcc, D
     ret->red_drawable = ref_red_drawable(drawable->red_drawable);
     ret->drawable = drawable;
     ret->group_id = drawable->group_id;
-    ret->self_bitmap_image = drawable->self_bitmap_image;
     ret->instances_count = 0;
     ring_init(&ret->instances);
 
@@ -5142,7 +5135,7 @@ static void red_display_free_glz_drawable_instance(DisplayChannelClient *dcc,
             ring_remove(&glz_drawable->drawable_link);
         }
         put_red_drawable(worker, glz_drawable->red_drawable,
-                          glz_drawable->group_id, glz_drawable->self_bitmap_image);
+                         glz_drawable->group_id);
         worker->glz_drawable_count--;
         if (ring_item_is_linked(&glz_drawable->link)) {
             ring_remove(&glz_drawable->link);
@@ -6296,8 +6289,8 @@ static FillBitsType fill_bits(DisplayChannelClient *dcc, SpiceMarshaller *m,
     SpiceMarshaller *bitmap_palette_out, *lzplt_palette_out;
 
     if (simage == NULL) {
-        ASSERT(drawable->self_bitmap_image);
-        simage = drawable->self_bitmap_image;
+        ASSERT(drawable->red_drawable->self_bitmap_image);
+        simage = drawable->red_drawable->self_bitmap_image;
     }
 
     image.descriptor = simage->descriptor;
commit d2edf0ea6560c42f3c2bcbda3b1ab9310b001b53
Author: Alon Levy <alevy at redhat.com>
Date:   Tue May 15 12:41:54 2012 +0300

    server/red_worker/put_red_drawable: s/drawable/red_drawable/
    
    (cherry picked from commit cc1fd8eae7a126d9320c4432eb6ebc54b1ffc201)

diff --git a/server/red_worker.c b/server/red_worker.c
index 3e8e186..7e0cad0 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1675,12 +1675,12 @@ static RedDrawable *ref_red_drawable(RedDrawable *drawable)
 }
 
 
-static inline void put_red_drawable(RedWorker *worker, RedDrawable *drawable, uint32_t group_id,
-                                     SpiceImage *self_bitmap_image)
+static inline void put_red_drawable(RedWorker *worker, RedDrawable *red_drawable,
+                                    uint32_t group_id, SpiceImage *self_bitmap_image)
 {
     QXLReleaseInfoExt release_info_ext;
 
-    if (--drawable->refs) {
+    if (--red_drawable->refs) {
         return;
     }
     if (self_bitmap_image) {
@@ -1688,10 +1688,10 @@ static inline void put_red_drawable(RedWorker *worker, RedDrawable *drawable, ui
     }
     worker->red_drawable_count--;
     release_info_ext.group_id = group_id;
-    release_info_ext.info = drawable->release_info;
+    release_info_ext.info = red_drawable->release_info;
     worker->qxl->st->qif->release_resource(worker->qxl, release_info_ext);
-    red_put_drawable(drawable);
-    free(drawable);
+    red_put_drawable(red_drawable);
+    free(red_drawable);
 }
 
 static void remove_depended_item(DependItem *item)
commit 313e775f4ce248170c3474662715df91f5631214
Author: Alon Levy <alevy at redhat.com>
Date:   Tue May 15 12:40:07 2012 +0300

    server/red_worker/red_handle_self_bitmap: add red_drawable local, one extra whitespace line removed
    
    (cherry picked from commit c6bb40947febf651706a0cd804bb2a8096574ea7)

diff --git a/server/red_worker.c b/server/red_worker.c
index cdad131..3e8e186 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -3560,20 +3560,20 @@ static inline int red_handle_self_bitmap(RedWorker *worker, Drawable *drawable)
     RedSurface *surface;
     int bpp;
     int all_set;
+    RedDrawable *red_drawable = drawable->red_drawable;
 
-    if (!drawable->red_drawable->self_bitmap) {
+    if (!red_drawable->self_bitmap) {
         return TRUE;
     }
 
-
     surface = &worker->surfaces[drawable->surface_id];
 
     bpp = SPICE_SURFACE_FMT_DEPTH(surface->context.format) / 8;
 
-    width = drawable->red_drawable->self_bitmap_area.right
-            - drawable->red_drawable->self_bitmap_area.left;
-    height = drawable->red_drawable->self_bitmap_area.bottom
-            - drawable->red_drawable->self_bitmap_area.top;
+    width = red_drawable->self_bitmap_area.right
+            - red_drawable->self_bitmap_area.left;
+    height = red_drawable->self_bitmap_area.bottom
+            - red_drawable->self_bitmap_area.top;
     dest_stride = SPICE_ALIGN(width * bpp, 4);
 
     image = spice_new0(SpiceImage, 1);
@@ -3593,7 +3593,7 @@ static inline int red_handle_self_bitmap(RedWorker *worker, Drawable *drawable)
     image->u.bitmap.data->flags |= SPICE_CHUNKS_FLAGS_FREE;
 
     red_get_area(worker, drawable->surface_id,
-                 &drawable->red_drawable->self_bitmap_area, dest, dest_stride, TRUE);
+                 &red_drawable->self_bitmap_area, dest, dest_stride, TRUE);
 
     /* For 32bit non-primary surfaces we need to keep any non-zero
        high bytes as the surface may be used as source to an alpha_blend */
commit 7c258a992fd175c95f774e9c021da5a00c53a690
Author: Alon Levy <alevy at redhat.com>
Date:   Tue May 15 12:35:40 2012 +0300

    server/red_worker: rename SpiceImage *self_bitmap to self_bitmap_image
    
    (cherry picked from commit 96bfcea9659cebb5b121d1472bde045add3ee491)
    
    Conflicts:
    
    	server/red_worker.c
        s/ASSERT/spice_assert/

diff --git a/server/red_worker.c b/server/red_worker.c
index b48ad5d..cdad131 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -556,7 +556,7 @@ struct RedGlzDrawable {
     RedDrawable *red_drawable;
     Drawable    *drawable;
     uint32_t     group_id;
-    SpiceImage  *self_bitmap;
+    SpiceImage  *self_bitmap_image;
     GlzDrawableInstanceItem instances_pool[MAX_GLZ_DRAWABLE_INSTANCES];
     Ring instances;
     uint8_t instances_count;
@@ -789,7 +789,7 @@ struct Drawable {
     int streamable;
     BitmapGradualType copy_bitmap_graduality;
     uint32_t group_id;
-    SpiceImage *self_bitmap;
+    SpiceImage *self_bitmap_image;
     DependItem depend_items[3];
 
     uint8_t *backed_surface_data;
@@ -1676,15 +1676,15 @@ static RedDrawable *ref_red_drawable(RedDrawable *drawable)
 
 
 static inline void put_red_drawable(RedWorker *worker, RedDrawable *drawable, uint32_t group_id,
-                                     SpiceImage *self_bitmap)
+                                     SpiceImage *self_bitmap_image)
 {
     QXLReleaseInfoExt release_info_ext;
 
     if (--drawable->refs) {
         return;
     }
-    if (self_bitmap) {
-        red_put_image(self_bitmap);
+    if (self_bitmap_image) {
+        red_put_image(self_bitmap_image);
     }
     worker->red_drawable_count--;
     release_info_ext.group_id = group_id;
@@ -1748,7 +1748,7 @@ static inline void release_drawable(RedWorker *worker, Drawable *drawable)
             ring_remove(item);
         }
         put_red_drawable(worker, drawable->red_drawable,
-                          drawable->group_id, drawable->self_bitmap);
+                          drawable->group_id, drawable->self_bitmap_image);
         free_drawable(worker, drawable);
         worker->drawable_count--;
     }
@@ -3607,7 +3607,7 @@ static inline int red_handle_self_bitmap(RedWorker *worker, Drawable *drawable)
         }
     }
 
-    drawable->self_bitmap = image;
+    drawable->self_bitmap_image = image;
     return TRUE;
 }
 
@@ -4029,8 +4029,8 @@ static void localize_bitmap(RedWorker *worker, SpiceImage **image_ptr, SpiceImag
 
     if (image == NULL) {
         ASSERT(drawable != NULL);
-        ASSERT(drawable->self_bitmap != NULL);
-        *image_ptr = drawable->self_bitmap;
+        ASSERT(drawable->self_bitmap_image != NULL);
+        *image_ptr = drawable->self_bitmap_image;
         return;
     }
 
@@ -5075,7 +5075,7 @@ static RedGlzDrawable *red_display_get_glz_drawable(DisplayChannelClient *dcc, D
     ret->red_drawable = ref_red_drawable(drawable->red_drawable);
     ret->drawable = drawable;
     ret->group_id = drawable->group_id;
-    ret->self_bitmap = drawable->self_bitmap;
+    ret->self_bitmap_image = drawable->self_bitmap_image;
     ret->instances_count = 0;
     ring_init(&ret->instances);
 
@@ -5142,7 +5142,7 @@ static void red_display_free_glz_drawable_instance(DisplayChannelClient *dcc,
             ring_remove(&glz_drawable->drawable_link);
         }
         put_red_drawable(worker, glz_drawable->red_drawable,
-                          glz_drawable->group_id, glz_drawable->self_bitmap);
+                          glz_drawable->group_id, glz_drawable->self_bitmap_image);
         worker->glz_drawable_count--;
         if (ring_item_is_linked(&glz_drawable->link)) {
             ring_remove(&glz_drawable->link);
@@ -6296,8 +6296,8 @@ static FillBitsType fill_bits(DisplayChannelClient *dcc, SpiceMarshaller *m,
     SpiceMarshaller *bitmap_palette_out, *lzplt_palette_out;
 
     if (simage == NULL) {
-        ASSERT(drawable->self_bitmap);
-        simage = drawable->self_bitmap;
+        ASSERT(drawable->self_bitmap_image);
+        simage = drawable->self_bitmap_image;
     }
 
     image.descriptor = simage->descriptor;
commit 67cbdccccfb1e0e85e7feefc808ee1d7b67da76d
Author: Alon Levy <alevy at redhat.com>
Date:   Mon May 14 14:36:33 2012 +0300

    server/red_worker/red_process_commands: rename drawable to red_drawable (later add a local drawable)
    
    (cherry picked from commit bab771c10dfa1cc5751f4fd33548b997f7200dbd)
    
    Conflicts:
    
    	server/red_worker.c
        s/ASSERT/spice_assert/

diff --git a/server/red_worker.c b/server/red_worker.c
index 343dac4..b48ad5d 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -4723,13 +4723,13 @@ static int red_process_commands(RedWorker *worker, uint32_t max_pipe_size, int *
         worker->repoll_cmd_ring = 0;
         switch (ext_cmd.cmd.type) {
         case QXL_CMD_DRAW: {
-            RedDrawable *drawable = red_drawable_new(); // returns with 1 ref
+            RedDrawable *red_drawable = red_drawable_new(); // returns with 1 ref
 
             red_get_drawable(&worker->mem_slots, ext_cmd.group_id,
-                             drawable, ext_cmd.cmd.data, ext_cmd.flags);
-            red_process_drawable(worker, drawable, ext_cmd.group_id);
+                             red_drawable, ext_cmd.cmd.data, ext_cmd.flags);
+            red_process_drawable(worker, red_drawable, ext_cmd.group_id);
             // release the red_drawable
-            put_red_drawable(worker, drawable, ext_cmd.group_id, NULL);
+            put_red_drawable(worker, red_drawable, ext_cmd.group_id, NULL);
             break;
         }
         case QXL_CMD_UPDATE: {
commit 445364fe7dfd830b7c144770de60343e13081aad
Author: Alon Levy <alevy at redhat.com>
Date:   Mon May 14 14:32:23 2012 +0300

    server/red_worker: red_process_drawable: have single point of exit
    
    (cherry picked from commit c8cefd4a8f28bde14b70a72272c0ccb80c77af04)

diff --git a/server/red_worker.c b/server/red_worker.c
index dbe961d..343dac4 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -3787,23 +3787,19 @@ static inline void red_process_drawable(RedWorker *worker, RedDrawable *drawable
     red_inc_surfaces_drawable_dependencies(worker, item);
 
     if (region_is_empty(&item->tree_item.base.rgn)) {
-        release_drawable(worker, item);
-        return;
+        goto cleanup;
     }
 
     if (!red_handle_self_bitmap(worker, item)) {
-        release_drawable(worker, item);
-        return;
+        goto cleanup;
     }
 
     if (!red_handle_depends_on_target_surface(worker, surface_id)) {
-        release_drawable(worker, item);
-        return;
+        goto cleanup;
     }
 
     if (!red_handle_surfaces_dependencies(worker, item)) {
-        release_drawable(worker, item);
-        return;
+        goto cleanup;
     }
 
     if (red_current_add_qxl(worker, &worker->surfaces[surface_id].current, item,
@@ -3816,6 +3812,7 @@ static inline void red_process_drawable(RedWorker *worker, RedDrawable *drawable
         red_draw_qxl_drawable(worker, item);
 #endif
     }
+cleanup:
     release_drawable(worker, item);
 }
 
commit 6a9f2c94539803d8263bead599139cadcbfc40c5
Author: Yonit Halperin <yhalperi at redhat.com>
Date:   Sun May 13 14:21:28 2012 +0300

    server/red_worker: don't release self_bitmap unless refcount is 0
    
    RHBZ: 808936
    (cherry picked from commit 6935bd3d604288a64f491e4226f3d31aafdbf81e)

diff --git a/server/red_worker.c b/server/red_worker.c
index 387b78d..dbe961d 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -1680,13 +1680,12 @@ static inline void put_red_drawable(RedWorker *worker, RedDrawable *drawable, ui
 {
     QXLReleaseInfoExt release_info_ext;
 
-    if (self_bitmap) {
-        red_put_image(self_bitmap);
-    }
     if (--drawable->refs) {
         return;
     }
-
+    if (self_bitmap) {
+        red_put_image(self_bitmap);
+    }
     worker->red_drawable_count--;
     release_info_ext.group_id = group_id;
     release_info_ext.info = drawable->release_info;
commit d3bf13c9b4d102e0d1f1c1d51c8782569ea64a69
Author: Jeremy White <jwhite at codeweavers.com>
Date:   Thu Apr 26 12:09:50 2012 -0500

    Force 64 bit multiplication on 32 bit systems; fixes a bug where the server times out the display channel freakily fast.
    
    (cherry picked from commit 8d3ebe31ddb4004a4aa794bc1da444573a9914f8)

diff --git a/server/red_worker.c b/server/red_worker.c
index 8a4315d..387b78d 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -4638,7 +4638,7 @@ static inline uint64_t red_now(void)
 
     clock_gettime(CLOCK_MONOTONIC, &time);
 
-    return time.tv_sec * 1000000000 + time.tv_nsec;
+    return ((uint64_t) time.tv_sec) * 1000000000 + time.tv_nsec;
 }
 
 static int red_process_cursor(RedWorker *worker, uint32_t max_pipe_size, int *ring_is_empty)


More information about the Spice-commits mailing list