summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2012-05-15 13:36:36 +0300
committerAlon Levy <alevy@redhat.com>2012-05-15 19:24:53 +0300
commite9a4832f2f82ac99468df60ea43da45e8fd8769f (patch)
tree415e1a2853ae9988fa39137ba12ba1396c49bc5a
parentd2edf0ea6560c42f3c2bcbda3b1ab9310b001b53 (diff)
downloadspice-e9a4832f2f82ac99468df60ea43da45e8fd8769f.tar.gz
spice-e9a4832f2f82ac99468df60ea43da45e8fd8769f.tar.xz
spice-e9a4832f2f82ac99468df60ea43da45e8fd8769f.zip
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/
-rw-r--r--server/red_parse_qxl.c3
-rw-r--r--server/red_parse_qxl.h1
-rw-r--r--server/red_worker.c25
3 files changed, 13 insertions, 16 deletions
diff --git a/server/red_parse_qxl.c b/server/red_parse_qxl.c
index 201e683e..0b9c605a 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 c2edfb92..14598e81 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 7e0cad03..00a5684e 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;