[Spice-devel] [PATCH 12/15] worker: don't use weird RedCompressedBuf nbytes shifting
Marc-André Lureau
mlureau at redhat.com
Mon Nov 9 09:35:27 PST 2015
----- Original Message -----
> >
> > From: Marc-André Lureau <marcandre.lureau at gmail.com>
> >
> > ---
> > server/display-channel.h | 3 +--
> > server/red_worker.c | 18 +++++++++---------
> > 2 files changed, 10 insertions(+), 11 deletions(-)
> >
> > diff --git a/server/display-channel.h b/server/display-channel.h
> > index 7c62a62..f1f4e3a 100644
> > --- a/server/display-channel.h
> > +++ b/server/display-channel.h
> > @@ -70,10 +70,9 @@
> > #define NUM_STREAMS 50
> > #define NUM_SURFACES 10000
> >
> > -#define RED_COMPRESS_BUF_SIZE (1024 * 64)
> > typedef struct RedCompressBuf RedCompressBuf;
> > struct RedCompressBuf {
> > - uint32_t buf[RED_COMPRESS_BUF_SIZE / 4];
> > + uint8_t buf[64 * 1024];
> > RedCompressBuf *next;
> > RedCompressBuf *send_next;
> > };
>
> Note that adding fields before buf could make buf not aligned to 4 bytes
> while we want it aligned to 4 bytes. Quic code for portability require it.
> On GCC we could force the alignment with an attribute.
> Another portable way to make it aligned would be
Note g_slice_alloc() is aligned by default.
>
> union {
> uint8_t bytes[RED_COMPRESS_BUF_SIZE];
> uint32_t words[RED_COMPRESS_BUF_SIZE / 4];
> } buf;
>
looks good to me too.
> > diff --git a/server/red_worker.c b/server/red_worker.c
> > index cf72100..83e0fa0 100644
> > --- a/server/red_worker.c
> > +++ b/server/red_worker.c
> > @@ -3888,7 +3888,7 @@ static void glz_usr_free(GlzEncoderUsrContext *usr,
> > void *ptr)
> > free(ptr);
> > }
> >
> > -static inline int encoder_usr_more_space(EncoderData *enc_data, uint32_t
> > **io_ptr)
> > +static int encoder_usr_more_space(EncoderData *enc_data, uint8_t **io_ptr)
> > {
>
> The declaration suggests io_ptr can be one byte aligned but this is false.
> A comment should be enough.
>
> > RedCompressBuf *buf;
> >
> > @@ -3899,31 +3899,31 @@ static inline int
> > encoder_usr_more_space(EncoderData
> > *enc_data, uint32_t **io_pt
> > enc_data->bufs_tail = buf;
> > buf->send_next = NULL;
> > *io_ptr = buf->buf;
> > - return sizeof(buf->buf) >> 2;
> > + return sizeof(buf->buf);
> > }
> >
>
> to remove just the shift here we could use G_N_ELEMENTS macro.
Why not
>
> > static int quic_usr_more_space(QuicUsrContext *usr, uint32_t **io_ptr, int
> > rows_completed)
> > {
> > EncoderData *usr_data = &(((QuicData *)usr)->data);
> > - return encoder_usr_more_space(usr_data, io_ptr);
> > + return encoder_usr_more_space(usr_data, (uint8_t **)io_ptr) /
> > sizeof(uint32_t);
> > }
> >
> > static int lz_usr_more_space(LzUsrContext *usr, uint8_t **io_ptr)
> > {
> > EncoderData *usr_data = &(((LzData *)usr)->data);
> > - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> > + return encoder_usr_more_space(usr_data, io_ptr);
> > }
> >
> > static int glz_usr_more_space(GlzEncoderUsrContext *usr, uint8_t **io_ptr)
> > {
> > EncoderData *usr_data = &(((GlzData *)usr)->data);
> > - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> > + return encoder_usr_more_space(usr_data, io_ptr);
> > }
> >
> > static int jpeg_usr_more_space(JpegEncoderUsrContext *usr, uint8_t
> > **io_ptr)
> > {
> > EncoderData *usr_data = &(((JpegData *)usr)->data);
> > - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> > + return encoder_usr_more_space(usr_data, io_ptr);
> > }
> >
> > #ifdef USE_LZ4
> > @@ -3937,7 +3937,7 @@ static int lz4_usr_more_space(Lz4EncoderUsrContext
> > *usr, uint8_t **io_ptr)
> > static int zlib_usr_more_space(ZlibEncoderUsrContext *usr, uint8_t
> > **io_ptr)
> > {
> > EncoderData *usr_data = &(((ZlibData *)usr)->data);
> > - return (encoder_usr_more_space(usr_data, (uint32_t **)io_ptr) << 2);
> > + return encoder_usr_more_space(usr_data, io_ptr);
> > }
> >
> > static inline int encoder_usr_more_lines(EncoderData *enc_data, uint8_t
> > **lines)
> > @@ -4591,8 +4591,8 @@ static inline int
> > red_quic_compress_image(DisplayChannelClient *dcc, SpiceImage
> > stride = -src->stride;
> > }
> > size = quic_encode(quic, type, src->x, src->y, NULL, 0, stride,
> > - quic_data->data.bufs_head->buf,
> > - sizeof(quic_data->data.bufs_head->buf) >> 2);
> > + (uint32_t*)quic_data->data.bufs_head->buf,
> > + sizeof(quic_data->data.bufs_head->buf) /
> > sizeof(uint32_t));
> >
>
> Here G_N_ELEMENTS could be used. With the union it would became
>
> size = quic_encode(quic, type, src->x, src->y, NULL, 0, stride,
> quic_data->data.bufs_head->buf.words,
> G_N_ELEMENTS(quic_data->data.bufs_head->buf.words);
>
>
> > // the compressed buffer is bigger than the original data
> > if ((size << 2) > (src->y * src->stride)) {
> > --
> > 2.4.3
> >
>
> Beside the alignment I think other stuff are just style so very
> personal opinions.
>
> I won't suggest some definitive code, let's see other comments.
>
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list