[Spice-devel] [PATCH spice-server] worker: move compression parameters to dcc
Pavel Grunt
pgrunt at redhat.com
Fri Nov 13 06:24:59 PST 2015
On Fri, 2015-11-13 at 15:16 +0100, Pavel Grunt wrote:
> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau at gmail.com>
> [updated for the preferred compression]
> Signed-off-by: Pavel Grunt <pgrunt at redhat.com>
> ---
> server/display-channel.c | 9 ++++++++-
> server/display-channel.h | 8 +++++++-
> server/red_worker.c | 32 ++++++++++++++++----------------
> 3 files changed, 31 insertions(+), 18 deletions(-)
>
> diff --git a/server/display-channel.c b/server/display-channel.c
> index f6f96a4..824f601 100644
> --- a/server/display-channel.c
> +++ b/server/display-channel.c
> @@ -124,7 +124,11 @@ DisplayChannelClient *dcc_new(DisplayChannel *display,
> RedClient *client, RedsStream *stream,
> int mig_target,
> uint32_t *common_caps, int num_common_caps,
> - uint32_t *caps, int num_caps)
> + uint32_t *caps, int num_caps,
> + SpiceImageCompression image_compression,
> + spice_wan_compression_t jpeg_state,
> + spice_wan_compression_t zlib_glz_state)
> +
> {
> DisplayChannelClient *dcc;
>
> @@ -137,6 +141,9 @@ DisplayChannelClient *dcc_new(DisplayChannel *display,
>
> ring_init(&dcc->palette_cache_lru);
> dcc->palette_cache_available = CLIENT_PALETTE_CACHE_SIZE;
> + dcc->image_compression = image_compression;
> + dcc->jpeg_state = jpeg_state;
> + dcc->zlib_glz_state = zlib_glz_state;
>
> return dcc;
> }
> diff --git a/server/display-channel.h b/server/display-channel.h
> index 5518494..12ef60a 100644
> --- a/server/display-channel.h
> +++ b/server/display-channel.h
> @@ -161,6 +161,9 @@ struct Drawable {
>
> struct DisplayChannelClient {
> CommonChannelClient common;
> + SpiceImageCompression image_compression;
> + spice_wan_compression_t jpeg_state;
> + spice_wan_compression_t zlib_glz_state;
>
> int expect_init;
>
> @@ -233,7 +236,10 @@
> DisplayChannelClient* dcc_new (DisplayC
> ha
> uint32_
> t *common_caps,
> int
> num_common_caps,
> uint32_
> t *caps,
> - int
> num_caps);
> + int
> num_caps,
> + SpiceIm
> ageCompression image_compression,
> + spice_w
> an_compression_t jpeg_state,
> + spice_w
> an_compression_t zlib_glz_state);
> void dcc_push_monitors_config (Display
> ChannelClient *dcc);
> void dcc_push_destroy_surface (Display
> ChannelClient *dcc,
> uint32_
> t surface_id);
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 68ac527..d3c5b70 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -4488,8 +4488,7 @@ static inline int
> red_compress_image(DisplayChannelClient *dcc,
> compress_send_data_t* o_comp_data)
> {
> DisplayChannel *display_channel = DCC_TO_DC(dcc);
> - SpiceImageCompression image_compression =
> - display_channel->common.worker->image_compression;
> + SpiceImageCompression image_compression = dcc->image_compression;
> int quic_compress = FALSE;
>
> if ((image_compression == SPICE_IMAGE_COMPRESSION_OFF) ||
> @@ -4893,15 +4892,14 @@ static void fill_mask(RedChannelClient *rcc,
> SpiceMarshaller *m,
> SpiceImage *mask_bitmap, Drawable *drawable)
> {
> DisplayChannelClient *dcc = RCC_TO_DCC(rcc);
> - DisplayChannel *display = DCC_TO_DC(dcc);
>
> if (mask_bitmap && m) {
> - if (display->common.worker->image_compression !=
> SPICE_IMAGE_COMPRESSION_OFF) {
> - SpiceImageCompression save_img_comp =
> - display->common.worker->image_compression;
> - display->common.worker->image_compression =
> SPICE_IMAGE_COMPRESSION_OFF;
> + if (dcc->image_compression != SPICE_IMAGE_COMPRESSION_OFF) {
> + /* todo: pass compression argument */
> + SpiceImageCompression save_img_comp = dcc->image_compression;
> + dcc->image_compression = SPICE_IMAGE_COMPRESSION_OFF;
> fill_bits(dcc, m, mask_bitmap, drawable, FALSE);
> - display->common.worker->image_compression = save_img_comp;
> + dcc->image_compression = save_img_comp;
> } else {
> fill_bits(dcc, m, mask_bitmap, drawable, FALSE);
> }
> @@ -6788,7 +6786,7 @@ static void red_marshall_image(RedChannelClient *rcc,
> SpiceMarshaller *m, ImageI
>
> compress_send_data_t comp_send_data = {0};
>
> - comp_mode = display_channel->common.worker->image_compression;
> + comp_mode = dcc->image_compression;
>
> if (((comp_mode == SPICE_IMAGE_COMPRESSION_AUTO_LZ) ||
> (comp_mode == SPICE_IMAGE_COMPRESSION_AUTO_GLZ)) &&
> !bitmap_has_extra_stride(&bitmap)) {
> @@ -7887,10 +7885,10 @@ static int
> display_channel_handle_migrate_data(RedChannelClient *rcc, uint32_t s
>
> if (migrate_data->low_bandwidth_setting) {
> red_channel_client_ack_set_client_window(rcc,
> WIDE_CLIENT_ACK_WINDOW);
> - if (DCC_TO_WORKER(dcc)->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
> + if (dcc->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
> display_channel->enable_jpeg = TRUE;
> }
> - if (DCC_TO_WORKER(dcc)->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO)
> {
> + if (dcc->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) {
> display_channel->enable_zlib_glz_wrap = TRUE;
> }
> }
> @@ -7958,6 +7956,7 @@ static int
> display_channel_handle_preferred_compression(DisplayChannelClient *dc
> case SPICE_IMAGE_COMPRESSION_GLZ:
> case SPICE_IMAGE_COMPRESSION_OFF:
> display_channel->common.worker->image_compression = pc-
> >image_compression;
> + dcc->image_compression = pc->image_compression;
without this line the preferred compression message would not change the
compression for the connected client, it would change it only for the future
connections.
> return TRUE;
> default:
> spice_warning("preferred-compression: unsupported image compression
> setting");
> @@ -8428,7 +8427,8 @@ static void handle_new_display_channel(RedWorker
> *worker, RedClient *client, Red
> display_channel = worker->display_channel;
> spice_info("add display channel client");
> dcc = dcc_new(display_channel, client, stream, migrate,
> - common_caps, num_common_caps, caps, num_caps);
> + common_caps, num_common_caps, caps, num_caps,
> + worker->image_compression, worker->jpeg_state, worker-
> >zlib_glz_state);
> if (!dcc) {
> return;
> }
> @@ -8443,19 +8443,19 @@ static void handle_new_display_channel(RedWorker
> *worker, RedClient *client, Red
> DISPLAY_FREE_LIST_DEFAULT_SIZE *
> sizeof(SpiceResourceID));
> dcc->send_data.free_list.res_size = DISPLAY_FREE_LIST_DEFAULT_SIZE;
>
> - if (worker->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
> + if (dcc->jpeg_state == SPICE_WAN_COMPRESSION_AUTO) {
> display_channel->enable_jpeg = dcc->common.is_low_bandwidth;
> } else {
> - display_channel->enable_jpeg = (worker->jpeg_state ==
> SPICE_WAN_COMPRESSION_ALWAYS);
> + display_channel->enable_jpeg = (dcc->jpeg_state ==
> SPICE_WAN_COMPRESSION_ALWAYS);
> }
>
> // todo: tune quality according to bandwidth
> display_channel->jpeg_quality = 85;
>
> - if (worker->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) {
> + if (dcc->zlib_glz_state == SPICE_WAN_COMPRESSION_AUTO) {
> display_channel->enable_zlib_glz_wrap = dcc->common.is_low_bandwidth;
> } else {
> - display_channel->enable_zlib_glz_wrap = (worker->zlib_glz_state ==
> + display_channel->enable_zlib_glz_wrap = (dcc->zlib_glz_state ==
> SPICE_WAN_COMPRESSION_ALWAYS
> );
> }
>
More information about the Spice-devel
mailing list