Acked-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx> On Tue, 2016-06-14 at 10:32 +0100, Frediano Ziglio wrote: > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > server/dcc-encoders.c | 121 +++++++++++++++++++++++++++++++++++++++------- > - > server/dcc-encoders.h | 33 +++++++++---- > server/dcc.c | 26 +++++----- > server/display-channel.c | 73 ++-------------------------- > server/display-channel.h | 9 +--- > 5 files changed, 141 insertions(+), 121 deletions(-) > > diff --git a/server/dcc-encoders.c b/server/dcc-encoders.c > index 6aaf954..c79cf58 100644 > --- a/server/dcc-encoders.c > +++ b/server/dcc-encoders.c > @@ -398,10 +398,13 @@ static void image_encoders_init_zlib(ImageEncoders *enc) > } > } > > -void dcc_encoders_init(DisplayChannelClient *dcc) > +void dcc_encoders_init(DisplayChannelClient *dcc, ImageEncoderSharedData > *shared_data) > { > ImageEncoders *enc = &dcc->encoders; > > + spice_assert(shared_data); > + enc->shared_data = shared_data; > + > dcc_init_glz_data(dcc); > image_encoders_init_quic(enc); > image_encoders_init_lz(enc); > @@ -708,15 +711,14 @@ void dcc_release_glz(DisplayChannelClient *dcc) > } > > int image_encoders_compress_quic(ImageEncoders *enc, SpiceImage *dest, > - SpiceBitmap *src, compress_send_data_t* > o_comp_data, > - stat_info_t *stats) > + SpiceBitmap *src, compress_send_data_t* > o_comp_data) > { > QuicData *quic_data = &enc->quic_data; > QuicContext *quic = enc->quic; > volatile QuicImageType type; > int size, stride; > stat_start_time_t start_time; > - stat_start_time_init(&start_time, stats); > + stat_start_time_init(&start_time, &enc->shared_data->quic_stat); > > #ifdef COMPRESS_DEBUG > spice_info("QUIC compress"); > @@ -776,7 +778,7 @@ int image_encoders_compress_quic(ImageEncoders *enc, > SpiceImage *dest, > o_comp_data->comp_buf = quic_data->data.bufs_head; > o_comp_data->comp_buf_size = size << 2; > > - stat_compress_add(stats, start_time, src->stride * src->y, > + stat_compress_add(&enc->shared_data->quic_stat, start_time, src->stride * > src->y, > o_comp_data->comp_buf_size); > return TRUE; > } > @@ -797,8 +799,7 @@ static const LzImageType bitmap_fmt_to_lz_image_type[] = { > > int image_encoders_compress_lz(ImageEncoders *enc, > SpiceImage *dest, SpiceBitmap *src, > - compress_send_data_t* o_comp_data, > - stat_info_t *stats) > + compress_send_data_t* o_comp_data) > { > LzData *lz_data = &enc->lz_data; > LzContext *lz = enc->lz; > @@ -806,7 +807,7 @@ int image_encoders_compress_lz(ImageEncoders *enc, > int size; // size of the compressed data > > stat_start_time_t start_time; > - stat_start_time_init(&start_time, stats); > + stat_start_time_init(&start_time, &enc->shared_data->lz_stat); > > #ifdef COMPRESS_DEBUG > spice_info("LZ LOCAL compress"); > @@ -856,15 +857,13 @@ int image_encoders_compress_lz(ImageEncoders *enc, > o_comp_data->lzplt_palette = dest->u.lz_plt.palette; > } > > - stat_compress_add(stats, start_time, src->stride * src->y, > + stat_compress_add(&enc->shared_data->lz_stat, start_time, src->stride * > src->y, > o_comp_data->comp_buf_size); > return TRUE; > } > > int image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest, > - SpiceBitmap *src, compress_send_data_t* > o_comp_data, > - stat_info_t *jpeg_stats, // FIXME put all > stats in a structure > - stat_info_t *jpeg_alpha_stats) > + SpiceBitmap *src, compress_send_data_t* > o_comp_data) > { > JpegData *jpeg_data = &enc->jpeg_data; > LzData *lz_data = &enc->lz_data; > @@ -879,7 +878,7 @@ int image_encoders_compress_jpeg(ImageEncoders *enc, > SpiceImage *dest, > int stride; > uint8_t *lz_out_start_byte; > stat_start_time_t start_time; > - stat_start_time_init(&start_time, jpeg_alpha_stats); > + stat_start_time_init(&start_time, &enc->shared_data->jpeg_alpha_stat); > > #ifdef COMPRESS_DEBUG > spice_info("JPEG compress"); > @@ -943,7 +942,7 @@ int image_encoders_compress_jpeg(ImageEncoders *enc, > SpiceImage *dest, > o_comp_data->comp_buf_size = jpeg_size; > o_comp_data->is_lossy = TRUE; > > - stat_compress_add(jpeg_stats, start_time, src->stride * src->y, > + stat_compress_add(&enc->shared_data->jpeg_stat, start_time, src- > >stride * src->y, > o_comp_data->comp_buf_size); > return TRUE; > } > @@ -983,21 +982,20 @@ int image_encoders_compress_jpeg(ImageEncoders *enc, > SpiceImage *dest, > o_comp_data->comp_buf = jpeg_data->data.bufs_head; > o_comp_data->comp_buf_size = jpeg_size + alpha_lz_size; > o_comp_data->is_lossy = TRUE; > - stat_compress_add(jpeg_alpha_stats, start_time, src->stride * src->y, > + stat_compress_add(&enc->shared_data->jpeg_alpha_stat, start_time, src- > >stride * src->y, > o_comp_data->comp_buf_size); > return TRUE; > } > > #ifdef USE_LZ4 > int image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest, > - SpiceBitmap *src, compress_send_data_t* > o_comp_data, > - stat_info_t *stats) > + SpiceBitmap *src, compress_send_data_t* > o_comp_data) > { > Lz4Data *lz4_data = &enc->lz4_data; > Lz4EncoderContext *lz4 = enc->lz4; > int lz4_size = 0; > stat_start_time_t start_time; > - stat_start_time_init(&start_time, stats); > + stat_start_time_init(&start_time, &enc->shared_data->lz4_stat); > > #ifdef COMPRESS_DEBUG > spice_info("LZ4 compress"); > @@ -1034,8 +1032,93 @@ int image_encoders_compress_lz4(ImageEncoders *enc, > SpiceImage *dest, > o_comp_data->comp_buf = lz4_data->data.bufs_head; > o_comp_data->comp_buf_size = lz4_size; > > - stat_compress_add(stats, start_time, src->stride * src->y, > + stat_compress_add(&enc->shared_data->lz4_stat, start_time, src->stride * > src->y, > o_comp_data->comp_buf_size); > return TRUE; > } > #endif > + > +void image_encoder_shared_init(ImageEncoderSharedData *shared_data) > +{ > + clockid_t stat_clock = CLOCK_THREAD_CPUTIME_ID; > + > + stat_compress_init(&shared_data->off_stat, "off", stat_clock); > + stat_compress_init(&shared_data->lz_stat, "lz", stat_clock); > + stat_compress_init(&shared_data->glz_stat, "glz", stat_clock); > + stat_compress_init(&shared_data->quic_stat, "quic", stat_clock); > + stat_compress_init(&shared_data->jpeg_stat, "jpeg", stat_clock); > + stat_compress_init(&shared_data->zlib_glz_stat, "zlib", stat_clock); > + stat_compress_init(&shared_data->jpeg_alpha_stat, "jpeg_alpha", > stat_clock); > + stat_compress_init(&shared_data->lz4_stat, "lz4", stat_clock); > +} > + > +void image_encoder_shared_stat_reset(ImageEncoderSharedData *shared_data) > +{ > + stat_reset(&shared_data->off_stat); > + stat_reset(&shared_data->quic_stat); > + stat_reset(&shared_data->lz_stat); > + stat_reset(&shared_data->glz_stat); > + stat_reset(&shared_data->jpeg_stat); > + stat_reset(&shared_data->zlib_glz_stat); > + stat_reset(&shared_data->jpeg_alpha_stat); > + stat_reset(&shared_data->lz4_stat); > +} > + > +#define STAT_FMT "%s\t%8u\t%13.8g\t%12.8g\t%12.8g" > + > +#ifdef COMPRESS_STAT > +static void stat_print_one(const char *name, const stat_info_t *stat) > +{ > + spice_info(STAT_FMT, name, stat->count, > + stat_byte_to_mega(stat->orig_size), > + stat_byte_to_mega(stat->comp_size), > + stat_cpu_time_to_sec(stat->total)); > +} > + > +static void stat_sum(stat_info_t *total, const stat_info_t *stat) > +{ > + total->count += stat->count; > + total->orig_size += stat->orig_size; > + total->comp_size += stat->comp_size; > + total->total += stat->total; > +} > +#endif > + > +void image_encoder_shared_stat_print(const ImageEncoderSharedData > *shared_data) > +{ > +#ifdef COMPRESS_STAT > + /* sum all statistics */ > + stat_info_t total = { > + .count = 0, > + .orig_size = 0, > + .comp_size = 0, > + .total = 0 > + }; > + stat_sum(&total, &shared_data->off_stat); > + stat_sum(&total, &shared_data->quic_stat); > + stat_sum(&total, &shared_data->glz_stat); > + stat_sum(&total, &shared_data->lz_stat); > + stat_sum(&total, &shared_data->jpeg_stat); > + stat_sum(&total, &shared_data->jpeg_alpha_stat); > + stat_sum(&total, &shared_data->lz4_stat); > + > + /* fix for zlib glz */ > + total.total += shared_data->zlib_glz_stat.total; > + if (shared_data->zlib_glz_stat.count) { > + total.comp_size = total.comp_size - shared_data->glz_stat.comp_size + > + shared_data->zlib_glz_stat.comp_size; > + } > + > + spice_info("Method \t count \torig_size(MB)\tenc_size(MB)\tenc_time(s > )"); > + stat_print_one("OFF ", &shared_data->off_stat); > + stat_print_one("QUIC ", &shared_data->quic_stat); > + stat_print_one("GLZ ", &shared_data->glz_stat); > + stat_print_one("ZLIB GLZ ", &shared_data->zlib_glz_stat); > + stat_print_one("LZ ", &shared_data->lz_stat); > + stat_print_one("JPEG ", &shared_data->jpeg_stat); > + stat_print_one("JPEG-RGBA", &shared_data->jpeg_alpha_stat); > + stat_print_one("LZ4 ", &shared_data->lz4_stat); > + spice_info("------------------------------------------------------------- > ------"); > + stat_print_one("Total ", &total); > +#endif > +} > diff --git a/server/dcc-encoders.h b/server/dcc-encoders.h > index 23355f7..4b89cc9 100644 > --- a/server/dcc-encoders.h > +++ b/server/dcc-encoders.h > @@ -35,8 +35,13 @@ typedef struct RedCompressBuf RedCompressBuf; > typedef struct GlzDrawableInstanceItem GlzDrawableInstanceItem; > typedef struct RedGlzDrawable RedGlzDrawable; > typedef struct ImageEncoders ImageEncoders; > +typedef struct ImageEncoderSharedData ImageEncoderSharedData; > > -void dcc_encoders_init (DisplayChannelC > lient *dcc); > +void image_encoder_shared_init(ImageEncoderSharedData *shared_data); > +void image_encoder_shared_stat_reset(ImageEncoderSharedData *shared_data); > +void image_encoder_shared_stat_print(const ImageEncoderSharedData > *shared_data); > + > +void dcc_encoders_init(DisplayChannelClient *dcc, ImageEncoderSharedData > *shared_data); > void image_encoders_free(ImageEncoders *enc); > void dcc_free_glz_drawable (DisplayChannelC > lient *dcc, > RedGlzDrawable > *drawable); > @@ -161,7 +166,20 @@ struct RedGlzDrawable { > DisplayChannelClient *dcc; > }; > > +struct ImageEncoderSharedData { > + stat_info_t off_stat; > + stat_info_t lz_stat; > + stat_info_t glz_stat; > + stat_info_t quic_stat; > + stat_info_t jpeg_stat; > + stat_info_t zlib_glz_stat; > + stat_info_t jpeg_alpha_stat; > + stat_info_t lz4_stat; > +}; > + > struct ImageEncoders { > + ImageEncoderSharedData *shared_data; > + > QuicData quic_data; > QuicContext *quic; > > @@ -192,19 +210,14 @@ typedef struct compress_send_data_t { > } compress_send_data_t; > > int image_encoders_compress_quic(ImageEncoders *enc, SpiceImage *dest, > - SpiceBitmap *src, compress_send_data_t* > o_comp_data, > - stat_info_t *stats); > + SpiceBitmap *src, compress_send_data_t* > o_comp_data); > int image_encoders_compress_lz(ImageEncoders *enc, > SpiceImage *dest, SpiceBitmap *src, > - compress_send_data_t* o_comp_data, > - stat_info_t *stats); > + compress_send_data_t* o_comp_data); > int image_encoders_compress_jpeg(ImageEncoders *enc, SpiceImage *dest, > - SpiceBitmap *src, compress_send_data_t* > o_comp_data, > - stat_info_t *jpeg_stats, > - stat_info_t *jpeg_alpha_stats); > + SpiceBitmap *src, compress_send_data_t* > o_comp_data); > int image_encoders_compress_lz4(ImageEncoders *enc, SpiceImage *dest, > - SpiceBitmap *src, compress_send_data_t* > o_comp_data, > - stat_info_t *stats); > + SpiceBitmap *src, compress_send_data_t* > o_comp_data); > > #define RED_RELEASE_BUNCH_SIZE 64 > > diff --git a/server/dcc.c b/server/dcc.c > index 7724e11..8f44e64 100644 > --- a/server/dcc.c > +++ b/server/dcc.c > @@ -396,7 +396,7 @@ DisplayChannelClient *dcc_new(DisplayChannel *display, > ring_init(&dcc->glz_drawables_inst_to_free); > pthread_mutex_init(&dcc->glz_drawables_inst_to_free_lock, NULL); > > - dcc_encoders_init(dcc); > + dcc_encoders_init(dcc, &display->encoder_globals); > > return dcc; > } > @@ -709,7 +709,7 @@ static int dcc_compress_image_glz(DisplayChannelClient > *dcc, > { > DisplayChannel *display_channel = DCC_TO_DC(dcc); > stat_start_time_t start_time; > - stat_start_time_init(&start_time, &display_channel->zlib_glz_stat); > + stat_start_time_init(&start_time, &display_channel- > >encoder_globals.zlib_glz_stat); > spice_assert(bitmap_fmt_is_rgb(src->format)); > GlzData *glz_data = &dcc->glz_data; > ZlibData *zlib_data; > @@ -740,12 +740,12 @@ static int dcc_compress_image_glz(DisplayChannelClient > *dcc, > glz_drawable_instance, > &glz_drawable_instance->context); > > - stat_compress_add(&display_channel->glz_stat, start_time, src->stride * > src->y, glz_size); > + stat_compress_add(&display_channel->encoder_globals.glz_stat, start_time, > src->stride * src->y, glz_size); > > if (!display_channel->enable_zlib_glz_wrap || (glz_size < > MIN_GLZ_SIZE_FOR_ZLIB)) { > goto glz; > } > - stat_start_time_init(&start_time, &display_channel->zlib_glz_stat); > + stat_start_time_init(&start_time, &display_channel- > >encoder_globals.zlib_glz_stat); > zlib_data = &dcc->encoders.zlib_data; > > encoder_data_init(&zlib_data->data); > @@ -772,7 +772,7 @@ static int dcc_compress_image_glz(DisplayChannelClient > *dcc, > o_comp_data->comp_buf = zlib_data->data.bufs_head; > o_comp_data->comp_buf_size = zlib_size; > > - stat_compress_add(&display_channel->zlib_glz_stat, start_time, glz_size, > zlib_size); > + stat_compress_add(&display_channel->encoder_globals.zlib_glz_stat, > start_time, glz_size, zlib_size); > return TRUE; > glz: > dest->descriptor.type = SPICE_IMAGE_TYPE_GLZ_RGB; > @@ -878,7 +878,7 @@ int dcc_compress_image(DisplayChannelClient *dcc, > stat_start_time_t start_time; > int success = FALSE; > > - stat_start_time_init(&start_time, &display_channel->off_stat); > + stat_start_time_init(&start_time, &display_channel- > >encoder_globals.off_stat); > > image_compression = get_compression_for_bitmap(src, dcc- > >image_compression, drawable); > switch (image_compression) { > @@ -887,13 +887,10 @@ int dcc_compress_image(DisplayChannelClient *dcc, > case SPICE_IMAGE_COMPRESSION_QUIC: > if (can_lossy && display_channel->enable_jpeg && > (src->format != SPICE_BITMAP_FMT_RGBA || > !bitmap_has_extra_stride(src))) { > - success = image_encoders_compress_jpeg(&dcc->encoders, dest, src, > o_comp_data, > - &display_channel- > >jpeg_stat, > - &display_channel- > >jpeg_alpha_stat); > + success = image_encoders_compress_jpeg(&dcc->encoders, dest, src, > o_comp_data); > break; > } > - success = image_encoders_compress_quic(&dcc->encoders, dest, src, > o_comp_data, > - &display_channel->quic_stat); > + success = image_encoders_compress_quic(&dcc->encoders, dest, src, > o_comp_data); > break; > case SPICE_IMAGE_COMPRESSION_GLZ: > if ((src->x * src->y) < glz_enc_dictionary_get_size(dcc->glz_dict- > >dict)) { > @@ -914,14 +911,13 @@ int dcc_compress_image(DisplayChannelClient *dcc, > case SPICE_IMAGE_COMPRESSION_LZ4: > if (red_channel_client_test_remote_cap(&dcc->common.base, > SPICE_DISPLAY_CAP_LZ4_COMPRESS > ION)) { > - success = image_encoders_compress_lz4(&dcc->encoders, dest, src, > o_comp_data, > - &display_channel- > >lz4_stat); > + success = image_encoders_compress_lz4(&dcc->encoders, dest, src, > o_comp_data); > break; > } > #endif > lz_compress: > case SPICE_IMAGE_COMPRESSION_LZ: > - success = image_encoders_compress_lz(&dcc->encoders, dest, src, > o_comp_data, &display_channel->lz_stat); > + success = image_encoders_compress_lz(&dcc->encoders, dest, src, > o_comp_data); > if (success && !bitmap_fmt_is_rgb(src->format)) { > dcc_palette_cache_palette(dcc, dest->u.lz_plt.palette, &(dest- > >u.lz_plt.flags)); > } > @@ -932,7 +928,7 @@ lz_compress: > > if (!success) { > uint64_t image_size = src->stride * src->y; > - stat_compress_add(&display_channel->off_stat, start_time, image_size, > image_size); > + stat_compress_add(&display_channel->encoder_globals.off_stat, > start_time, image_size, image_size); > } > > return success; > diff --git a/server/display-channel.c b/server/display-channel.c > index 2888cad..6ec8692 100644 > --- a/server/display-channel.c > +++ b/server/display-channel.c > @@ -38,75 +38,16 @@ void display_channel_compress_stats_reset(DisplayChannel > *display) > { > spice_return_if_fail(display); > > - stat_reset(&display->off_stat); > - stat_reset(&display->quic_stat); > - stat_reset(&display->lz_stat); > - stat_reset(&display->glz_stat); > - stat_reset(&display->jpeg_stat); > - stat_reset(&display->zlib_glz_stat); > - stat_reset(&display->jpeg_alpha_stat); > - stat_reset(&display->lz4_stat); > + image_encoder_shared_stat_reset(&display->encoder_globals); > } > > -#define STAT_FMT "%s\t%8u\t%13.8g\t%12.8g\t%12.8g" > - > -#ifdef COMPRESS_STAT > -static void stat_print_one(const char *name, const stat_info_t *stat) > -{ > - spice_info(STAT_FMT, name, stat->count, > - stat_byte_to_mega(stat->orig_size), > - stat_byte_to_mega(stat->comp_size), > - stat_cpu_time_to_sec(stat->total)); > -} > - > -static void stat_sum(stat_info_t *total, const stat_info_t *stat) > -{ > - total->count += stat->count; > - total->orig_size += stat->orig_size; > - total->comp_size += stat->comp_size; > - total->total += stat->total; > -} > -#endif > - > void display_channel_compress_stats_print(const DisplayChannel > *display_channel) > { > - spice_return_if_fail(display_channel); > - > #ifdef COMPRESS_STAT > - /* sum all statistics */ > - stat_info_t total = { > - .count = 0, > - .orig_size = 0, > - .comp_size = 0, > - .total = 0 > - }; > - stat_sum(&total, &display_channel->off_stat); > - stat_sum(&total, &display_channel->quic_stat); > - stat_sum(&total, &display_channel->glz_stat); > - stat_sum(&total, &display_channel->lz_stat); > - stat_sum(&total, &display_channel->jpeg_stat); > - stat_sum(&total, &display_channel->jpeg_alpha_stat); > - stat_sum(&total, &display_channel->lz4_stat); > - > - /* fix for zlib glz */ > - total.total += display_channel->zlib_glz_stat.total; > - if (display_channel->enable_zlib_glz_wrap) { > - total.comp_size = total.comp_size - display_channel- > >glz_stat.comp_size + > - display_channel->zlib_glz_stat.comp_size; > - } > + spice_return_if_fail(display_channel); > > spice_info("==> Compression stats for display %u", display_channel- > >common.base.id); > - spice_info("Method \t count \torig_size(MB)\tenc_size(MB)\tenc_time(s > )"); > - stat_print_one("OFF ", &display_channel->off_stat); > - stat_print_one("QUIC ", &display_channel->quic_stat); > - stat_print_one("GLZ ", &display_channel->glz_stat); > - stat_print_one("ZLIB GLZ ", &display_channel->zlib_glz_stat); > - stat_print_one("LZ ", &display_channel->lz_stat); > - stat_print_one("JPEG ", &display_channel->jpeg_stat); > - stat_print_one("JPEG-RGBA", &display_channel->jpeg_alpha_stat); > - stat_print_one("LZ4 ", &display_channel->lz4_stat); > - spice_info("------------------------------------------------------------- > ------"); > - stat_print_one("Total ", &total); > + image_encoder_shared_stat_print(&display_channel->encoder_globals); > #endif > } > > @@ -1984,13 +1925,7 @@ DisplayChannel* display_channel_new(SpiceServer *reds, > RedWorker *worker, > display->non_cache_counter = stat_add_counter(reds, channel->stat, > "non_cache", TRUE); > #endif > - stat_compress_init(&display->lz_stat, "lz", stat_clock); > - stat_compress_init(&display->glz_stat, "glz", stat_clock); > - stat_compress_init(&display->quic_stat, "quic", stat_clock); > - stat_compress_init(&display->jpeg_stat, "jpeg", stat_clock); > - stat_compress_init(&display->zlib_glz_stat, "zlib", stat_clock); > - stat_compress_init(&display->jpeg_alpha_stat, "jpeg_alpha", stat_clock); > - stat_compress_init(&display->lz4_stat, "lz4", stat_clock); > + image_encoder_shared_init(&display->encoder_globals); > > display->n_surfaces = n_surfaces; > display->renderer = RED_RENDERER_INVALID; > diff --git a/server/display-channel.h b/server/display-channel.h > index 16ea709..db1cdba 100644 > --- a/server/display-channel.h > +++ b/server/display-channel.h > @@ -216,14 +216,7 @@ struct DisplayChannel { > uint64_t *add_to_cache_counter; > uint64_t *non_cache_counter; > #endif > - stat_info_t off_stat; > - stat_info_t lz_stat; > - stat_info_t glz_stat; > - stat_info_t quic_stat; > - stat_info_t jpeg_stat; > - stat_info_t zlib_glz_stat; > - stat_info_t jpeg_alpha_stat; > - stat_info_t lz4_stat; > + ImageEncoderSharedData encoder_globals; > }; > > static inline int get_stream_id(DisplayChannel *display, Stream *stream) _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel