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;