[Mesa-dev] [PATCH 09/29] mesa: Add _mesa_swap2_copy and _mesa_swap4_copy

Iago Toral itoral at igalia.com
Thu Nov 20 00:48:44 PST 2014


On Wed, 2014-11-19 at 14:15 -0600, Patrick Baggett wrote:
> 
> 
> On Tue, Nov 18, 2014 at 3:23 AM, Iago Toral Quiroga
> <itoral at igalia.com> wrote:
>         We have _mesa_swap{2,4} but these do in-place byte-swapping
>         only. The new
>         functions receive an extra parameter so we can swap bytes on a
>         source
>         input array and store the results in a (possibly different)
>         destination
>         array.
>         
> 
> 
> If this is being split into an "in-place" and "different pointers"
> version, I think using the "restrict" keyword would be useful here to
> improve the performance. Then, the in-place one cannot be implemented
> as copy(p,p,n), but the code isn't overly complicated.

I did not know about 'restrict', thanks for the tip!.

It kind of defeats the original idea of not duplicating the code but it
is true that it is not particularly complex anyway, so maybe it is worth
it if Jason agrees with having two versions of the functions instead of
just one in the end. Jason, what do you think?

Iago

> 
>  
>         This is useful to implement byte-swapping in pixel uploads,
>         since in this
>         case we need to swap bytes on the src data which is owned by
>         the
>         application so we can't do an in-place byte swap.
>         ---
>          src/mesa/main/image.c | 25 +++++++++++++++++--------
>          src/mesa/main/image.h | 10 ++++++++--
>          2 files changed, 25 insertions(+), 10 deletions(-)
>         
>         diff --git a/src/mesa/main/image.c b/src/mesa/main/image.c
>         index 4ea5f04..9ad97c5 100644
>         --- a/src/mesa/main/image.c
>         +++ b/src/mesa/main/image.c
>         @@ -41,36 +41,45 @@
>         
>         
>          /**
>         - * Flip the order of the 2 bytes in each word in the given
>         array.
>         + * Flip the order of the 2 bytes in each word in the given
>         array (src) and
>         + * store the result in another array (dst). For in-place
>         byte-swapping this
>         + * function can be called with the same array for src and
>         dst.
>           *
>         - * \param p array.
>         + * \param dst the array where byte-swapped data will be
>         stored.
>         + * \param src the array with the source data we want to
>         byte-swap.
>           * \param n number of words.
>           */
>          void
>         -_mesa_swap2( GLushort *p, GLuint n )
>         +_mesa_swap2_copy( GLushort *dst, GLushort *src, GLuint n )
>          {
>             GLuint i;
>             for (i = 0; i < n; i++) {
>         -      p[i] = (p[i] >> 8) | ((p[i] << 8) & 0xff00);
>         +      dst[i] = (src[i] >> 8) | ((src[i] << 8) & 0xff00);
>             }
>          }
>         
>         
>         
>          /*
>         - * Flip the order of the 4 bytes in each word in the given
>         array.
>         + * Flip the order of the 4 bytes in each word in the given
>         array (src) and
>         + * store the result in another array (dst). For in-place
>         byte-swapping this
>         + * function can be called with the same array for src and
>         dst.
>         + *
>         + * \param dst the array where byte-swapped data will be
>         stored.
>         + * \param src the array with the source data we want to
>         byte-swap.
>         + * \param n number of words.
>           */
>          void
>         -_mesa_swap4( GLuint *p, GLuint n )
>         +_mesa_swap4_copy( GLuint *dst, GLuint *src, GLuint n )
>          {
>             GLuint i, a, b;
>             for (i = 0; i < n; i++) {
>         -      b = p[i];
>         +      b = src[i];
>                a =  (b >> 24)
>                 | ((b >> 8) & 0xff00)
>                 | ((b << 8) & 0xff0000)
>                 | ((b << 24) & 0xff000000);
>         -      p[i] = a;
>         +      dst[i] = a;
>             }
>          }
>         
>         diff --git a/src/mesa/main/image.h b/src/mesa/main/image.h
>         index abd84bf..79c6e68 100644
>         --- a/src/mesa/main/image.h
>         +++ b/src/mesa/main/image.h
>         @@ -33,10 +33,16 @@ struct gl_context;
>          struct gl_pixelstore_attrib;
>         
>          extern void
>         -_mesa_swap2( GLushort *p, GLuint n );
>         +_mesa_swap2_copy( GLushort *dst, GLushort *src, GLuint n );
>         
>          extern void
>         -_mesa_swap4( GLuint *p, GLuint n );
>         +_mesa_swap4_copy( GLuint *dst, GLuint *src, GLuint n );
>         +
>         +static inline void
>         +_mesa_swap2( GLushort *p, GLuint n ) { _mesa_swap2_copy(p, p,
>         n); }
>         +
>         +static inline void
>         +_mesa_swap4( GLuint *p, GLuint n ) { _mesa_swap4_copy(p, p,
>         n); }
>         
>          extern GLintptr
>          _mesa_image_offset( GLuint dimensions,
>         --
>         1.9.1
>         
>         _______________________________________________
>         mesa-dev mailing list
>         mesa-dev at lists.freedesktop.org
>         http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> 




More information about the mesa-dev mailing list